<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Andrew Lilley Brinker - Miniblog</title>
    <subtitle>I work on software security at MITRE, including serving as amember of the OmniBOR Working Group, where I lead development of the Rustimplementation, and as the project manager for Hipcheck, a tool forautomated supply chain risk assessment of software packages.
</subtitle>
    <link rel="self" type="application/atom+xml" href="https://www.alilleybrinker.com/mini/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-02-05T00:00:00+00:00</updated>
    <id>https://www.alilleybrinker.com/mini/atom.xml</id>
    <entry xml:lang="en">
        <title>Move Over Gas Town, Claude Has First-Party Agent Orchestration</title>
        <published>2026-02-05T00:00:00+00:00</published>
        <updated>2026-02-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/move-over-gas-town/"/>
        <id>https://www.alilleybrinker.com/mini/move-over-gas-town/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/move-over-gas-town/">&lt;p&gt;While &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steve-yegge.medium.com&#x2F;welcome-to-gas-town-4f25ee16dd04&quot;&gt;Gas Town&lt;&#x2F;a&gt;, the hallucinatory fever dream &#x2F; slopware project by
Steve Yegge, was first on the scene for agent orchestration, it was never going
to be the end. Gas Town, as Yegge himself admitted, is an experiment intended
to explore the limits and problems of agent orchestration without concern for
cost or quality. It would never work as a serious professional tool.&lt;&#x2F;p&gt;
&lt;p&gt;Today, Anthropic announced an experimental alternative for agent orchestration,
which they call &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;agent-teams&quot;&gt;“Agent Teams.”&lt;&#x2F;a&gt; This is actually the &lt;em&gt;second&lt;&#x2F;em&gt;
system Claude has grown for orchestration, the first being
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;code.claude.com&#x2F;docs&#x2F;en&#x2F;sub-agents&quot;&gt;“subagents.”&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In Agent Teams, one agent oversees a collection of worker agents. The worker
agents all maintain their own independent context, and can message between
each other to coordinate work. Per Anthropic’s documentation, Agent Teams
are best deployed in contexts where they can work on independent efforts on
a shared codebase without overlapping.&lt;&#x2F;p&gt;
&lt;p&gt;By contrast, subagents work serially, and share context, with each subagent
being specialized for specific tasks. They’re intended to be used in contexts
where you have a single problem or series of tasks which benefit from
specialization, but which require coordination and shared state between agents.
Subagents, unlike Agent Teams, are not considered experimental.&lt;&#x2F;p&gt;
&lt;p&gt;I doubt that Agent Teams will be the final word from Anthropic on multi-agent
orchestration, but I am both glad to see Anthropic pursuing a first-party
solution in this space, and unsurprised.&lt;&#x2F;p&gt;
&lt;p&gt;Back in the era of containers, Docker had first-mover advantage and were in
position to develop a strong first-party solution for container orchestration.
Unfortunately, despite efforts in that area, they were unable to satisfy the
needs of their users, leaving room for Kubernetes to emerge and take pole
position, which limited Docker, Inc.’s ability to monetize that opportunity.&lt;&#x2F;p&gt;
&lt;p&gt;With that well-known example in mind, it was hard to imagine that Anthropic
would risk missing the train on agent orchestration by not developing
first-party solutions.&lt;&#x2F;p&gt;
&lt;p&gt;It’s doubtful this is the last option we’ll see in the agent orchestration
space. Users and AI companies are still figuring out the pitfalls and what
seems to work well for coordinating the work of multiple agents. As we’ve seen
with Gas Town, solutions which involve the application of ever more specialized
agents can become quite expensive!&lt;&#x2F;p&gt;
&lt;p&gt;Agent Teams certainly have fewer unique agent roles compared to Gas Town,
and we’ll see what impact (if any) that has on the ability of the agents to
remain on-task over time and to coordinate on work.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rust&#x27;s Culture of Semantic Precision</title>
        <published>2026-01-16T00:00:00+00:00</published>
        <updated>2026-01-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/rusts-culture-of-semantic-precision/"/>
        <id>https://www.alilleybrinker.com/mini/rusts-culture-of-semantic-precision/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/rusts-culture-of-semantic-precision/">&lt;p&gt;Last week, LWN published &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lwn.net&#x2F;SubscriberLink&#x2F;1053142&#x2F;8ec93e58d5d3cc06&#x2F;&quot;&gt;“&lt;code&gt;READ_ONCE()&lt;&#x2F;code&gt;, &lt;code&gt;WRITE_ONCE()&lt;&#x2F;code&gt;, but not for Rust”&lt;&#x2F;a&gt;,
which described an issue encountered as part of integrating more Rust into
the Linux kernel: namely that the &lt;code&gt;READ_ONCE&lt;&#x2F;code&gt; and &lt;code&gt;WRITE_ONCE&lt;&#x2F;code&gt; macros are in
practice used for diverging purposes in different contexts, implicitly encoding
an inconsistent set of semantic guarantees. The article then describes how the
Rust contributors to Linux are working to determine how to more accurately
express the &lt;em&gt;specific&lt;&#x2F;em&gt; semantic guarantees associated with the Rust-side of
APIs which use these macros on the C-side.&lt;&#x2F;p&gt;
&lt;p&gt;This situation, of identifying an API which is implicitly encoding multiple
distinct semantic guarantees, and thereafter wanting to disentangle them, is
a familiar one for Rust developers. One little-discussed cultural norm in the
Rust ecosystem is that APIs should be designed to encode semantic guarantees
&lt;em&gt;as precisely as possible&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This is shown in things like the design of container types, such as Rust’s
various “cell” types (&lt;code&gt;Cell&lt;&#x2F;code&gt;, &lt;code&gt;RefCell&lt;&#x2F;code&gt;, &lt;code&gt;OnceCell&lt;&#x2F;code&gt;, etc.), as well as
pointer-associated types such as &lt;code&gt;Unique&lt;&#x2F;code&gt; (internal to the Rust standard
library, where it is used heavily) or &lt;code&gt;NonNull&lt;&#x2F;code&gt; (part of the &lt;code&gt;std::ptr&lt;&#x2F;code&gt; API).
As Manish Goregaokar described in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;manishearth.github.io&#x2F;blog&#x2F;2015&#x2F;05&#x2F;27&#x2F;wrapper-types-in-rust-choosing-your-guarantees&#x2F;&quot;&gt;“Wrapper Types in Rust: Choosing Your
Guarantees”&lt;&#x2F;a&gt;, Rust tries to disentangle unique semantic guarantees
which users can then compose together to express &lt;em&gt;precisely&lt;&#x2F;em&gt; what they need.&lt;&#x2F;p&gt;
&lt;p&gt;It also appears in Rust’s ongoing discussion around &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;smallcultfollowing.com&#x2F;babysteps&#x2F;blog&#x2F;2025&#x2F;10&#x2F;07&#x2F;the-handle-trait&#x2F;&quot;&gt;amending the &lt;code&gt;Copy&lt;&#x2F;code&gt; &#x2F;
&lt;code&gt;Clone&lt;&#x2F;code&gt; trait hierarchy to enable more precision&lt;&#x2F;a&gt;. &lt;code&gt;Copy&lt;&#x2F;code&gt; is a trait
intended for types which are trivially-copyable, meaning their full contents
can be copied with a single &lt;code&gt;memcpy&lt;&#x2F;code&gt;. &lt;code&gt;Clone&lt;&#x2F;code&gt; is intended for more “expensive”
copies, for example copies which require duplication of data on the heap and
adjustment of pointers to point to the copied data. Over time, Rust developers
have identified types with a different sort of copy semantics, such as &lt;code&gt;Rc&lt;&#x2F;code&gt; or
&lt;code&gt;Arc&lt;&#x2F;code&gt;, where cloning the data in fact means cloning &lt;em&gt;the handle&lt;&#x2F;em&gt; to the
underlying data, not the data itself.&lt;&#x2F;p&gt;
&lt;p&gt;The Rust community’s desire for precise semantics, in the long run, leads to
more robust software systems. In the short run, as the Linux devs are
encountering, it can be challenging to introduce greater semantic precision in
systems which were previously more ambiguous about guarantees and requirements.
Personally, I’m glad Rust has this norm, and it’s something I find appealing
about Rust as a &lt;em&gt;culture&lt;&#x2F;em&gt;, not just a language, and I remain optimistic that
Linux will be better off because of it.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gas Town is not Urbit</title>
        <published>2026-01-15T00:00:00+00:00</published>
        <updated>2026-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/gas-town-and-urbit/"/>
        <id>https://www.alilleybrinker.com/mini/gas-town-and-urbit/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/gas-town-and-urbit/">&lt;p&gt;Yesterday I wrote &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.alilleybrinker.com&#x2F;mini&#x2F;gas-town-decoded&#x2F;&quot;&gt;“Gas Town Decoded,”&lt;&#x2F;a&gt; a brief guide to the insular
language Steve Yegge uses to describe &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steve-yegge.medium.com&#x2F;welcome-to-gas-town-4f25ee16dd04&quot;&gt;Gas Town&lt;&#x2F;a&gt;. Gas Town, for those
out of the loop, is Yegge’s attempt to build a system for AI agent
orchestration.&lt;&#x2F;p&gt;
&lt;p&gt;Today, Steve &lt;em&gt;Klabnik&lt;&#x2F;em&gt; wrote &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steveklabnik.com&#x2F;writing&#x2F;how-to-think-about-gas-town&#x2F;&quot;&gt;“How to think about Gas Town,”&lt;&#x2F;a&gt; which
analyzes why Gas Town chose to use such strange language in the first place.
It’s a great piece, and one with which I agree. You should read it!&lt;&#x2F;p&gt;
&lt;p&gt;In discussions around Gas Town, I and many others have noted the parallels to
another infamous software system that used insular language: Urbit.&lt;&#x2F;p&gt;
&lt;p&gt;While it’s true that both Gas Town and Urbit invent their own language
specific to their projects, they are otherwise &lt;em&gt;extremely&lt;&#x2F;em&gt; different. Urbit
is fascist, Gas Town is not.&lt;&#x2F;p&gt;
&lt;p&gt;As Klabnik describes in his piece, Gas Town’s insular language is used by
Yegge to signpost the experimental nature of the project and to discourage
production use. Klabnik argues Yegge did this because, as someone who is
programmer-famous, he knows anything he works on will be taken seriously by
others.&lt;&#x2F;p&gt;
&lt;p&gt;Urbit, on the other hand, used insular language to create a sense of
exclusivity and complexity, as part of Curtis Yarvin’s attempt to gain an
audience for his fascist political ideas. Throughout the 2010’s, Yarvin
leveraged Urbit to gain entry to programmer forums and conferences, where he
could then spread his politics alongside his software.&lt;&#x2F;p&gt;
&lt;p&gt;So, while it’s true both Gas Town and Urbit use insular language, we shouldn’t
consider them similar beyond that.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gas Town Decoded</title>
        <published>2026-01-14T00:00:00+00:00</published>
        <updated>2026-01-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/gas-town-decoded/"/>
        <id>https://www.alilleybrinker.com/mini/gas-town-decoded/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/gas-town-decoded/">&lt;p&gt;On January 1st, Steve Yegge published &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steve-yegge.medium.com&#x2F;welcome-to-gas-town-4f25ee16dd04&quot;&gt;“Welcome to Gas Town,”&lt;&#x2F;a&gt; an
introduction to his new AI agent orchestration tool written in a loose and
chaotic mode, and accompanied by AI-generated images depicting a fictional
industrial city populated with weasels (yes, really).&lt;&#x2F;p&gt;
&lt;p&gt;Reactions were swift, mostly agog at the scale and hubris of such a
(self-admittedly) wasteful and obscenely &lt;em&gt;expensive&lt;&#x2F;em&gt; system, and alternately
confused or amazed at the amount of new, &lt;em&gt;insular language&lt;&#x2F;em&gt; tailor-made to
describe it.&lt;&#x2F;p&gt;
&lt;p&gt;In the interest of making Gas Town intelligible (because, despite the prose,
the idea of agent orchestration it describes will be important), I’d like to
share a quick decoder for the many new terms Steve introduces. His article
itself offers definitions, but those definitions reuse his insular terms,
making by-hand decoding tedious. Here, I’ve done the work for you.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Steve’s Term&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Real-World Definition&lt;&#x2F;th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Alternative Term&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Town&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Top-level folder containing your individual projects. The &lt;code&gt;gt&lt;&#x2F;code&gt; binary manages projects under this folder.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Workspace&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Rig&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;A project. It’s a folder tracked by a unique Git repository within your workspace.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Project&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Overseer&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;The user (you). You have an “inbox” to receive notifications from agents in your projects.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;User&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Mayor&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;The managing agent for a project. Usually you send this agent messages, and it coordinates the work of other agents in the project.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Manager Agent&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Polecat&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Worker agent, taking commands from the mayor, doing some work, submitting a Merge Request, and then stopping.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Worker Agent&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Refinery&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Merge agent, who coordinates and makes decisions about merge requests coming from Worker Agents.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Merge Agent&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Witness&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Fixer agent, that watches the worker agents and tries to fix any that are stuck.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Fixer Agent&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Deacon&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Maintenance agent, runs a consistent workflow in a loop, unlike “worker agents” who do arbitrary tasks and then die.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Maintenance Manager Agent&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Dogs&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Maintenance worker agents who do cleanup tasks, directed by the Maintenance Agent.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Maintenance Worker Agents&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Boot the Dog&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Maintenance Manager checker agent, just checks on the Maintenance Manager Agent periodically to see if it needs a reboot or anything else.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Maintenance Manager Checker Agent&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Crew&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Persistent Worker Agents, which you talk to directly (not through the Mayor), and which persist after their tasks are done, to be reused. These are per-Project.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Persistent Worker Agents.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Beads&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;System for tracking work history across the system.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Work Tracker&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Rig Beads&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Project-specific work, tracked in the Work Tracker.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Project Work&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Town Beads&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Whole-workspace work, tracked in the Work Tracker.&lt;&#x2F;td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Workspace Work&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Even with these definitions and alternative terms, Gas Town is still a bit of
a mess, with watchers-on-watchers at times (do we really need a Maintenance
Manager Checker Agent?). That said, hopefully this decoder at least makes
understanding &lt;em&gt;what Gas Town is&lt;&#x2F;em&gt; easier.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Passkey PRFs and the Passkey Loss Blast Radius</title>
        <published>2026-01-14T00:00:00+00:00</published>
        <updated>2026-01-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/passkey-prf-risks/"/>
        <id>https://www.alilleybrinker.com/mini/passkey-prf-risks/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/passkey-prf-risks/">&lt;p&gt;Yesterday, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arstechnica.com&#x2F;security&#x2F;2026&#x2F;01&#x2F;signal-creator-moxie-marlinspike-wants-to-do-for-ai-what-he-did-for-messaging&#x2F;&quot;&gt;Ars Technica reported&lt;&#x2F;a&gt; on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;confer.to&#x2F;&quot;&gt;Confer&lt;&#x2F;a&gt;, an AI company
created by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Moxie_Marlinspike&quot;&gt;Moxie Marlinspike&lt;&#x2F;a&gt;, who also created the secure messaging
app&#x2F;protocol &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;signal.org&#x2F;&quot;&gt;Signal&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In Confer’s blog post &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;confer.to&#x2F;blog&#x2F;2025&#x2F;12&#x2F;passkey-encryption&#x2F;&quot;&gt;“Making end-to-end encrypted AI chat feel like logging
in,”&lt;&#x2F;a&gt; Moxie writes about how Confer uses passkey PRFs to encrypt
chats. As the blog post describes, the PRF extension allows Confer to derive
a new key deterministically from a user’s passkey, so they can then use this
new key to encrypt other material.&lt;&#x2F;p&gt;
&lt;p&gt;While passkey PRFs are powerful, and have legitimate uses, they carry a real
risk: &lt;strong&gt;passkey PRFs increase the blast radius of passkey loss.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;When a passkey PRF is used to encrypt material associated with a user, and
that user loses their passkey, the encrypted material is also lost. Today, if
a user loses a passkey used to log in to a service, they can usually recover
their account &lt;em&gt;somehow&lt;&#x2F;em&gt;, but if materials tied to that account were encrypted
with a passkey PRF, those materials are gone even when the user regains account
access.&lt;&#x2F;p&gt;
&lt;p&gt;Passkey loss can happen for many reasons! Loss of a device or hardware token
for keys that aren’t synced, lockout from a platform (such as an Apple ID)
for passkeys kept in a platform-specific keystore, or even a user’s death for
passkeys whose decryption mechanism expects biometrics. The fact that people
have repeatedly lost cryptocurrency keys worth enormous sums of money shows that
even with strong financial incentives, mistakes happen and keys get lost.&lt;&#x2F;p&gt;
&lt;p&gt;So while passkey PRFs are &lt;em&gt;powerful&lt;&#x2F;em&gt; (they let you tie encryption material to
an authenticated user’s private key), they also require platforms to prepare
users for what they’d lose if their passkey is lost.&lt;&#x2F;p&gt;
&lt;p&gt;The Confer article lists alternatives, such as giving the user a long passphrase
to remember (which many will forget or store insecurely), encrypting based on a
user’s password (which is phishable), or using a device-key (which blocks
cross-device access). These trade-offs make passkey PRFs compelling! It’s just
worth remembering it’s not a free lunch.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>&#x27;Memory Safety for Skeptics&#x27; in the ACM Queue</title>
        <published>2025-12-01T00:00:00+00:00</published>
        <updated>2025-12-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/memory-safety-for-skeptics-in-the-acm-queue/"/>
        <id>https://www.alilleybrinker.com/mini/memory-safety-for-skeptics-in-the-acm-queue/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/memory-safety-for-skeptics-in-the-acm-queue/">&lt;p&gt;I’m a bit late to sharing it here, but &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;queue.acm.org&#x2F;detail.cfm?id=3773095&quot;&gt;an article of mine&lt;&#x2F;a&gt; was in the
November issue of the ACM Queue! Called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;queue.acm.org&#x2F;detail.cfm?id=3773095&quot;&gt;“Memory Safety for Skeptics,”&lt;&#x2F;a&gt;
it argues for why memory safety is worth pursuing amid competing priorities. It
was a lot of fun to write, and is purposefully &lt;em&gt;not&lt;&#x2F;em&gt; an article about rewriting
codebases in Rust. Check it out!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tracking Software ID Schemes</title>
        <published>2025-04-10T00:00:00+00:00</published>
        <updated>2025-04-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/tracking-software-id-schemes/"/>
        <id>https://www.alilleybrinker.com/mini/tracking-software-id-schemes/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/tracking-software-id-schemes/">&lt;p&gt;Part of my life is working on the problem of software identification. I’m on
the Core Team for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;omnibor.io&#x2F;&quot;&gt;OmniBOR&lt;&#x2F;a&gt;, a reproducible software identifier scheme, and my
other work in software supply chain security and vulnerability management often
bumps up against challenges with identifying software at differing levels of
granularity, mapping vulnerabilities or SBOMs (Software Bills of Material) to
specific software.&lt;&#x2F;p&gt;
&lt;p&gt;It may surprise you to learn there are a lot of software identifier schemes.
Some of them are general purpose and used across different ecosystems, while
some are ecosystem or even tool- or API-specific.&lt;&#x2F;p&gt;
&lt;p&gt;To help track those identifiers and link to their specifications, I’ve made a
new &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.alilleybrinker.com&#x2F;softwareids&#x2F;&quot;&gt;Software ID tracker&lt;&#x2F;a&gt;. It’s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;alilleybrinker&#x2F;softwareids&quot;&gt;up on GitHub&lt;&#x2F;a&gt; and
contributions are welcome!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Best Monad Tutorial Ever Written</title>
        <published>2025-02-19T00:00:00+00:00</published>
        <updated>2025-02-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/the-best-monad-tutorial/"/>
        <id>https://www.alilleybrinker.com/mini/the-best-monad-tutorial/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/the-best-monad-tutorial/">&lt;p&gt;When &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsky.app&#x2F;profile&#x2F;sunshowers.io&quot;&gt;Rain&lt;&#x2F;a&gt; mentioned recently they had a draft monad tutorial that explains
them &lt;em&gt;without mathematical jargon&lt;&#x2F;em&gt;, with &lt;em&gt;practical examples&lt;&#x2F;em&gt;, and as a
&lt;em&gt;design pattern&lt;&#x2F;em&gt;, I knew it was going to be good. Of course, it is &lt;strong&gt;even
better than I hoped&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sunshowers.io&#x2F;posts&#x2F;monads-through-pbt&#x2F;&quot;&gt;“Demystifying monads in Rust through property-based testing”&lt;&#x2F;a&gt; is an
undersell of a title. If you’ve floated around the world of functional
programming long, you’ve probably seen one of the many attempts at explaining
monads. Many are from the perspective of a formalism—the monad laws—and
written with Haskell—the language that made them a central feature with
syntactic sugar and a direct to how IO is done.&lt;&#x2F;p&gt;
&lt;p&gt;Rain instead introduces monads with a practical example of how their
flexibility actually makes some work harder, motivated with a concrete example
of how “shrinking,” a core operation for doing practical property-based
testing, becomes much more difficult when monadic operations are used to
generate test inputs. Instead of Haskell, the tutorial uses Rust.&lt;&#x2F;p&gt;
&lt;p&gt;Thanks Rain for the best monad tutorial I’ve ever read!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Jujutsu is the Future</title>
        <published>2025-02-14T00:00:00+00:00</published>
        <updated>2025-02-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/jujutsu-is-the-future/"/>
        <id>https://www.alilleybrinker.com/mini/jujutsu-is-the-future/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/jujutsu-is-the-future/">&lt;p&gt;I’d like to stake a radical position: the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;&quot;&gt;Git&lt;&#x2F;a&gt; Version Control System (VCS)
will be declining in popularity in 5 years, and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&quot;&gt;Jujutsu&lt;&#x2F;a&gt; (&lt;code&gt;jj&lt;&#x2F;code&gt;) will be
gaining popularity in its place.&lt;&#x2F;p&gt;
&lt;p&gt;Of course, Git is the most popular VCS today by a wide margin, with a large
ecosystem of companies and tools built around it.&lt;&#x2F;p&gt;
&lt;p&gt;However, I believe Jujutsu will displace it for three reasons:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Jujutsu can be adopted locally on Git projects.&lt;&#x2F;strong&gt; You can use Jujutsu as
an individual contributor on a project that doesn’t use it. It can be
adopted incrementally by teams, and does not require a cutover from one
VCS to another, which history has shown to be a slow, expensive, and
difficult process.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Jujutsu’s design makes dev work easier.&lt;&#x2F;strong&gt; Jujutsu has learned from Git,
Mercurial, and others, and features a model which is, to paraphrase Steve
Klabnik, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steveklabnik.github.io&#x2F;jujutsu-tutorial&#x2F;introduction&#x2F;what-is-jj-and-why-should-i-care.html&quot;&gt;“simpler and more powerful”&lt;&#x2F;a&gt; than Git’s. By removing edge
cases and sources of complexity from Git, Jujutsu’s features compose better
together, allow more powerful control over your commit history, and make
day-to-day operations on collaborative software projects easier.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Jujutsu’s interface is easier to use.&lt;&#x2F;strong&gt; Not only is Jujutsu’s data model
simpler and more powerful, but its Command Line Interface (CLI) is also
much easier to understand than Git’s. This is both &lt;em&gt;because&lt;&#x2F;em&gt; the data model
is simpler (so fewer flags to handle edge cases are needed), and because
the CLI itself is better designed. Flags are more consistent across
commands, terminology is more consistent, undoing operations is predictable
and much easier.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Of course, I may be wrong. Jujutsu is production ready for many users, but it
has not reached version 1.0 yet. Displacing an entrenched technology is also
difficult, and there are many ways it could go wrong.&lt;&#x2F;p&gt;
&lt;p&gt;Yet using Jujutsu, I have the same feeling I had writing Rust in 2014 as a C++
programmer: this is better. This is a system that makes many of the failure
cases I’ve encountered impossible, and makes the few remaining tough cases much
easier to resolve. Day-to-day, I find myself less worried about managing my
changes to reduce the likelihood of possible merge conflicts; in fact I am
rarely worried about conflicts at all. It’s easier to use, easier to teach,
and lets me move faster and with more confidence.&lt;&#x2F;p&gt;
&lt;p&gt;One of Rust’s historic taglines was &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;ch16-00-concurrency.html&quot;&gt;“Fearless Concurrency.”&lt;&#x2F;a&gt; Maybe
Jujutsu’s should be “Fearless Collaboration.”&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Safety Hygiene</title>
        <published>2025-02-10T00:00:00+00:00</published>
        <updated>2025-02-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrew Lilley Brinker
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.alilleybrinker.com/mini/safety-hygiene/"/>
        <id>https://www.alilleybrinker.com/mini/safety-hygiene/</id>
        
        <content type="html" xml:base="https://www.alilleybrinker.com/mini/safety-hygiene/">&lt;p&gt;I really like Jack Wrenn’s new article &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jack.wrenn.fyi&#x2F;blog&#x2F;safety-hygiene&#x2F;&quot;&gt;“The Three Basic Rules of Safety
Hygiene,”&lt;&#x2F;a&gt; which covers how to handle unsafe code when you have to write it,
through a hygiene checklist for expressing and validating compliance with
safety conditions in the code.&lt;&#x2F;p&gt;
&lt;p&gt;Rust’s goal is not to eliminate unsafe code, but to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;nomicon&#x2F;meet-safe-and-unsafe.html&quot;&gt;contain it in isolated
modules&lt;&#x2F;a&gt; you &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;rust-secure-code&#x2F;safety-dance&quot;&gt;can audit&lt;&#x2F;a&gt; and which provide safe interaces to
external users. Sometimes unsafety is necessary, and having a &lt;em&gt;process&lt;&#x2F;em&gt; for
how to handle that unsafety is a key development.&lt;&#x2F;p&gt;
&lt;p&gt;Research on how to reduce things like industrial accidents, medical incidents,
and airplane crashes all consistently find that checklists and procedures
&lt;em&gt;work&lt;&#x2F;em&gt;. Humans are fallible, and being accountable to a checklist or a process
defends against our propensity to make mistakes.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
