<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title></title>
    <link rel="self" type="application/atom+xml" href="https://federicocarrone.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://federicocarrone.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-03-13T00:00:00+00:00</updated>
    <id>https://federicocarrone.com/atom.xml</id>
    <entry xml:lang="en">
        <title>Fede&#x27;s Guide to a Healthier Life</title>
        <published>2026-03-13T00:00:00+00:00</published>
        <updated>2026-03-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/articles/health-guide/"/>
        <id>https://federicocarrone.com/articles/health-guide/</id>
        
        <summary type="html">&lt;p&gt;When I was young I loved science and engineering. Like most nerds, I thought thinking was the only thing that mattered. Working out seemed like a vanity project, something for people who cared about how they looked and not much else. I didn’t understand the body-mind connection at all. I was a skinny kid who spent all day reading, tinkering with computers, and hanging out with friends. The idea that physical health could affect how well I think would have sounded like nonsense to me.&lt;&#x2F;p&gt;
&lt;p&gt;It took me a long time to figure out how wrong I was.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Can I prove Concrete programs in Lean?</title>
        <published>2026-03-12T00:00:00+00:00</published>
        <updated>2026-03-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/concrete/proving-systems-code-in-lean/"/>
        <id>https://federicocarrone.com/series/concrete/proving-systems-code-in-lean/</id>
        
        <summary type="html">&lt;p&gt;I have been thinking about what it would take to prove &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;unbalancedparentheses&#x2F;concrete&quot;&gt;Concrete&lt;&#x2F;a&gt; programs in Lean. Not the compiler itself, but actual user programs: take a function written in Concrete, connect it to its Core IR representation inside the compiler, and prove properties about it using Lean’s existing theorem library.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The AI Training Data Trap for Programming Languages Has an Exit</title>
        <published>2026-03-11T00:00:00+00:00</published>
        <updated>2026-03-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/concrete/the-ai-training-data-trap-for-programming-languages-has-an-exit/"/>
        <id>https://federicocarrone.com/series/concrete/the-ai-training-data-trap-for-programming-languages-has-an-exit/</id>
        
        <summary type="html">&lt;p&gt;Edgar Luque recently wrote about how &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;edgl.dev&#x2F;blog&#x2F;ai-language-adoption&#x2F;&quot;&gt;AI creates a new adoption barrier for programming languages&lt;&#x2F;a&gt;. His claim is that AI coding assistants need training data, training data only exists for popular languages, and so new languages get bad AI support, which prevents adoption, which in turn prevents training data from accumulating. A self-reinforcing loop that locks in whatever is already dominant.&lt;&#x2F;p&gt;
&lt;p&gt;If you are building a new general-purpose language that competes with Python, Go, or Rust on roughly the same terms, Luque’s analysis is devastating. What makes it worse than previous adoption barriers is that you cannot community-effort your way out of it. The AI training pipelines belong to a handful of companies, and those companies will always prioritize the languages where the most data already exists.&lt;&#x2F;p&gt;
&lt;p&gt;But there is a blind spot in the argument.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The Rust Effects Debate and Concrete&#x27;s Case for a Smaller Language</title>
        <published>2026-03-09T00:00:00+00:00</published>
        <updated>2026-03-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/concrete/rusts-grand-vision-and-concretes-answer/"/>
        <id>https://federicocarrone.com/series/concrete/rusts-grand-vision-and-concretes-answer/</id>
        
        <summary type="html">&lt;p&gt;Yoshua Wuyts recently wrote about his &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blog.yoshuawuyts.com&#x2F;a-grand-vision-for-rust&#x2F;&quot;&gt;“grand vision” for Rust&lt;&#x2F;a&gt;, outlining three directions he thinks the language should pursue: effects, stronger substructural types, and refinement types. The &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=47256376&quot;&gt;Hacker News thread&lt;&#x2F;a&gt; that followed split predictably: one camp saw a safer, more principled systems language taking shape while the other saw echoes of Scala, C++, and a language that becomes harder to read than the software it is meant to clarify.&lt;&#x2F;p&gt;
&lt;p&gt;Both camps are seeing something real, and I think resolving the tension between them requires something other than adding more features to Rust. That is where &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;unbalancedparentheses&#x2F;concrete2&quot;&gt;Concrete&lt;&#x2F;a&gt; comes in.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Dissolution Without Construction</title>
        <published>2026-03-06T00:00:00+00:00</published>
        <updated>2026-03-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/les-circuits-longs/dissolution-without-construction/"/>
        <id>https://federicocarrone.com/series/les-circuits-longs/dissolution-without-construction/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/series/les-circuits-longs/dissolution-without-construction/">&lt;p&gt;I have been circling the same problem for a while now. Friction produces value. Legibility destroys what it measures. Formation requires lived time. The modern self is dissolving through redundancy. Previous technological shifts gave people decades to adapt, and this one might give them months.&lt;&#x2F;p&gt;
&lt;p&gt;These kept feeling like separate observations. I no longer think they are.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-speed-mismatch&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-speed-mismatch&quot; aria-label=&quot;Anchor link for: the-speed-mismatch&quot;&gt;#&lt;&#x2F;a&gt;The Speed Mismatch&lt;&#x2F;h2&gt;
&lt;p&gt;Every major coordination technology in history has dissolved the form of selfhood that preceded it. Writing destroyed oral memory. The printing press destroyed manuscript culture. Institutions dissolved kinship. None of this is new.&lt;&#x2F;p&gt;
&lt;p&gt;What is new is the asymmetry between how fast things dissolve and how fast things grow.&lt;&#x2F;p&gt;
&lt;p&gt;Writing spread slowly. A scribe copied a text, carried it to another city, taught someone to read it. The dissolution of oral memory and the construction of literate thought happened at roughly the same pace, both measured in generations. The printing press was faster, but still slow enough that cultural forms could emerge alongside the destruction. The novel, the diary, the public library, liberal education: these took centuries to stabilize, but centuries were available because print moved at the speed of physical objects.&lt;&#x2F;p&gt;
&lt;p&gt;Algorithmic systems dissolve at computational speed. A recommendation engine can reshape the taste-formation process of millions of people in months. An AI assistant can make inner deliberation feel unnecessary within a single product cycle.&lt;&#x2F;p&gt;
&lt;p&gt;But construction, the formation of new human capacities, new cultural forms, new modes of perception, still happens at biological speed. A person becomes a particular kind of person through years of encounter, revision, failure. A cultural form stabilizes through generations of practice. There is no computational shortcut because the capacity is constituted by the process, not by its output. You cannot compress becoming.&lt;&#x2F;p&gt;
&lt;p&gt;The gap between dissolution speed and construction speed is the problem. Not dissolution itself.&lt;&#x2F;p&gt;
&lt;p&gt;This reframes a conversation that has been stuck for years. One side says previous transitions worked out, so this one will too. They are wrong for a structural reason: previous transitions worked out because dissolution was slow enough for construction to keep pace. That condition no longer holds. The other side says technology is destroying us. They are also wrong, or at least imprecise. Dissolution is not destruction. Every previous transition dissolved something real and produced something new. The issue is not that dissolution is happening. The issue is that it is happening at a speed that makes construction impossible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;friction-as-governor&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#friction-as-governor&quot; aria-label=&quot;Anchor link for: friction-as-governor&quot;&gt;#&lt;&#x2F;a&gt;Friction as Governor&lt;&#x2F;h2&gt;
&lt;p&gt;Desire depends on resistance. The deeper point is that resistance imposes a pace. The distance between wanting and obtaining is a temporal structure. It gives the person time to become someone who can integrate what they receive. Remove the distance and the person receives before they can absorb.&lt;&#x2F;p&gt;
&lt;p&gt;Friction performs this function at civilizational scale. When the printing press dissolved oral culture, books were expensive. Literacy spread gradually. The oral self did not vanish overnight. It weakened over decades and centuries, and during that time the constructive side, new practices of reading, new institutions, new literary forms, had room to develop. The friction inherent in physical media imposed a speed limit on dissolution, and that speed limit happened to match the speed of human formation.&lt;&#x2F;p&gt;
&lt;p&gt;Friction in taste formation gives a person time to develop the capacity to perceive, not just a set of preferences. Friction in professional training gives the practitioner time to develop judgment that resists articulation. Friction in deliberation gives the self time to form. Remove it and dissolution outruns construction. The gap opens. Nothing grows where the old capacity was.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;legibility-as-accelerant&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#legibility-as-accelerant&quot; aria-label=&quot;Anchor link for: legibility-as-accelerant&quot;&gt;#&lt;&#x2F;a&gt;Legibility as Accelerant&lt;&#x2F;h2&gt;
&lt;p&gt;The German forest again. Eighteenth-century foresters replaced diverse, messy woodland with uniform Norway spruce plantations. Yields surged. Then the undergrowth died, the soil degraded, and the forest collapsed. What looked like inefficiency was the system’s life support.&lt;&#x2F;p&gt;
&lt;p&gt;Legibility does something specific to the speed problem. It converts illegible processes into optimizable targets. Once a process is visible, it can be measured. Once measured, optimized. Once optimized, the friction in the original process gets removed as inefficiency. Legibility is the mechanism that identifies friction, and optimization is the mechanism that strips it out. Together they accelerate dissolution.&lt;&#x2F;p&gt;
&lt;p&gt;The self depended on opacity. Taste formed in private. You encountered things by accident, sat with discomfort no algorithm could detect, revised your sensibility through a process invisible to any external system. Professional judgment lived in knowledge that could not be articulated. Inner deliberation happened in a space that was, by definition, not observable from outside.&lt;&#x2F;p&gt;
&lt;p&gt;AI reaches into all of this. It makes taste formation legible through behavioral data. It makes deliberation legible through interaction logs. It makes professional intuition legible through performance metrics. Each act of legibility strips away a layer of friction that was functioning, without anyone noticing, as a speed governor on dissolution.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-compounding-problem&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-compounding-problem&quot; aria-label=&quot;Anchor link for: the-compounding-problem&quot;&gt;#&lt;&#x2F;a&gt;The Compounding Problem&lt;&#x2F;h2&gt;
&lt;p&gt;This is the part that worries me most. Dissolution does not just outrun construction. It degrades the conditions under which construction is possible.&lt;&#x2F;p&gt;
&lt;p&gt;Formation requires complete cycles: effort, feedback, adjustment, repeated across lived time. Acceleration fragments these cycles. What spreads fastest diverges from what works best. Imitation spreads faster than learning. Every act of dissolution removes some of the friction, opacity, and time that construction requires. The more functions the self loses, the less capacity remains to develop new ones. The process compounds. Dissolution accelerates while the ground for construction erodes.&lt;&#x2F;p&gt;
&lt;p&gt;Someone who has never formed taste through friction is not going to develop whatever post-algorithmic perception might look like. Someone who has never exercised inner deliberation will not develop whatever comes after deliberation. The new capacity, if it exists, will not emerge from a vacuum. It will emerge from people who have developed enough of the old capacity to transcend it, the way literate thought emerged from people who had first mastered oral memory. If dissolution destroys the old capacity before the new one can develop from it, the sequence breaks.&lt;&#x2F;p&gt;
&lt;p&gt;That is not a transition. It is an interruption.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-would-have-to-be-true&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-would-have-to-be-true&quot; aria-label=&quot;Anchor link for: what-would-have-to-be-true&quot;&gt;#&lt;&#x2F;a&gt;What Would Have to Be True&lt;&#x2F;h2&gt;
&lt;p&gt;I do not know what comes after the literate self. Nobody in 1450 could have described what the printing press would produce either. But I can describe the conditions under which construction becomes possible.&lt;&#x2F;p&gt;
&lt;p&gt;It would require friction. Not arbitrary difficulty, but the specific resistance that imposes a pace compatible with human formation. It would require opacity. Domains where the slow work of becoming is not legible to optimization systems, where a person can develop without being measured. And it would require time. Actual time. Complete cycles of effort and revision that are not compressed or interrupted.&lt;&#x2F;p&gt;
&lt;p&gt;The current system removes all three. Optimization treats friction as waste. AI treats opacity as a problem to solve. Markets treat slowness as a competitive disadvantage. The incentives point uniformly toward faster dissolution.&lt;&#x2F;p&gt;
&lt;p&gt;Previous transitions produced their own constructive forms because the speed of dissolution left room for them. Print was slow enough that the novel could emerge. Institutional life was gradual enough that liberal education could develop. The printing press did not spontaneously generate the literate self. People built schools, designed curricula, established practices of reading and argument that took centuries to stabilize. That work was deliberate, institutional, and slow, but it was possible because the dissolution it responded to was also slow.&lt;&#x2F;p&gt;
&lt;p&gt;The question I cannot answer is whether anything can grow at biological speed in an environment that has been optimized for computational speed. Whether construction is possible when the conditions for construction are precisely what the system is most efficient at removing.&lt;&#x2F;p&gt;
&lt;p&gt;There is an irony I should not avoid. I build coordination infrastructure for a living. Ethereum clients, cryptographic proof libraries, distributed systems. Tools that accelerate exactly the process this essay describes. And the essay itself is not construction. It is diagnosis. I am genuinely confused by my own position. I see the dissolution clearly enough to write about it. I also build the tools that produce it. I have not resolved this. I am not sure it can be resolved. Naming the speed mismatch does not slow it down. It may even accelerate it by making the problem legible, which is what I argued legibility does: convert things into objects of optimization. I do not know whether writing about dissolution is a form of friction, something that slows the reader down, forces them to sit with discomfort, or a frictionless take on friction, consumed and forgotten at algorithmic speed. I suspect the answer depends on what you do after reading it.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Legibility Kills What It Measures</title>
        <published>2026-03-03T00:00:00+00:00</published>
        <updated>2026-03-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/les-circuits-longs/legibility-kills-what-it-measures/"/>
        <id>https://federicocarrone.com/series/les-circuits-longs/legibility-kills-what-it-measures/</id>
        
        <summary type="html">&lt;p&gt;In the 18th century, German foresters invented scientific forestry. They looked at a messy, diverse forest and saw inefficiency. Old trees, young trees, deadwood, underbrush, species with no commercial value. They cleared it all and planted Norway spruce in straight rows, evenly spaced, same age, same species. The forest became legible. You could measure it, manage it, predict its yield with precision.&lt;&#x2F;p&gt;
&lt;p&gt;For one generation, it worked brilliantly. Yields surged. Then the forest began to die. The complex undergrowth had been cycling nutrients, retaining moisture, hosting the insects that pollinated the canopy and the fungi that fed the roots. The foresters had not simplified the forest. They had destroyed the system that kept the forest alive while keeping only the part they could see.&lt;&#x2F;p&gt;
&lt;p&gt;James Scott tells this story in &lt;em&gt;Seeing Like a State&lt;&#x2F;em&gt; to illustrate a pattern that recurs wherever central authorities impose legibility on complex systems. The pattern is simple: make the illegible legible, optimize what you can now see, and lose what you couldn’t see but depended on.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>At the Core of Finance Lies Geometry. In the End, It’s All Jensen’s Inequality.</title>
        <published>2026-03-01T00:00:00+00:00</published>
        <updated>2026-03-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/leptokurtic/at-the-core-of-finance-lies-geometry-in-the-end-its-all-jensens-inequality/"/>
        <id>https://federicocarrone.com/series/leptokurtic/at-the-core-of-finance-lies-geometry-in-the-end-its-all-jensens-inequality/</id>
        
        <summary type="html">&lt;p&gt;Never cross a river that is on average four feet deep. If the river is eight feet deep in the middle and dry on the sides, the average tells you nothing about whether you will drown. You will drown in the middle, or you won’t. There is no averaging across parallel universes where you both survive and die.&lt;&#x2F;p&gt;
&lt;p&gt;The same asymmetry shows up wherever outcomes compound. Lose 50% of your wealth and you need a 100% gain just to break even, because the loss hits a larger base than the recovery builds from. Going from $100 to $200 and from $200 to $400 are different dollar amounts but the same proportional move: one doubling. Wealth is about ratios and scaling, not absolute differences.&lt;&#x2F;p&gt;
&lt;p&gt;This multiplicative structure has consequences that run deeper than intuition suggests. The mathematics that governs survival in compounding environments was invented 400 years ago to help astronomers multiply large numbers, partially rediscovered in the 18th century to solve a paradox about gambling, formalized again through information theory, and then largely obscured by theories that optimized across hypothetical worlds instead of along a single path through time.&lt;&#x2F;p&gt;
&lt;p&gt;That is the geometric claim in this essay: wealth evolves multiplicatively, while most ordinary intuition is additive. The logarithm is the change of coordinates that lets us move between those two descriptions.&lt;&#x2F;p&gt;
&lt;p&gt;This is the story of why geometry sits at the core of finance, why a single inequality ties the whole picture together, and why reducing variance can be more valuable than increasing returns.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The Tail Hedge Debate: Spitznagel Is Right, AQR Is Answering the Wrong Question</title>
        <published>2026-02-26T00:00:00+00:00</published>
        <updated>2026-02-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/leptokurtic/the-tail-hedge-debate-spitznagel-is-right/"/>
        <id>https://federicocarrone.com/series/leptokurtic/the-tail-hedge-debate-spitznagel-is-right/</id>
        
        <summary type="html">&lt;p&gt;Stock markets crash. The S&amp;amp;P 500 price index fell about 57% from October 9, 2007 to March 9, 2009, and about 34% from February 19, 2020 to March 23, 2020.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-sp500_2007_2009-1&quot;&gt;&lt;a href=&quot;#fn-sp500_2007_2009&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-sp500_2020-1&quot;&gt;&lt;a href=&quot;#fn-sp500_2020&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; A &lt;strong&gt;put option&lt;&#x2F;strong&gt; is a contract that pays you when the market falls below a certain price (the “strike”). If you hold stocks and also hold puts, the puts can offset some of your losses during a crash. The question is whether the cost of buying puts is worth the protection they provide.&lt;&#x2F;p&gt;
&lt;p&gt;There are two sides. AQR Capital Management published &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.aqr.com&#x2F;-&#x2F;media&#x2F;AQR&#x2F;Documents&#x2F;Insights&#x2F;White-Papers&#x2F;AQR-Chasing-Your-Own-Tail-Risk.pdf&quot;&gt;“Chasing Your Own Tail (Risk)”&lt;&#x2F;a&gt; (&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.aqr.com&#x2F;-&#x2F;media&#x2F;AQR&#x2F;Documents&#x2F;Insights&#x2F;White-Papers&#x2F;AQR-Chasing-Your-Own-Tail-Risk.pdf&quot;&gt;Nielsen, Villalon, and Berger, 2011&lt;&#x2F;a&gt;). They argue that buying puts systematically costs more than it saves. On the other side, Mark Spitznagel at Universa Investments, where Nassim Taleb is scientific advisor, argues that a small put allocation improves long-term returns (&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.wiley.com&#x2F;en-us&#x2F;Safe+Haven%3A+Investing+for+Financial+Storms-p-9781119401797&quot;&gt;Spitznagel, 2021&lt;&#x2F;a&gt;). Universa reported a 3,612% gain in March 2020 (via an investor letter, as reported by Bloomberg).&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-universa_2020-1&quot;&gt;&lt;a href=&quot;#fn-universa_2020&quot;&gt;3&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We tested both claims with &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lambdaclass&#x2F;options_portfolio_backtester&quot;&gt;our open-source options backtester&lt;&#x2F;a&gt; on 17 years of real SPY options data (2008 to 2025), covering three crashes: the 2008 financial crisis, COVID, and the 2022 bear market.&lt;&#x2F;p&gt;
&lt;p&gt;Spitznagel is right about the strategy he actually proposes. AQR’s published critique uses near-ATM puts and a no-leverage framing, neither of which matches the portfolio Spitznagel and Universa describe. When we test deep OTM puts, even the no-leverage framing beats SPY. Spitznagel’s externally funded overlay still wins by a wider margin.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Detecting Crashes with Fat-Tail Statistics</title>
        <published>2026-02-19T00:00:00+00:00</published>
        <updated>2026-02-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/leptokurtic/detecting-crashes-with-fat-tail-statistics/"/>
        <id>https://federicocarrone.com/series/leptokurtic/detecting-crashes-with-fat-tail-statistics/</id>
        
        <summary type="html">&lt;p&gt;Financial markets don’t follow normal distributions. That is a claim about frequency, not just theory: it tells you how often catastrophic events happen. Under a naive Gaussian model, a crisis on the scale of 2008 lands so deep in the tails that standard risk models treat it as effectively impossible. It happened on a Tuesday.&lt;&#x2F;p&gt;
&lt;p&gt;The problem is that we keep using tools designed for thin-tailed worlds. &lt;strong&gt;Value at Risk&lt;&#x2F;strong&gt; (&lt;strong&gt;VaR&lt;&#x2F;strong&gt;) models that assume normality. Risk metrics that treat the 2008 crash as an “outlier” rather than a regular feature of financial returns.&lt;&#x2F;p&gt;
&lt;p&gt;I built &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;unbalancedparentheses&#x2F;fatcrash&quot;&gt;fatcrash&lt;&#x2F;a&gt;, a Rust+Python toolkit with 15 classical methods, to test whether fat-tail statistical methods can detect crashes before they happen. The performance-critical math (fitting, simulation, all rolling estimators) runs in Rust via PyO3; everything else (data, viz, CLI) is Python.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Twenty Centuries of Financial Data: What 240 Countries and 2,000 Years Reveal</title>
        <published>2026-02-12T00:00:00+00:00</published>
        <updated>2026-02-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/leptokurtic/twenty-centuries-of-financial-data/"/>
        <id>https://federicocarrone.com/series/leptokurtic/twenty-centuries-of-financial-data/</id>
        
        <summary type="html">&lt;p&gt;In 1252, Florence minted the gold florin. Within decades it became the dominant trade currency of medieval Europe. Merchants in Bruges, Venice, and Constantinople quoted prices against it. By the 1400s, the florin’s dominance had faded, replaced by the Venetian ducat. Then the Spanish real. Then the Dutch guilder. Then sterling. Then the dollar. Each transition involved devaluations, defaults, and crises that ruined anyone holding the wrong currency at the wrong time.&lt;&#x2F;p&gt;
&lt;p&gt;We have data on all of this. Not estimates. Actual recorded exchange rates, starting from 1106. And not just exchange rates: gold and silver prices from 1257, interest rates from 1311, commodity prices from 1260, GDP per capita from the year 1 CE, sovereign debt ratios from 1800, and crisis indices covering two centuries of banking panics, currency collapses, and sovereign defaults.&lt;&#x2F;p&gt;
&lt;p&gt;I assembled &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;unbalancedparentheses&#x2F;forex-centuries&quot;&gt;forex-centuries&lt;&#x2F;a&gt;, the most comprehensive open-source collection of long-run financial and economic data available. 27 sources, 1,100+ files, ~240 countries, spanning twenty centuries. Exchange rates, precious metals, interest rates, commodity prices, inflation, GDP, real wages, sovereign debt, regime classifications, and real effective exchange rates — all in one repository with an automated build pipeline, weekly CI updates, and reproducible analysis. No other free repository combines this breadth of asset classes across this depth of history. The only comparable product is &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;globalfinancialdata.com&#x2F;&quot;&gt;Global Financial Data&lt;&#x2F;a&gt; (commercial, institutional pricing). The goal: provide the raw material for studying how currencies and financial systems behave over centuries, not decades.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Friction as Luxury: What We Lose When AI Gives Us What We Want</title>
        <published>2026-02-05T00:00:00+00:00</published>
        <updated>2026-02-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/les-circuits-longs/friction-as-luxury/"/>
        <id>https://federicocarrone.com/series/les-circuits-longs/friction-as-luxury/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/series/les-circuits-longs/friction-as-luxury/">&lt;h2 id=&quot;the-last-scarcity&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-last-scarcity&quot; aria-label=&quot;Anchor link for: the-last-scarcity&quot;&gt;#&lt;&#x2F;a&gt;The Last Scarcity&lt;&#x2F;h2&gt;
&lt;p&gt;Most discussions of AGI focus on distribution: who gets access, who profits, who loses their job, who controls the infrastructure. Those are real problems, but they’re not the deepest one.&lt;&#x2F;p&gt;
&lt;p&gt;The deeper problem is what happens to desire. I do not mean ambition in the generic sense. I mean the capacity to want something at a distance, to stay oriented toward something you do not yet have, and to find meaning in the space between reaching and arriving. That capacity is more fragile than we usually admit, and it depends more on friction than most people notice.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;i&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#i&quot; aria-label=&quot;Anchor link for: i&quot;&gt;#&lt;&#x2F;a&gt;I.&lt;&#x2F;h2&gt;
&lt;p&gt;Economists have a clean model of desire. People have preferences, goods satisfy preferences, welfare rises as more preferences are satisfied. In that framework, a technology that can satisfy almost any preference at negligible cost looks like an obvious good. The only remaining question is who gets access.&lt;&#x2F;p&gt;
&lt;p&gt;That model leaves out something important. Desire is not just a lack waiting to be filled. It has a shape, and that shape depends on certain conditions holding.&lt;&#x2F;p&gt;
&lt;p&gt;When you want something over time, you imagine having it. You plan for it, you make sacrifices toward it. The object accumulates meaning from this process. It gets layered with your effort, your anticipation, your history of reaching. When you finally arrive, you don’t just get the object. You get the object plus everything you invested in wanting it. Those two things can’t be separated.&lt;&#x2F;p&gt;
&lt;p&gt;That is why anticipation is often richer than arrival, why the best albums sometimes need months rather than minutes, and why relationships built through difficulty have a texture that convenient ones often do not. The resistance is not incidental to the value. It helps produce it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ii&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ii&quot; aria-label=&quot;Anchor link for: ii&quot;&gt;#&lt;&#x2F;a&gt;II.&lt;&#x2F;h2&gt;
&lt;p&gt;When this structure breaks down, the clinical term is anhedonia. But there is a milder and more socially acceptable version of the same pattern. People in this condition can be entertained constantly but rarely feel deeply absorbed. They consume without much appetite. They move from one stimulating thing to the next not because anything is satisfying, but because sitting with incompleteness starts to feel unbearable.&lt;&#x2F;p&gt;
&lt;p&gt;You can already see the shape of it in declining attention spans, in the difficulty of sustaining interest in anything that doesn’t deliver immediate feedback, in people who feel simultaneously overstimulated and bored. They haven’t been deprived, they’ve been saturated.&lt;&#x2F;p&gt;
&lt;p&gt;This doesn’t distribute evenly in society. In environments where discomfort is quickly solved, by money, by services, by endless entertainment, the mind gets less practice holding lack. You can grow up surrounded by abundance and still become poor in one specific way: poor in patience for distance.&lt;&#x2F;p&gt;
&lt;p&gt;Structurally, it starts to resemble addiction: craving breaks away from fulfillment. Many substances do not mainly deliver pleasure. They intensify wanting. They train the nervous system to treat discomfort as a cue for relief, and relief as a cue for repetition. A frictionless AI environment could reproduce some of that pattern without chemicals. Boredom, loneliness, uncertainty, and effort all become prompts for instant stimulation. Over time the threshold rises, what once felt absorbing becomes merely adequate, and the rest of life starts to feel slow and underpowered by comparison.&lt;&#x2F;p&gt;
&lt;p&gt;Consumer capitalism produced a weakened version of this. Desire progressively hollowed out by eliminating friction, but with enough friction remaining that the structure didn’t fully collapse. The streaming service still requires you to choose. The algorithm still occasionally surprises you. The simulation of connection is imperfect enough that you sometimes notice it’s a simulation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;iii&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#iii&quot; aria-label=&quot;Anchor link for: iii&quot;&gt;#&lt;&#x2F;a&gt;III.&lt;&#x2F;h2&gt;
&lt;p&gt;Imagine a system that can generate, on demand, a novel calibrated to your tastes: the style you find most pleasurable, the level of complexity you find most engaging, the length that matches your current patience. Or music that sounds like what you loved most at nineteen, except new, immediate, and endless. Or a conversation partner who is always interested in what interests you, always available, never distracted, never carrying needs of their own into the exchange.&lt;&#x2F;p&gt;
&lt;p&gt;The output might be genuinely good. The novel could be technically accomplished. The music could actually move you. The conversation could be substantive. The problem is what happens to wanting once the gap collapses to zero.&lt;&#x2F;p&gt;
&lt;p&gt;The capacity to stay oriented toward a distant goal, to defer, to invest, to tolerate incompleteness, atrophies when it is never exercised. Not through some dramatic break. Through disuse. The ability to want things that require time does not vanish all at once. It gets weaker, and the weakening may not even feel like a loss because something pleasant keeps arriving on schedule.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;iv&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#iv&quot; aria-label=&quot;Anchor link for: iv&quot;&gt;#&lt;&#x2F;a&gt;IV.&lt;&#x2F;h2&gt;
&lt;p&gt;None of this is new. The Stoics understood that wanting easily obtained things produces a character incapable of bearing difficulty. Religious traditions have long held that the meaningful life runs through resistance rather than around it.&lt;&#x2F;p&gt;
&lt;p&gt;What’s new is the scale. Previous technologies eliminated specific friction but left other friction intact. The printing press made books abundant but reading still required effort. The internet made information free but you still had to sift through it, evaluate it, decide what mattered. Every digital environment until now required you to bring something it couldn’t supply: attention, skill, patience.&lt;&#x2F;p&gt;
&lt;p&gt;A genuinely general AI dissolves this last requirement. It can supply the taste, the context, the judgment. You no longer need to bring anything except the desire to receive. And if that desire is itself shaped by the AI, tuned to whatever maintains engagement, then even the wanting has been outsourced.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;v&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#v&quot; aria-label=&quot;Anchor link for: v&quot;&gt;#&lt;&#x2F;a&gt;V.&lt;&#x2F;h2&gt;
&lt;p&gt;Here is the inversion. In a world of material abundance, the things that keep their value are often the ones that resist the logic of abundance. Their value is tied to the conditions that make them difficult, not to artificial scarcity.&lt;&#x2F;p&gt;
&lt;p&gt;A handmade object carries the trace of the hands that made it. A wine vintage can’t be accelerated. The waiting isn’t incidental to what the wine is. A community built around a shared difficult practice, painting, rock climbing, chess, building and fielding armies of miniatures, generates bonds that digitally mediated interaction doesn’t replicate, because those bonds are forged in shared difficulty.&lt;&#x2F;p&gt;
&lt;p&gt;These things do not become valuable despite being harder than consuming AI output. They become valuable partly because of that hardness. In a world of frictionless satisfaction, friction becomes a luxury.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vi&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#vi&quot; aria-label=&quot;Anchor link for: vi&quot;&gt;#&lt;&#x2F;a&gt;VI.&lt;&#x2F;h2&gt;
&lt;p&gt;The safety, alignment, and job-displacement debates are all real. But they share a common assumption: that the humans on the other side will still be capable of deciding what to do with what they’ve been given, and that political agency and collective imagination will survive intact.&lt;&#x2F;p&gt;
&lt;p&gt;That assumption is doing a lot of work.&lt;&#x2F;p&gt;
&lt;p&gt;The atrophying of desire is not some distant hypothetical. You can already see smaller versions of it in what weaker technologies have done to culture. What AGI does to human psychology is not separate from what it does to human politics. It comes first. A population that has lost the capacity to want things at a distance, to stay oriented toward a difficult future, and to find meaning in effort and incompleteness has lost something essential to self-government.&lt;&#x2F;p&gt;
&lt;p&gt;The scarcity that matters most in a post AGI world won’t be compute or energy. It will be the capacity to want something deeply enough, and for long enough, that the wanting shapes who you are.&lt;&#x2F;p&gt;
&lt;p&gt;If desire is the last scarcity, then slowness, difficulty, and incompleteness aren’t obstacles to overcome. They’re the conditions of a life worth living.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>China is trying to commoditize the complement</title>
        <published>2026-01-22T00:00:00+00:00</published>
        <updated>2026-01-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/articles/china-commoditizing-the-complement/"/>
        <id>https://federicocarrone.com/articles/china-commoditizing-the-complement/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/articles/china-commoditizing-the-complement/">&lt;p&gt;China is trying to win by commoditizing the complement and I believe they are close to succeeding. This is a strategic challenge the West should take seriously instead of dismissing.&lt;&#x2F;p&gt;
&lt;p&gt;For the last two decades, the West exported cognition because it owned the platforms, the cloud, the software distribution, and the talent concentration. If the cognitive engine becomes cheap, portable, and good enough, that asymmetry weakens. A small country can buy or download the same cognitive machinery, then apply it to its own bureaucracy, its own companies, its own language, its own domain problems.&lt;&#x2F;p&gt;
&lt;p&gt;The West has dominated the thinking and services world. Software, finance, media, research, management layers, and the export of expertise. The US is the clearest example. In 2024, US services exports were about 1.1 trillion dollars, the highest on record. The US and the West sell thinking at scale. AI threatens to flatten that advantage because AI turns thinking into infrastructure.&lt;&#x2F;p&gt;
&lt;p&gt;China dominates the atoms world. Industrial capacity, manufacturing throughput, physical supply chains, cost curves. In 2023 China produced about 28 percent of global manufacturing value added.&lt;&#x2F;p&gt;
&lt;p&gt;If you can make the layer next to you cheap and abundant, you drain its pricing power and force value to move somewhere else. In AI, the complement is model access. For a lot of Western companies, the business is still basically gated intelligence sold as an API. China has every incentive to make that layer feel like electricity: available everywhere, cheap, hard to monopolize.&lt;&#x2F;p&gt;
&lt;p&gt;Open weight releases are part of that play: DeepSeek, Qwen, Kimi, and MiniMax are only a few of the Chinese open-source models. Once strong models are common, model access stops being a moat. It becomes a commodity input.&lt;&#x2F;p&gt;
&lt;p&gt;A huge fraction of what we call services is legible work: reading, writing, coding, summarizing, translating, drafting, answering, generating variations, searching a space of options. That layer is now replicable and it is getting local. Apple is publishing technical reports about on-device foundation models, including aggressive quantization aimed at making serious inference run on consumer hardware. When strong models run on a laptop, countries stop importing thinking as a service. They import weights, or they distill, fine-tune, and deploy inside their own borders.&lt;&#x2F;p&gt;
&lt;p&gt;That said, China is not without constraints, and from where I sit they matter.&lt;&#x2F;p&gt;
&lt;p&gt;Capital controls limit how freely Chinese companies can operate globally. The state can redirect investment at a scale nobody else can match, but centralized allocation tends to overshoot. Solar panel overcapacity, steel oversupply, and the EV price war all follow the same pattern: massive subsidized buildout that ends up compressing margins for everyone, including the Chinese firms themselves.&lt;&#x2F;p&gt;
&lt;p&gt;Top talent still flows toward open research environments. Many of the best Chinese researchers publish in Western conferences and a significant number stay abroad. The tightening of political control over universities and private companies can accelerate execution on defined goals, but it makes it harder to sustain the open-ended, high-risk research that produces unexpected breakthroughs rather than incremental gains.&lt;&#x2F;p&gt;
&lt;p&gt;Predictability matters for long-term innovation. Foreign companies are recalibrating their exposure. Some domestic entrepreneurs are more cautious than they were a decade ago. Centralized coordination gives speed, but it can also reduce the appetite for bets that do not align with current priorities.&lt;&#x2F;p&gt;
&lt;p&gt;The West still has one advantage that is hard to replicate: it is where most of the world’s ambitious talent wants to live, work, and build. It is a compound effect of open institutions, freedom of movement, and decades of accumulated trust. As long as that holds, the West keeps attracting the talent and the capital that turn ideas into new industries.&lt;&#x2F;p&gt;
&lt;p&gt;None of these constraints cancel out the commodity play. But they mean the race is closer than either side assumes, and the outcome is far from settled.&lt;&#x2F;p&gt;
&lt;p&gt;China stays strong in atoms because it already has the scale advantage. The West still leads in areas that require deep institutions and long accumulated competence, frontier research and high trust services in particular. But AI compresses the services premium by making a large portion of cognition cheap and replicable. That is why open models matter. They attack the margin structure of the thinking economy.&lt;&#x2F;p&gt;
&lt;p&gt;If you sell intelligence, this is bad news. If you own distribution, hardware, data, or a workflow people cannot easily leave, you survive. If you own atoms and you get thinking for free, you get a scary combination, because the services premium that sustained Western economic leadership for decades can be undercut by a player with industrial dominance and access to the same cognitive tools.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Building a SaaS with Elixir&#x2F;Phoenix and React</title>
        <published>2026-01-15T00:00:00+00:00</published>
        <updated>2026-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/articles/building-a-saas-with-elixir-phoenix-and-react/"/>
        <id>https://federicocarrone.com/articles/building-a-saas-with-elixir-phoenix-and-react/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/articles/building-a-saas-with-elixir-phoenix-and-react/">&lt;p&gt;Most SaaS codebases I’ve seen share the same problems. Authentication that sort of works until someone finds an edge case. Caching layers that nobody fully understands. Deployment scripts held together with hope. The team moves fast early on, then spends years paying down the debt.&lt;&#x2F;p&gt;
&lt;p&gt;We got tired of this cycle. Over several projects, we developed a stack and a set of practices that let us move fast without leaving landmines for our future selves. Elixir on the backend, React on the frontend, Nix for everything else. No Docker. No Kubernetes. Decisions that raised eyebrows at first but have proven themselves in production.&lt;&#x2F;p&gt;
&lt;p&gt;This post explains what we use and why.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-case-for-elixir&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-case-for-elixir&quot; aria-label=&quot;Anchor link for: the-case-for-elixir&quot;&gt;#&lt;&#x2F;a&gt;The case for Elixir&lt;&#x2F;h2&gt;
&lt;p&gt;Our backend runs on Elixir, which might seem like an unusual choice in a world dominated by Node, Python, and Go. The reason comes down to what happens when things go wrong.&lt;&#x2F;p&gt;
&lt;p&gt;Elixir runs on the Erlang VM, a runtime Ericsson built in the 1980s for telephone switches. These systems needed to stay up for years at a time, handling failures gracefully without human intervention. Crashes are expected in Elixir, even encouraged as an error-handling strategy. When a process crashes, it crashes in isolation. A supervisor notices and restarts it. The rest of the system keeps running. You don’t get woken up at 3am because one user’s request hit an edge case that brought down the whole server.&lt;&#x2F;p&gt;
&lt;p&gt;Phoenix is the web framework we use on top of Elixir, though we use it differently than most teams. Phoenix has become famous for LiveView, its technology for building interactive UIs with server-rendered HTML. We don’t use it. Instead, Phoenix serves only JSON through a REST API, and a completely separate React application handles everything the user sees.&lt;&#x2F;p&gt;
&lt;p&gt;This creates a hard boundary between backend and frontend. Backend developers focus entirely on data and business logic without thinking about UI concerns. Frontend developers own the user experience end-to-end without needing to understand Elixir. The two teams communicate through the API contract, and neither steps on the other’s work. When we eventually build mobile apps, they’ll consume the same API with no new backend work required.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-we-abandoned-docker-for-nix&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-we-abandoned-docker-for-nix&quot; aria-label=&quot;Anchor link for: why-we-abandoned-docker-for-nix&quot;&gt;#&lt;&#x2F;a&gt;Why we abandoned Docker for Nix&lt;&#x2F;h2&gt;
&lt;p&gt;This is probably our most controversial choice. Docker has become the default for development environments and deployment. We use Nix instead.&lt;&#x2F;p&gt;
&lt;p&gt;When a new developer joins our team, the onboarding process is simple: clone the repository and run &lt;code&gt;nix develop&lt;&#x2F;code&gt;. A few minutes later, they have everything they need. Elixir, Node.js, PostgreSQL, Redis, Meilisearch, all running natively on their machine. Not in containers. Actually installed. Without container overhead, everything runs at native speed. Debugging is straightforward because there’s no abstraction layer between you and the process. And there are no Docker Desktop licensing conversations.&lt;&#x2F;p&gt;
&lt;p&gt;But the real payoff comes in production, where our servers run NixOS. The entire server configuration is declarative and lives in version control alongside our code. When we push a change, every server ends up in exactly the same state. Deployments are atomic. They succeed completely or fail completely, with no partial states to debug. If something goes wrong, rolling back takes one command.&lt;&#x2F;p&gt;
&lt;p&gt;Nix has a steep learning curve. The documentation is notoriously difficult, and the language has unusual semantics. But once you’ve internalized the concepts, you get guarantees Docker can’t provide. A build that works today will produce the exact same result in five years, because every input is pinned and reproducible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;building-for-offline-use&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#building-for-offline-use&quot; aria-label=&quot;Anchor link for: building-for-offline-use&quot;&gt;#&lt;&#x2F;a&gt;Building for offline use&lt;&#x2F;h2&gt;
&lt;p&gt;Most web applications assume users have constant connectivity. Ours doesn’t, and this assumption has shaped our entire frontend architecture.&lt;&#x2F;p&gt;
&lt;p&gt;The frontend stores data locally using Dexie.js, a library that wraps IndexedDB with a friendlier API. When a user makes changes, those changes save to the local database first. A sync queue tracks what needs to go to the server, and when the network becomes available, the queue drains automatically.&lt;&#x2F;p&gt;
&lt;p&gt;A salesperson updates CRM records on a flight with no WiFi. A technician fills out inspection forms in a basement with no signal. Someone’s home internet drops for thirty seconds while they’re submitting an important form. In all these scenarios, our app keeps working. Users might not even notice the interruption. The UI responds immediately to their actions, and synchronization happens in the background.&lt;&#x2F;p&gt;
&lt;p&gt;We use TanStack Query for data fetching, but with caching completely disabled. Every API call fetches fresh data from the server. IndexedDB is our cache, and we control exactly when and how it syncs. No more stale data bugs because some cache somewhere wasn’t invalidated properly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;database-decisions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#database-decisions&quot; aria-label=&quot;Anchor link for: database-decisions&quot;&gt;#&lt;&#x2F;a&gt;Database decisions&lt;&#x2F;h2&gt;
&lt;p&gt;PostgreSQL. UUIDs as primary keys instead of auto-incrementing integers. This makes enumeration attacks much harder, because an attacker can’t simply guess that &lt;code&gt;&#x2F;users&#x2F;124&lt;&#x2F;code&gt; follows &lt;code&gt;&#x2F;users&#x2F;123&lt;&#x2F;code&gt;, though it does not replace proper authorization checks. UUIDs also let us generate identifiers on the client before the record exists in the database.&lt;&#x2F;p&gt;
&lt;p&gt;For multi-tenancy, we use application-enforced tenant isolation. Every table that holds customer data includes an &lt;code&gt;org_id&lt;&#x2F;code&gt; column, and every query filters by it. If you want the database to enforce that boundary too, PostgreSQL row-level security is the next step. The alternative is giving each tenant their own database schema. That provides stronger isolation, but migrations have to run once per tenant, connection pools multiply, and cross-tenant queries for admin purposes become complicated. The &lt;code&gt;org_id&lt;&#x2F;code&gt; approach is simpler and scales well for most SaaS applications, as long as you’re disciplined about enforcing it everywhere.&lt;&#x2F;p&gt;
&lt;p&gt;We also have a strict rule: no random data in tests. We don’t use Faker. Every test uses explicit, predictable inputs. When a test fails, it fails the same way every time you run it. You can debug it, reproduce it, and fix it. Random test data causes tests that fail one time in twenty for reasons nobody can reproduce.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;authentication&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#authentication&quot; aria-label=&quot;Anchor link for: authentication&quot;&gt;#&lt;&#x2F;a&gt;Authentication&lt;&#x2F;h2&gt;
&lt;p&gt;Most tutorials get authentication wrong in ways that create real security vulnerabilities.&lt;&#x2F;p&gt;
&lt;p&gt;We use JWT tokens with a two-token system. The access token is short-lived, expiring after 15 minutes. It’s stateless, so the backend validates it without touching the database. The refresh token lasts 7 days and is stored in the database. When the access token expires, the frontend uses the refresh token to get a new one.&lt;&#x2F;p&gt;
&lt;p&gt;Because refresh tokens live in the database, we can revoke them instantly. When a user clicks “log out of all devices,” it actually works. We delete their refresh tokens, and within 15 minutes every session everywhere is invalidated.&lt;&#x2F;p&gt;
&lt;p&gt;Both tokens live in httpOnly cookies rather than localStorage. JavaScript cannot read httpOnly cookies, which means an XSS vulnerability cannot simply exfiltrate the tokens the way it can from localStorage. But cookies change the threat model rather than eliminating it: you still need &lt;code&gt;SameSite&lt;&#x2F;code&gt; settings and CSRF protection or strict origin checks on sensitive endpoints. Most tutorials store JWTs in localStorage because it’s simpler, but it leaves users vulnerable to script injection.&lt;&#x2F;p&gt;
&lt;p&gt;Password hashing uses Argon2, OWASP’s current recommendation over bcrypt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;libraries&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#libraries&quot; aria-label=&quot;Anchor link for: libraries&quot;&gt;#&lt;&#x2F;a&gt;Libraries&lt;&#x2F;h2&gt;
&lt;p&gt;For JWT handling, we use Joken instead of Guardian. Guardian is popular but tries to do too much. It has opinions about plugs, permissions, token types. We found ourselves fighting these abstractions. Joken just encodes and decodes tokens. We handle the rest.&lt;&#x2F;p&gt;
&lt;p&gt;Oban handles background jobs. Unlike Sidekiq or Celery, Oban uses PostgreSQL as its backend instead of Redis. One less service to run. Job state is transactional with your application data. You can insert a database record and enqueue a job in the same transaction, with the guarantee that either both happen or neither does.&lt;&#x2F;p&gt;
&lt;p&gt;On the frontend: Zustand for client state, TanStack Query for API calls, React Hook Form with Zod for forms. For components, shadcn&#x2F;ui built on Radix primitives. Radix handles accessibility correctly, which is hard to do from scratch.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deployment&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#deployment&quot; aria-label=&quot;Anchor link for: deployment&quot;&gt;#&lt;&#x2F;a&gt;Deployment&lt;&#x2F;h2&gt;
&lt;p&gt;We deploy to bare metal servers running NixOS. No Docker in production. No Kubernetes.&lt;&#x2F;p&gt;
&lt;p&gt;Kubernetes solves problems of scale that most SaaS applications don’t have. For a typical SaaS with a handful of services, it adds operational complexity without proportional benefits. You end up managing Kubernetes instead of building your product.&lt;&#x2F;p&gt;
&lt;p&gt;Our setup is simple. systemd supervises the Phoenix processes. Caddy handles TLS and reverse proxying, automatically getting certificates from Let’s Encrypt. When we deploy, we push the new NixOS configuration to our servers using deploy-rs. The switch is atomic. If something goes wrong, we roll back in seconds.&lt;&#x2F;p&gt;
&lt;p&gt;Secrets are encrypted in the git repository using agenix. Each server has its own age encryption key, and secrets are decrypted at deployment time on the target machine.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;observability&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#observability&quot; aria-label=&quot;Anchor link for: observability&quot;&gt;#&lt;&#x2F;a&gt;Observability&lt;&#x2F;h2&gt;
&lt;p&gt;We set up logging, metrics, and error tracking before writing the first feature. Every team says they will add observability later. They never do.&lt;&#x2F;p&gt;
&lt;p&gt;Logs are structured JSON. Every entry includes a request ID, user ID, and organization ID. These logs ship to Grafana Loki through Promtail.&lt;&#x2F;p&gt;
&lt;p&gt;The request ID is generated when a request enters our system and propagates through everything: API calls, background jobs, external service calls. When a user reports a problem and we have their request ID, we can trace exactly what happened across the entire system.&lt;&#x2F;p&gt;
&lt;p&gt;Metrics go to Prometheus, errors to Sentry. Dashboards and alerts exist before the first feature because retrofitting them later never happens.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;build-order&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#build-order&quot; aria-label=&quot;Anchor link for: build-order&quot;&gt;#&lt;&#x2F;a&gt;Build order&lt;&#x2F;h2&gt;
&lt;p&gt;First comes the foundation: Nix configuration, Makefile, project structure, database setup. It feels like yak shaving until the first time it saves you.&lt;&#x2F;p&gt;
&lt;p&gt;Second, we build admin tools. A dashboard for internal use. User impersonation, which lets us log in as any user to see what they see. Seed data that creates realistic test scenarios. You need to demo to stakeholders before the product is done. You need to debug issues by experiencing the product as users do.&lt;&#x2F;p&gt;
&lt;p&gt;Third is authentication, because almost everything else depends on knowing who the user is.&lt;&#x2F;p&gt;
&lt;p&gt;Then the actual product features. Polish like error handling, loading states, and accessibility comes last but isn’t optional.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-full-guide&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-full-guide&quot; aria-label=&quot;Anchor link for: the-full-guide&quot;&gt;#&lt;&#x2F;a&gt;The full guide&lt;&#x2F;h2&gt;
&lt;p&gt;The complete guide is at &lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;unbalancedparentheses&#x2F;saas_guidelines&quot;&gt;github.com&#x2F;unbalancedparentheses&#x2F;saas_guidelines&lt;&#x2F;a&gt;. Database connection pooling, rate limiting, circuit breakers, health checks, graceful shutdown, disaster recovery, and more.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Unprepared for What&#x27;s Coming</title>
        <published>2026-01-08T00:00:00+00:00</published>
        <updated>2026-01-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/les-circuits-longs/unprepared/"/>
        <id>https://federicocarrone.com/series/les-circuits-longs/unprepared/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/series/les-circuits-longs/unprepared/">&lt;p&gt;Humanity is completely unprepared for what’s coming.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve been talking with partners, employees, and countless people over the last few weeks. I’m amazed by most people’s inability to adapt or even grasp second order effects of what’s coming. They don’t even want to think about the consequences. Some of the smartest people I’ve met in my life are trying to avoid accepting the reality: it’s very likely we will have tools that are able to do almost everything better than a human in a very short timeline. It’s very likely that even those of us who can generally adapt quickly won’t be able to overcome this tsunami.&lt;&#x2F;p&gt;
&lt;p&gt;We will experience one of the biggest deflationary shocks in history. Only robotics combined with AI could be bigger than this.&lt;&#x2F;p&gt;
&lt;p&gt;I find it almost absurd to watch so many YouTube channels and X accounts showing you how to create your own simple app or SaaS. If anybody can build things fast, what do you think will happen? Is there demand for thousands of applications of every kind? During the last 20 years some of the smartest people alive battled for attention of people by building software and the limitation was execution costs, speed and distribution.&lt;&#x2F;p&gt;
&lt;p&gt;Right, but I’m forgetting that people say it’s not the time of implementation anymore. In theory, we’re now in the time of ideas. So what happens when someone has a good idea and anyone can copy it in days?&lt;&#x2F;p&gt;
&lt;p&gt;If implementation becomes worthless, what remains? Perhaps taste, distribution, or maybe in some cases deep domain expertise. But even those moats are eroding fast.&lt;&#x2F;p&gt;
&lt;p&gt;What makes this different from past disruptions is the pace. Previous technological shifts gave people decades to adapt. This one might give them months.&lt;&#x2F;p&gt;
&lt;p&gt;We built this. And yet it feels like it’s happening to us, not by us. The strange position of being both the creator and the displaced. This is going to be very sad and fun at the same time. Happy to be alive during this time.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Type Systems: From Generics to Dependent Types</title>
        <published>2026-01-01T00:00:00+00:00</published>
        <updated>2026-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/articles/type-systems/"/>
        <id>https://federicocarrone.com/articles/type-systems/</id>
        
        <summary type="html">&lt;p&gt;Every type error you’ve ever cursed at was a bug caught before production. Type systems reject nonsense at compile time so you don’t discover it at 3 AM. But they vary wildly in what they can express and what guarantees they provide.&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>The Concrete Programming Language: Systems Programming for Formal Reasoning</title>
        <published>2025-12-26T00:00:00+00:00</published>
        <updated>2025-12-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/concrete/the-concrete-programming-language-systems-programming-for-formal-reasoning/"/>
        <id>https://federicocarrone.com/series/concrete/the-concrete-programming-language-systems-programming-for-formal-reasoning/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/series/concrete/the-concrete-programming-language-systems-programming-for-formal-reasoning/">&lt;p&gt;There’s a tension at the heart of systems programming. We want languages expressive enough to build complex systems, yet simple enough to reason about with confidence. We want performance without sacrificing safety. We want the freedom to write low-level code and the guarantees that come from formal verification.&lt;&#x2F;p&gt;
&lt;p&gt;Concrete is an attempt to resolve these tensions through commitment to a single organizing principle: &lt;strong&gt;every design choice must answer the question, can a machine reason about this?&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;on-this-specification&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#on-this-specification&quot; aria-label=&quot;Anchor link for: on-this-specification&quot;&gt;#&lt;&#x2F;a&gt;On This Specification&lt;&#x2F;h2&gt;
&lt;p&gt;This document describes what we’re building, not what we’ve finished building. The kernel formalization in Lean is ongoing work. Until that formalization is complete, this specification likely contains mistakes, ambiguities, and internal contradictions.&lt;&#x2F;p&gt;
&lt;p&gt;We state this not as an apology but as a feature of our approach. Most language specifications accumulate contradictions silently over years, edge cases where the spec says one thing and the implementation does another, or where two parts of the spec conflict in ways nobody noticed. These contradictions become load-bearing bugs that can never be fixed without breaking existing code.&lt;&#x2F;p&gt;
&lt;p&gt;By designing Concrete around a formally verified kernel from the start, we force these contradictions into the open. When we formalize a feature in Lean, the proof assistant will reject inconsistencies. Features that seem reasonable on paper will turn out to be unsound, and we’ll have to redesign them. This is the point. We’d rather discover that our linearity rules have a hole &lt;em&gt;before&lt;&#x2F;em&gt; a million lines of code depend on the broken behavior.&lt;&#x2F;p&gt;
&lt;p&gt;The specification and the formalization will co-evolve. As we prove properties in Lean, we’ll update this document. As we write this document, we’ll discover what needs proving. The goal is convergence: eventually, this specification will be a human-readable projection of a machine-checked artifact.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;current-implementation-status&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#current-implementation-status&quot; aria-label=&quot;Anchor link for: current-implementation-status&quot;&gt;#&lt;&#x2F;a&gt;Current Implementation Status&lt;&#x2F;h3&gt;
&lt;p&gt;The compiler is now a full Lean 4 implementation with more than 370 passing end-to-end tests plus a separate SSA-specific suite. Today Concrete has:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;a staged Lean 4 compiler pipeline: Parse, Resolve, Check, Elab, CoreCanonicalize, CoreCheck, Mono, Lower, SSAVerify, SSACleanup, EmitSSA, clang&lt;&#x2F;li&gt;
&lt;li&gt;strict LL(1) parser cleanup landed in the implementation, not just as a design goal&lt;&#x2F;li&gt;
&lt;li&gt;explicit cacheable artifact types at each pipeline boundary (&lt;code&gt;Pipeline.lean&lt;&#x2F;code&gt;), with composable runner functions and a shared frontend helper&lt;&#x2F;li&gt;
&lt;li&gt;a summary-based frontend where &lt;code&gt;FileSummary&lt;&#x2F;code&gt; and &lt;code&gt;ResolvedImports&lt;&#x2F;code&gt; form the cross-file boundary, with prebuilt function, extern, and impl-method signatures reused across Resolve, Check, and Elab&lt;&#x2F;li&gt;
&lt;li&gt;structured diagnostics across all semantic passes with native &lt;code&gt;Except Diagnostics&lt;&#x2F;code&gt; transport, range-capable spans, hint text, and coarse-grained multi-error accumulation&lt;&#x2F;li&gt;
&lt;li&gt;SSA optimizations and backend cleanup: constant folding, dead code elimination, CFG cleanup, trivial phi&#x2F;copy cleanup, and recent lowering fixes around scope handling and string deduplication&lt;&#x2F;li&gt;
&lt;li&gt;a four-part low-level trust model: capabilities (semantic effects in public signatures), &lt;code&gt;trusted fn&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;trusted impl&lt;&#x2F;code&gt; (internal pointer-level unsafety behind a safe API), &lt;code&gt;trusted extern fn&lt;&#x2F;code&gt; (narrow audited foreign bindings), and &lt;code&gt;with(Unsafe)&lt;&#x2F;code&gt; (foreign or semantically dangerous boundaries)&lt;&#x2F;li&gt;
&lt;li&gt;capability polymorphism&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;newtype&lt;&#x2F;code&gt; with zero-cost nominal wrappers&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;#[repr(C)]&lt;&#x2F;code&gt;, &lt;code&gt;#[repr(packed)]&lt;&#x2F;code&gt;, &lt;code&gt;#[repr(align(N))]&lt;&#x2F;code&gt;, &lt;code&gt;sizeof::&amp;lt;T&amp;gt;()&lt;&#x2F;code&gt;, and &lt;code&gt;alignof::&amp;lt;T&amp;gt;()&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;audit-focused compiler outputs: &lt;code&gt;--report caps|unsafe|layout|interface|mono&lt;&#x2F;code&gt;, with dedicated consistency tests for those reports&lt;&#x2F;li&gt;
&lt;li&gt;a built-in test runner (&lt;code&gt;--test&lt;&#x2F;code&gt;) with &lt;code&gt;#[test]&lt;&#x2F;code&gt; tracked through the full IR pipeline&lt;&#x2F;li&gt;
&lt;li&gt;a much larger stdlib surface than the earlier drafts: more than 30 modules spanning foundational containers&#x2F;views, systems modules, formatting&#x2F;parsing, hashing, randomness, time, and testing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;HashMap&amp;lt;K, V&amp;gt;&lt;&#x2F;code&gt; and &lt;code&gt;HashSet&amp;lt;K&amp;gt;&lt;&#x2F;code&gt; with explicit fn-pointer hash&#x2F;eq rather than hidden trait-object or representation-based dispatch&lt;&#x2F;li&gt;
&lt;li&gt;an ongoing builtin-vs-stdlib cleanup: compiler magic is being deliberately shrunk so more of the user-facing surface lives in ordinary stdlib code and traits&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;What it does &lt;strong&gt;not&lt;&#x2F;strong&gt; yet have is the final thing that makes the long-term vision unique:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;a fully formalized kernel connected end to end to the implemented compiler&lt;&#x2F;li&gt;
&lt;li&gt;verified elaboration&#x2F;code generation&lt;&#x2F;li&gt;
&lt;li&gt;a mature tooling stack (formatter, package manager, linter)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;stability-promise&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#stability-promise&quot; aria-label=&quot;Anchor link for: stability-promise&quot;&gt;#&lt;&#x2F;a&gt;Stability Promise&lt;&#x2F;h3&gt;
&lt;p&gt;The kernel is versioned separately from the surface language. Once the kernel reaches 1.0, it is frozen. New surface features must elaborate to existing kernel constructs. If a feature can’t be expressed in the kernel, the feature doesn’t ship.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-core-idea&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-core-idea&quot; aria-label=&quot;Anchor link for: the-core-idea&quot;&gt;#&lt;&#x2F;a&gt;The Core Idea&lt;&#x2F;h2&gt;
&lt;p&gt;Most languages treat verification as something bolted on after the fact. You write code, then maybe you write tests, maybe you run a linter, maybe you bring in a theorem prover for critical sections. The language itself remains agnostic about provability.&lt;&#x2F;p&gt;
&lt;p&gt;Concrete inverts this relationship. The language is &lt;em&gt;designed around&lt;&#x2F;em&gt; a verified core, a small kernel calculus formalized in Lean 4 with mechanically-checked proofs of progress, preservation, linearity soundness, and effect soundness. The surface language exists only to elaborate into this kernel.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;what-correct-means&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-correct-means&quot; aria-label=&quot;Anchor link for: what-correct-means&quot;&gt;#&lt;&#x2F;a&gt;What “Correct” Means&lt;&#x2F;h3&gt;
&lt;p&gt;When we say a type-checked program is “correct by construction,” we mean correct with respect to specific properties:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory safety&lt;&#x2F;strong&gt;: no use-after-free, no double-free, no dangling references&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Resource safety&lt;&#x2F;strong&gt;: linear values consumed exactly once, no leaks&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Effect correctness&lt;&#x2F;strong&gt;: declared capabilities match actual effects&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We do not guarantee termination. Recursive functions may diverge. We do not guarantee liveness or deadlock freedom. These properties are outside the current verification scope. The kernel proves progress (well-typed programs don’t get stuck) and preservation (types are maintained during evaluation), which together yield memory and resource safety, not total correctness.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-trust-boundary&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-trust-boundary&quot; aria-label=&quot;Anchor link for: the-trust-boundary&quot;&gt;#&lt;&#x2F;a&gt;The Trust Boundary&lt;&#x2F;h3&gt;
&lt;p&gt;The kernel type system and its properties are mechanically checked in Lean. The current compiler is also implemented in Lean 4 end to end. What remains trusted is the Lean proof checker, the Lean compiler implementation that elaborates surface programs and emits code, and the backend toolchain that turns generated LLVM IR into machine code. Verifying the elaborator and code generator is still future work.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;design-principles&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#design-principles&quot; aria-label=&quot;Anchor link for: design-principles&quot;&gt;#&lt;&#x2F;a&gt;Design Principles&lt;&#x2F;h2&gt;
&lt;p&gt;From this kernel-centric design, six principles follow:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pure by default&lt;&#x2F;strong&gt; — Functions without capability annotations are pure: no side effects, no allocation&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Explicit capabilities&lt;&#x2F;strong&gt; — All effects tracked in function signatures&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Linear by default&lt;&#x2F;strong&gt; — Values consumed exactly once unless marked &lt;code&gt;Copy&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;No hidden control flow&lt;&#x2F;strong&gt; — All function calls, cleanup, and allocation visible in source&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fits in your head&lt;&#x2F;strong&gt; — Small enough for one person to fully understand&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;LL(1) grammar&lt;&#x2F;strong&gt; — Parseable with single token lookahead, no ambiguity&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;the-compilation-pipeline&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-compilation-pipeline&quot; aria-label=&quot;Anchor link for: the-compilation-pipeline&quot;&gt;#&lt;&#x2F;a&gt;The Compilation Pipeline&lt;&#x2F;h2&gt;
&lt;p&gt;The compiler is a single Lean 4 codebase end to end. The pipeline looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Source Code (.con)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Parse
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Resolve
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Check
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Elab
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   CoreCanonicalize
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   CoreCheck
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Mono
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Lower
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   SSAVerify
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   SSACleanup
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   EmitSSA (LLVM IR text)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   clang &#x2F; system linker
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;       ↓
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   Native Machine Code
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Each pass has a narrow job:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parse&lt;&#x2F;strong&gt; builds the surface AST with spans using an LL(1) parser.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Resolve&lt;&#x2F;strong&gt; validates imports, top-level names, type names, enum variants, and other declaration-level references.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Check&lt;&#x2F;strong&gt; enforces type consistency, linearity, borrowing, capabilities, and FFI-safety boundaries.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Elab&lt;&#x2F;strong&gt; lowers the surface language into typed Core IR.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;CoreCheck&lt;&#x2F;strong&gt; re-validates the important semantic invariants over the explicit Core representation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mono&lt;&#x2F;strong&gt; specializes generic code into concrete instances.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Lower&lt;&#x2F;strong&gt; turns Core into explicit SSA blocks and control flow.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SSAVerify&lt;&#x2F;strong&gt; checks dominance, phi correctness, and structural SSA invariants.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SSACleanup&lt;&#x2F;strong&gt; performs local simplifications and cleanup before code emission.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;EmitSSA&lt;&#x2F;strong&gt; turns verified SSA into LLVM IR text.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This architecture matters because it keeps the compiler understandable. The old “parse, check, directly emit LLVM” shape is gone. Concrete now has a real semantic boundary at Core IR and a real backend boundary at SSA.&lt;&#x2F;p&gt;
&lt;p&gt;The long-term design still includes a smaller verified kernel calculus below the current implementation. The summary-based frontend is in place: &lt;code&gt;FileSummary&lt;&#x2F;code&gt; acts as the declaration-level interface artifact, &lt;code&gt;ResolvedImports&lt;&#x2F;code&gt; is the per-module imported-summary artifact, and Check&#x2F;Elab share a summary-driven import path. Diagnostics now use native &lt;code&gt;Except Diagnostics&lt;&#x2F;code&gt; transport with range-capable spans, hint text, and coarse-grained multi-error accumulation. The immediate compiler direction is to keep shrinking compiler magic at the builtin boundary, deepen and harden the stdlib surface, and push formalization over the cleaned Core&#x2F;SSA pipeline.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;no-hidden-control-flow&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#no-hidden-control-flow&quot; aria-label=&quot;Anchor link for: no-hidden-control-flow&quot;&gt;#&lt;&#x2F;a&gt;No Hidden Control Flow&lt;&#x2F;h2&gt;
&lt;p&gt;When you read Concrete code, what you see is what executes.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No implicit function calls.&lt;&#x2F;strong&gt; Operators are not overloaded methods. &lt;code&gt;a + b&lt;&#x2F;code&gt; on integers is primitive addition, not a call to &lt;code&gt;Add::add&lt;&#x2F;code&gt;. There are no implicit conversions that invoke code.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No implicit destruction.&lt;&#x2F;strong&gt; The compiler never inserts destructor calls. Concrete requires you to write &lt;code&gt;defer destroy(x)&lt;&#x2F;code&gt;. You see the cleanup in the source.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No implicit allocation.&lt;&#x2F;strong&gt; Allocation happens when you call a function with &lt;code&gt;Alloc&lt;&#x2F;code&gt; capability bound to an allocator. String concatenation, collection growth: if they allocate, you see &lt;code&gt;with(Alloc)&lt;&#x2F;code&gt; in the signature.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No invisible error handling.&lt;&#x2F;strong&gt; Errors propagate only where &lt;code&gt;?&lt;&#x2F;code&gt; appears. There are no exceptions unwinding the stack behind your back.&lt;&#x2F;p&gt;
&lt;p&gt;The cost is verbosity. The benefit is that reading the code tells you what the code does. For auditing, debugging, and formal verification, this tradeoff is correct.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;types&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#types&quot; aria-label=&quot;Anchor link for: types&quot;&gt;#&lt;&#x2F;a&gt;Types&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;primitives&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#primitives&quot; aria-label=&quot;Anchor link for: primitives&quot;&gt;#&lt;&#x2F;a&gt;Primitives&lt;&#x2F;h3&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Bool
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Int, i8, i16, i32
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Uint, u8, u16, u32
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Float32, Float64
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Char, String
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Unit
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;algebraic-data-types&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#algebraic-data-types&quot; aria-label=&quot;Anchor link for: algebraic-data-types&quot;&gt;#&lt;&#x2F;a&gt;Algebraic Data Types&lt;&#x2F;h3&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;enum Option&amp;lt;T&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Some { value: T },
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    None {},
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;enum Result&amp;lt;T, E&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Ok { value: T },
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Err { error: E },
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;enum List&amp;lt;T&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Nil {},
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Cons { head: T, tail: List&amp;lt;T&amp;gt; },
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;records&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#records&quot; aria-label=&quot;Anchor link for: records&quot;&gt;#&lt;&#x2F;a&gt;Records&lt;&#x2F;h3&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;struct Point {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    x: Float64,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    y: Float64,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;standard-library-types&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#standard-library-types&quot; aria-label=&quot;Anchor link for: standard-library-types&quot;&gt;#&lt;&#x2F;a&gt;Standard Library Types&lt;&#x2F;h3&gt;
&lt;p&gt;For domains where precision matters, the standard library includes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Decimal&lt;&#x2F;strong&gt;: fixed-point decimal arithmetic for financial calculations&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;BigInt&lt;&#x2F;strong&gt;: arbitrary-precision integers&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;BigDecimal&lt;&#x2F;strong&gt;: arbitrary-precision decimals&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These are planned standard library types, not yet implemented. They will avoid floating-point representation errors in financial systems and cryptographic applications.&lt;&#x2F;p&gt;
&lt;p&gt;The current implementation already provides a real low-level stdlib spine: &lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;HashMap&amp;lt;K, V&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;HashSet&amp;lt;K&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;Deque&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;BinaryHeap&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;OrderedMap&amp;lt;K, V&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;OrderedSet&amp;lt;K&amp;gt;&lt;&#x2F;code&gt;, &lt;code&gt;BitSet&lt;&#x2F;code&gt;, plus systems modules such as &lt;code&gt;fs&lt;&#x2F;code&gt;, &lt;code&gt;env&lt;&#x2F;code&gt;, &lt;code&gt;process&lt;&#x2F;code&gt;, &lt;code&gt;net&lt;&#x2F;code&gt;, &lt;code&gt;fmt&lt;&#x2F;code&gt;, &lt;code&gt;time&lt;&#x2F;code&gt;, &lt;code&gt;rand&lt;&#x2F;code&gt;, &lt;code&gt;parse&lt;&#x2F;code&gt;, and &lt;code&gt;test&lt;&#x2F;code&gt;. The important architectural trend is that these are increasingly ordinary stdlib surfaces rather than compiler-known public APIs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;linearity-and-copy&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#linearity-and-copy&quot; aria-label=&quot;Anchor link for: linearity-and-copy&quot;&gt;#&lt;&#x2F;a&gt;Linearity and Copy&lt;&#x2F;h2&gt;
&lt;p&gt;All values in Concrete are linear by default. A linear value must be consumed exactly once, not zero times (that’s a leak), not twice (that’s a double-free). This follows the same strict direction as Austral: forgetting a value is rejected rather than silently accepted.&lt;&#x2F;p&gt;
&lt;p&gt;Consumption happens when you pass the value to a function that takes ownership, return it, destructure it via pattern matching, or explicitly call &lt;code&gt;destroy(x)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn example!() {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let f = open(&amp;quot;data.txt&amp;quot;)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    defer destroy(f)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let content = read(&amp;amp;f)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &#x2F;&#x2F; destroy(f) runs here because of defer
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If &lt;code&gt;f&lt;&#x2F;code&gt; isn’t consumed on all paths, the program is rejected. If you try to use &lt;code&gt;f&lt;&#x2F;code&gt; after moving it, the program is rejected. This is compile-time enforcement, not runtime checking.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-copy-marker&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-copy-marker&quot; aria-label=&quot;Anchor link for: the-copy-marker&quot;&gt;#&lt;&#x2F;a&gt;The Copy Marker&lt;&#x2F;h3&gt;
&lt;p&gt;Some types escape linear restrictions. The rules for &lt;code&gt;Copy&lt;&#x2F;code&gt; are:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Copy is explicit and opt-in.&lt;&#x2F;strong&gt; You must mark a type as &lt;code&gt;Copy&lt;&#x2F;code&gt;; it is never inferred.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Copy is structural.&lt;&#x2F;strong&gt; A type can be &lt;code&gt;Copy&lt;&#x2F;code&gt; only if all its fields are &lt;code&gt;Copy&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Copy types cannot have destructors.&lt;&#x2F;strong&gt; If a type defines &lt;code&gt;destroy&lt;&#x2F;code&gt;, it cannot be &lt;code&gt;Copy&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Copy types cannot contain linear fields.&lt;&#x2F;strong&gt; A &lt;code&gt;Copy&lt;&#x2F;code&gt; record with a &lt;code&gt;File&lt;&#x2F;code&gt; field is rejected.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;struct Copy Point {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    x: Float64,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    y: Float64,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The primitive numeric types and &lt;code&gt;Bool&lt;&#x2F;code&gt; are built-in &lt;code&gt;Copy&lt;&#x2F;code&gt; types. &lt;code&gt;String&lt;&#x2F;code&gt; is linear. For generic types, linearity depends on the type parameter: &lt;code&gt;Option&amp;lt;Int&amp;gt;&lt;&#x2F;code&gt; is &lt;code&gt;Copy&lt;&#x2F;code&gt; because &lt;code&gt;Int&lt;&#x2F;code&gt; is; &lt;code&gt;Option&amp;lt;File&amp;gt;&lt;&#x2F;code&gt; is linear because &lt;code&gt;File&lt;&#x2F;code&gt; is.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;Copy&lt;&#x2F;code&gt; is not an escape hatch from thinking about resources. It’s a marker for types that have no cleanup requirements and can be freely duplicated.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;destructors&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#destructors&quot; aria-label=&quot;Anchor link for: destructors&quot;&gt;#&lt;&#x2F;a&gt;Destructors&lt;&#x2F;h3&gt;
&lt;p&gt;A linear type may define a destructor:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;struct File {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    handle: FileHandle,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;impl Destroy for File with(File) {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn destroy(self) {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        close_handle(self.handle);
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The destructor takes ownership of &lt;code&gt;self&lt;&#x2F;code&gt;, may require capabilities, and runs exactly once when explicitly invoked. &lt;code&gt;destroy(x)&lt;&#x2F;code&gt; is only valid if the type defines a destructor. A type without a destructor must be consumed by moving, returning, or destructuring.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;defer&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#defer&quot; aria-label=&quot;Anchor link for: defer&quot;&gt;#&lt;&#x2F;a&gt;Defer&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;code&gt;defer&lt;&#x2F;code&gt; statement schedules cleanup at scope exit, borrowed directly from Zig and Go:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn process_files!() {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let f1 = open(&amp;quot;a.txt&amp;quot;)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    defer destroy(f1)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let f2 = open(&amp;quot;b.txt&amp;quot;)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    defer destroy(f2)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &#x2F;&#x2F; When scope exits:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &#x2F;&#x2F; 1. destroy(f2) runs
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &#x2F;&#x2F; 2. destroy(f1) runs
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Multiple &lt;code&gt;defer&lt;&#x2F;code&gt; statements execute in reverse order (LIFO). &lt;code&gt;defer&lt;&#x2F;code&gt; runs at scope exit including early returns and error propagation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;defer-reserves-the-value&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#defer-reserves-the-value&quot; aria-label=&quot;Anchor link for: defer-reserves-the-value&quot;&gt;#&lt;&#x2F;a&gt;Defer Reserves the Value&lt;&#x2F;h3&gt;
&lt;p&gt;When a value is scheduled with &lt;code&gt;defer destroy(x)&lt;&#x2F;code&gt;, it becomes reserved. The rules:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;After &lt;code&gt;defer destroy(x)&lt;&#x2F;code&gt;, you cannot move &lt;code&gt;x&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;After &lt;code&gt;defer destroy(x)&lt;&#x2F;code&gt;, you cannot destroy &lt;code&gt;x&lt;&#x2F;code&gt; again&lt;&#x2F;li&gt;
&lt;li&gt;After &lt;code&gt;defer destroy(x)&lt;&#x2F;code&gt;, you cannot &lt;code&gt;defer destroy(x)&lt;&#x2F;code&gt; again&lt;&#x2F;li&gt;
&lt;li&gt;After &lt;code&gt;defer destroy(x)&lt;&#x2F;code&gt;, you cannot create borrows of &lt;code&gt;x&lt;&#x2F;code&gt; that might overlap the deferred destruction point&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The value is still owned by the current scope until exit, but it is no longer available for use. This prevents double destruction and dangling borrows.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;borrowing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#borrowing&quot; aria-label=&quot;Anchor link for: borrowing&quot;&gt;#&lt;&#x2F;a&gt;Borrowing&lt;&#x2F;h2&gt;
&lt;p&gt;Borrowing defers consumption without extending lifetime or weakening linearity.&lt;&#x2F;p&gt;
&lt;p&gt;References let you use values without consuming them. Concrete’s borrowing model uses lexical regions, but those regions stay out of function signatures in the current surface language.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;borrow f as fref in R {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &#x2F;&#x2F; fref has type &amp;amp;File
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &#x2F;&#x2F; f is unusable in this block
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let len = length(fref);
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;&#x2F; f is usable again
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Functions simply accept references directly:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn length(file: &amp;amp;File) -&amp;gt; Uint {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The checker enforces that a reference created inside a borrow region cannot escape that region.&lt;&#x2F;p&gt;
&lt;p&gt;For single-expression borrows, the region is anonymous:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;let len = length(&amp;amp;f)  &#x2F;&#x2F; borrows f for just this call
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;borrowing-rules&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#borrowing-rules&quot; aria-label=&quot;Anchor link for: borrowing-rules&quot;&gt;#&lt;&#x2F;a&gt;Borrowing Rules&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;While borrowed, the original is unusable&lt;&#x2F;li&gt;
&lt;li&gt;Multiple immutable borrows allowed&lt;&#x2F;li&gt;
&lt;li&gt;Mutable borrows exclusive: one &lt;code&gt;&amp;amp;mut T&lt;&#x2F;code&gt; at a time, no simultaneous &lt;code&gt;&amp;amp;T&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;References cannot escape their region&lt;&#x2F;li&gt;
&lt;li&gt;Nested borrows of the same owned value forbidden&lt;&#x2F;li&gt;
&lt;li&gt;Derived references can’t outlive the original’s region&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;capabilities&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#capabilities&quot; aria-label=&quot;Anchor link for: capabilities&quot;&gt;#&lt;&#x2F;a&gt;Capabilities&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;what-capabilities-are&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-capabilities-are&quot; aria-label=&quot;Anchor link for: what-capabilities-are&quot;&gt;#&lt;&#x2F;a&gt;What Capabilities Are&lt;&#x2F;h3&gt;
&lt;p&gt;A capability is a static permission annotation on a function. It declares which effects the function may perform. Capabilities are not runtime values—they cannot be created, passed, stored, or inspected at runtime. They exist only at the type level, checked by the compiler and erased before execution.&lt;&#x2F;p&gt;
&lt;p&gt;Capabilities are predefined names. Users cannot define new capabilities or create composite capability types. Function signatures may combine predefined capabilities using &lt;code&gt;+&lt;&#x2F;code&gt; in the &lt;code&gt;with()&lt;&#x2F;code&gt; clause, but only among names exported by the platform’s capability universe. The set of capabilities is fixed per target platform and finite—user code cannot extend it. There is no capability arithmetic, no capability inheritance, no way to forge a capability your caller didn’t have.&lt;&#x2F;p&gt;
&lt;p&gt;Capabilities that can be manufactured at runtime aren’t capabilities—they’re tokens.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;purity&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#purity&quot; aria-label=&quot;Anchor link for: purity&quot;&gt;#&lt;&#x2F;a&gt;Purity&lt;&#x2F;h3&gt;
&lt;p&gt;Concrete is &lt;strong&gt;pure by default&lt;&#x2F;strong&gt;, following Austral’s approach to effect tracking. A function without capability annotations cannot perform IO, cannot allocate, cannot mutate external state. It computes a result from its inputs, nothing more.&lt;&#x2F;p&gt;
&lt;p&gt;Purity in Concrete has a precise definition: a function is pure if and only if it declares no capabilities and does not require &lt;code&gt;Alloc&lt;&#x2F;code&gt;. Equivalently, purity means an empty capability set.&lt;&#x2F;p&gt;
&lt;p&gt;Pure functions may use stack allocation and compile-time constants—these are not effects. Pure functions may diverge—termination is orthogonal to purity. A non-terminating function that performs no IO and touches no heap is still pure. This separates effect-freedom (what Concrete tracks) from totality (which Concrete does not guarantee).&lt;&#x2F;p&gt;
&lt;p&gt;Purity enables equational reasoning: a pure function called twice with the same arguments yields the same result. Totality would enable stronger claims about program termination, but enforcing it would require restricting recursion, which conflicts with systems programming.&lt;&#x2F;p&gt;
&lt;p&gt;When a function needs effects, it declares them:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn read_file(path: String) with(File) -&amp;gt; String {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn process_data() with(File, Network, Alloc) -&amp;gt; Result {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Capabilities propagate monotonically. If &lt;code&gt;f&lt;&#x2F;code&gt; calls &lt;code&gt;g&lt;&#x2F;code&gt;, and &lt;code&gt;g&lt;&#x2F;code&gt; requires &lt;code&gt;File&lt;&#x2F;code&gt;, then &lt;code&gt;f&lt;&#x2F;code&gt; must declare &lt;code&gt;File&lt;&#x2F;code&gt; too. No implicit granting, no ambient authority. The compiler enforces this transitively.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-std-capability&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-std-capability&quot; aria-label=&quot;Anchor link for: the-std-capability&quot;&gt;#&lt;&#x2F;a&gt;The Std Capability&lt;&#x2F;h3&gt;
&lt;p&gt;For application entry points, Concrete provides a shorthand. The &lt;code&gt;!&lt;&#x2F;code&gt; suffix declares the &lt;code&gt;Std&lt;&#x2F;code&gt; capability:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn main!() {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    println(&amp;quot;Hello&amp;quot;)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This desugars to &lt;code&gt;fn main() with(Std)&lt;&#x2F;code&gt;. &lt;code&gt;Std&lt;&#x2F;code&gt; includes file operations, network, clock, environment, random, console, process, and allocation, but excludes &lt;code&gt;Unsafe&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Library code should prefer explicit capability lists.&lt;&#x2F;strong&gt; This is a social convention, not a mechanical enforcement. The compiler won’t reject a library function that uses &lt;code&gt;Std&lt;&#x2F;code&gt;. But explicit capabilities make dependencies auditable. &lt;code&gt;Std&lt;&#x2F;code&gt; is a convenience for applications, not a license for libraries.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;security-model&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#security-model&quot; aria-label=&quot;Anchor link for: security-model&quot;&gt;#&lt;&#x2F;a&gt;Security Model&lt;&#x2F;h3&gt;
&lt;p&gt;Capabilities don’t sandbox code. If a dependency declares &lt;code&gt;with(Network)&lt;&#x2F;code&gt;, it gets network access. What they provide is &lt;strong&gt;auditability&lt;&#x2F;strong&gt;. You can grep for &lt;code&gt;with(Network)&lt;&#x2F;code&gt; and find every function that touches the network. You can verify that your JSON parser has no capabilities. You can review dependency updates by diffing capability declarations.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;capability-polymorphism&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#capability-polymorphism&quot; aria-label=&quot;Anchor link for: capability-polymorphism&quot;&gt;#&lt;&#x2F;a&gt;Capability Polymorphism&lt;&#x2F;h3&gt;
&lt;p&gt;Concrete supports capability polymorphism:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn map&amp;lt;T, U, cap C&amp;gt;(list: List&amp;lt;T&amp;gt;, f: fn(T) with(C) -&amp;gt; U) with(C) -&amp;gt; List&amp;lt;U&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A capability variable like &lt;code&gt;C&lt;&#x2F;code&gt; is inferred from the function argument at the call site, then propagated through the caller just like any concrete capability set. This avoids duplicating generic combinators for every effect combination while keeping effect requirements explicit in the type.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;parametricity&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#parametricity&quot; aria-label=&quot;Anchor link for: parametricity&quot;&gt;#&lt;&#x2F;a&gt;Parametricity&lt;&#x2F;h3&gt;
&lt;p&gt;Generic functions cannot accidentally become effectful depending on instantiation. A function &lt;code&gt;fn map&amp;lt;T, U&amp;gt;(list: List&amp;lt;T&amp;gt;, f: fn(T) -&amp;gt; U) -&amp;gt; List&amp;lt;U&amp;gt;&lt;&#x2F;code&gt; is pure regardless of what &lt;code&gt;T&lt;&#x2F;code&gt; and &lt;code&gt;U&lt;&#x2F;code&gt; are. If &lt;code&gt;f&lt;&#x2F;code&gt; requires capabilities, that must be declared in the signature.&lt;&#x2F;p&gt;
&lt;p&gt;Capabilities are checked before monomorphization. When generic code is specialized to concrete types, capability requirements don’t change. A pure generic function stays pure at every instantiation.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;allocation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#allocation&quot; aria-label=&quot;Anchor link for: allocation&quot;&gt;#&lt;&#x2F;a&gt;Allocation&lt;&#x2F;h2&gt;
&lt;p&gt;Allocation deserves special attention because it’s often invisible. In most languages, many operations allocate behind your back: string concatenation, collection growth.&lt;&#x2F;p&gt;
&lt;p&gt;Concrete treats allocation as a capability, with explicit allocator passing inspired by Zig. Functions that allocate declare &lt;code&gt;with(Alloc)&lt;&#x2F;code&gt;. The call site binds which allocator:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn main!() {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let arena = Arena.new()
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    defer arena.deinit()
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let list = create_list&amp;lt;Int&amp;gt;() with(Alloc = arena)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    push(&amp;amp;mut list, 42) with(Alloc = arena)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Inside &lt;code&gt;with(Alloc)&lt;&#x2F;code&gt;, the bound allocator propagates through nested calls. At the boundary, you see exactly where allocation happens and which allocator serves it.&lt;&#x2F;p&gt;
&lt;p&gt;Stack allocation does not require &lt;code&gt;Alloc&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn example() {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let x: Int = 42                    &#x2F;&#x2F; stack
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let arr: [Uint8; 100] = zeroed()   &#x2F;&#x2F; stack
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Allocation-free code is provably allocation-free.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;allocator-binding-scope&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#allocator-binding-scope&quot; aria-label=&quot;Anchor link for: allocator-binding-scope&quot;&gt;#&lt;&#x2F;a&gt;Allocator Binding Scope&lt;&#x2F;h3&gt;
&lt;p&gt;Allocator binding is lexically scoped. A binding applies within the static extent of the call being evaluated and any nested calls that require &lt;code&gt;with(Alloc)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;A nested binding may shadow an outer binding:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn outer() with(Alloc) {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    inner()                         &#x2F;&#x2F; uses outer binding
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    inner() with(Alloc = arena2)    &#x2F;&#x2F; shadows within this call
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;allocator-types&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#allocator-types&quot; aria-label=&quot;Anchor link for: allocator-types&quot;&gt;#&lt;&#x2F;a&gt;Allocator Types&lt;&#x2F;h3&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;&#x2F; General-purpose heap allocator
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;let gpa = GeneralPurposeAllocator.new()
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;defer gpa.deinit()
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;&#x2F; Arena allocator, free everything at once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;let arena = Arena.new(gpa)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;defer arena.deinit()
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;&#x2F;&#x2F; Fixed buffer allocator, no heap
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;let buf: [Uint8; 1024] = zeroed()
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;let fba = FixedBufferAllocator.new(&amp;amp;buf)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;All allocators implement a common &lt;code&gt;Allocator&lt;&#x2F;code&gt; trait.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;allocator-interface&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#allocator-interface&quot; aria-label=&quot;Anchor link for: allocator-interface&quot;&gt;#&lt;&#x2F;a&gt;Allocator Interface&lt;&#x2F;h3&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;trait Allocator {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn alloc&amp;lt;T&amp;gt;(&amp;amp;mut self, value: T) -&amp;gt; Result&amp;lt;Heap&amp;lt;T&amp;gt;, AllocError&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn alloc_array&amp;lt;T&amp;gt;(&amp;amp;mut self, count: Uint) -&amp;gt; Result&amp;lt;HeapArray&amp;lt;T&amp;gt;, AllocError&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn free&amp;lt;T&amp;gt;(&amp;amp;mut self, ptr: Heap&amp;lt;T&amp;gt;) -&amp;gt; T
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn free_array&amp;lt;T&amp;gt;(&amp;amp;mut self, arr: HeapArray&amp;lt;T&amp;gt;)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn realloc_array&amp;lt;T&amp;gt;(&amp;amp;mut self, arr: HeapArray&amp;lt;T&amp;gt;, new_count: Uint) -&amp;gt; Result&amp;lt;HeapArray&amp;lt;T&amp;gt;, AllocError&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The interface is minimal. &lt;code&gt;alloc&lt;&#x2F;code&gt; returns owned heap memory, not a borrow. &lt;code&gt;alloc_array&lt;&#x2F;code&gt; handles dynamically sized buffers. &lt;code&gt;free&lt;&#x2F;code&gt; consumes heap ownership and returns the stored value. All operations take &lt;code&gt;&amp;amp;mut self&lt;&#x2F;code&gt;: allocators are stateful resources, not ambient services.&lt;&#x2F;p&gt;
&lt;p&gt;Custom allocators implement this trait. The standard library allocators (&lt;code&gt;GeneralPurposeAllocator&lt;&#x2F;code&gt;, &lt;code&gt;Arena&lt;&#x2F;code&gt;, &lt;code&gt;FixedBufferAllocator&lt;&#x2F;code&gt;) are implementations, not special cases.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;heap-ownership&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#heap-ownership&quot; aria-label=&quot;Anchor link for: heap-ownership&quot;&gt;#&lt;&#x2F;a&gt;Heap Ownership&lt;&#x2F;h3&gt;
&lt;p&gt;Heap allocation is represented explicitly in the type system:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;let p: Heap&amp;lt;Point&amp;gt; = alloc(Point { x: 1.0, y: 2.0 }) with(Alloc = arena)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;defer destroy(p)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;let x = p-&amp;gt;x
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;p-&amp;gt;y = 4.0
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;Heap&amp;lt;T&amp;gt;&lt;&#x2F;code&gt; is a linear owned type. Access goes through &lt;code&gt;-&amp;gt;&lt;&#x2F;code&gt;, which borrows the heap value and makes heap access visible at the use site. &lt;code&gt;HeapArray&amp;lt;T&amp;gt;&lt;&#x2F;code&gt; is the dynamically sized counterpart used by collections.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;error-handling&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#error-handling&quot; aria-label=&quot;Anchor link for: error-handling&quot;&gt;#&lt;&#x2F;a&gt;Error Handling&lt;&#x2F;h2&gt;
&lt;p&gt;Errors are values, using &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;&#x2F;code&gt; and the &lt;code&gt;?&lt;&#x2F;code&gt; operator for propagation:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn parse(input: String) -&amp;gt; Result&amp;lt;Config, ParseError&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn load_config!() -&amp;gt; Result&amp;lt;Config, Error&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let f = open(&amp;quot;config.toml&amp;quot;)?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    defer destroy(f)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let content = read(&amp;amp;f)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let config = parse(content)?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Ok(config)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;?&lt;&#x2F;code&gt; operator propagates errors. When &lt;code&gt;?&lt;&#x2F;code&gt; triggers an early return, all &lt;code&gt;defer&lt;&#x2F;code&gt; statements in scope run first. Cleanup happens even on error paths.&lt;&#x2F;p&gt;
&lt;p&gt;No exceptions. No panic.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;abort&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#abort&quot; aria-label=&quot;Anchor link for: abort&quot;&gt;#&lt;&#x2F;a&gt;Abort&lt;&#x2F;h3&gt;
&lt;p&gt;Abort is immediate process termination, outside normal control flow and outside the language’s semantic model. Following Zig’s approach:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Out-of-memory conditions trigger abort&lt;&#x2F;li&gt;
&lt;li&gt;Stack overflow triggers abort&lt;&#x2F;li&gt;
&lt;li&gt;Explicit &lt;code&gt;abort()&lt;&#x2F;code&gt; terminates immediately&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Deferred cleanup does not run on abort&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;defer&lt;&#x2F;code&gt; is for normal control flow, not catastrophic failure. Abort is the escape hatch when &lt;code&gt;Result&lt;&#x2F;code&gt; isn’t enough. The process stops. There are no guarantees about state after abort begins.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-you-re-giving-up&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-you-re-giving-up&quot; aria-label=&quot;Anchor link for: what-you-re-giving-up&quot;&gt;#&lt;&#x2F;a&gt;What You’re Giving Up&lt;&#x2F;h2&gt;
&lt;p&gt;Concrete is not a general-purpose language. It’s for code that must be correct: cryptographic implementations, financial systems, safety-critical software, blockchain infrastructure.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No garbage collection.&lt;&#x2F;strong&gt; Memory is managed through linear types and explicit destruction. No GC pauses, no unpredictable latency, no hidden memory pressure.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No implicit allocation.&lt;&#x2F;strong&gt; Allocation requires the &lt;code&gt;Alloc&lt;&#x2F;code&gt; capability. &lt;code&gt;grep with(Alloc)&lt;&#x2F;code&gt; finds every function that might touch the heap.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No interior mutability.&lt;&#x2F;strong&gt; All mutation flows through &lt;code&gt;&amp;amp;mut&lt;&#x2F;code&gt; references. An immutable reference &lt;code&gt;&amp;amp;T&lt;&#x2F;code&gt; guarantees immutability, no hidden mutation behind an immutable facade. This forbids patterns like shared caches and memoization behind shared references. If you need a cache, pass &lt;code&gt;&amp;amp;mut&lt;&#x2F;code&gt;. If you need lazy initialization, initialize before borrowing. For advanced patterns that genuinely require interior mutability, the standard library provides &lt;code&gt;UnsafeCell&amp;lt;T&amp;gt;&lt;&#x2F;code&gt; gated by the &lt;code&gt;Unsafe&lt;&#x2F;code&gt; capability.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No reflection, no eval, no runtime metaprogramming.&lt;&#x2F;strong&gt; All code paths are determined at compile time. There is no way to inspect types at runtime, call methods by name dynamically, or generate code during execution.&lt;&#x2F;p&gt;
&lt;p&gt;If macros are added in a future version, they will be constrained to preserve the “can a machine reason about this?” principle:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hygienic&lt;&#x2F;strong&gt; — no accidental variable capture&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Phase-separated&lt;&#x2F;strong&gt; — macro expansion completes before type checking&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Syntactic&lt;&#x2F;strong&gt; — macros transform syntax trees, not strings&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Capability-tracked&lt;&#x2F;strong&gt; — procedural macros that execute arbitrary code at compile time will require capability annotations, extending effect tracking to the compile-time phase&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;No implicit global state.&lt;&#x2F;strong&gt; All global interactions (file system, network, clock, environment) are mediated through capabilities.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No variable shadowing.&lt;&#x2F;strong&gt; Each variable name is unique within its scope.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No null.&lt;&#x2F;strong&gt; Optional values use &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No undefined behavior in safe code.&lt;&#x2F;strong&gt; Kernel semantics are fully defined and proven sound. The &lt;code&gt;Unsafe&lt;&#x2F;code&gt; capability explicitly reintroduces the possibility of undefined behavior for FFI and low-level operations.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;No concurrency primitives.&lt;&#x2F;strong&gt; The language provides no threads, no async&#x2F;await, no channels. Concurrency is a library concern. This may change, but any future concurrency model must preserve determinism and linearity, likely through structured or deterministic concurrency. This is a design constraint, not an open question.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;anti-features-summary&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#anti-features-summary&quot; aria-label=&quot;Anchor link for: anti-features-summary&quot;&gt;#&lt;&#x2F;a&gt;Anti-Features Summary&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Concrete does not have&lt;&#x2F;th&gt;&lt;th&gt;Rationale&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Garbage collection&lt;&#x2F;td&gt;&lt;td&gt;Predictable latency, explicit resource management&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Hidden control flow&lt;&#x2F;td&gt;&lt;td&gt;Auditability, debuggability&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Hidden allocation&lt;&#x2F;td&gt;&lt;td&gt;Performance visibility, allocator control&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Interior mutability&lt;&#x2F;td&gt;&lt;td&gt;Simple reasoning, verification tractability&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Reflection &#x2F; eval&lt;&#x2F;td&gt;&lt;td&gt;Static analysis, all paths known at compile time&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Global mutable state&lt;&#x2F;td&gt;&lt;td&gt;Effect tracking, reproducibility&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Variable shadowing&lt;&#x2F;td&gt;&lt;td&gt;Clarity, fewer subtle bugs&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Null&lt;&#x2F;td&gt;&lt;td&gt;Type safety via &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Exceptions&lt;&#x2F;td&gt;&lt;td&gt;Errors as values, explicit propagation&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Implicit conversions&lt;&#x2F;td&gt;&lt;td&gt;No silent data loss or coercion&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Operator overloading&lt;&#x2F;td&gt;&lt;td&gt;Operators are primitive, not trait methods&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Uninitialized variables&lt;&#x2F;td&gt;&lt;td&gt;Memory safety&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Macros&lt;&#x2F;td&gt;&lt;td&gt;Undecided; if added, will be hygienic and capability-aware&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Closures&lt;&#x2F;td&gt;&lt;td&gt;Hidden captures are implicit allocation and data flow&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Concurrency primitives&lt;&#x2F;td&gt;&lt;td&gt;Undecided; must preserve linearity and determinism&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Undefined behavior (in safe code)&lt;&#x2F;td&gt;&lt;td&gt;Kernel semantics fully defined&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;pattern-matching&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#pattern-matching&quot; aria-label=&quot;Anchor link for: pattern-matching&quot;&gt;#&lt;&#x2F;a&gt;Pattern Matching&lt;&#x2F;h2&gt;
&lt;p&gt;Exhaustive pattern matching with linear type awareness:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn describe(opt: Option&amp;lt;Int&amp;gt;) -&amp;gt; String {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    match opt {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Option#Some { value } =&amp;gt; string_concat(&amp;quot;Got &amp;quot;, int_to_string(value)),
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Option#None {} =&amp;gt; &amp;quot;Nothing&amp;quot;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Linear types in patterns must be consumed:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn handle!(result: Result&amp;lt;Data, File&amp;gt;) {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    match result {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Result#Ok { value } =&amp;gt; use_data(value),
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Result#Err { error } =&amp;gt; destroy(error)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Borrowing in patterns:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn peek(opt: &amp;amp;Option&amp;lt;Int&amp;gt;) -&amp;gt; Int {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    match opt {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        &amp;amp;Option#Some { value } =&amp;gt; value,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        &amp;amp;Option#None {} =&amp;gt; 0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;traits&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#traits&quot; aria-label=&quot;Anchor link for: traits&quot;&gt;#&lt;&#x2F;a&gt;Traits&lt;&#x2F;h2&gt;
&lt;p&gt;Traits provide bounded polymorphism with explicit static dispatch:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;trait Printable {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn print(&amp;amp;self) with(Console)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;trait Describable {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn describe(&amp;amp;self) -&amp;gt; String
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn print_all&amp;lt;T: Printable&amp;gt;(list: &amp;amp;List&amp;lt;T&amp;gt;) with(Console) {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;receiver-modes-and-linear-types&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#receiver-modes-and-linear-types&quot; aria-label=&quot;Anchor link for: receiver-modes-and-linear-types&quot;&gt;#&lt;&#x2F;a&gt;Receiver Modes and Linear Types&lt;&#x2F;h3&gt;
&lt;p&gt;Trait methods take the receiver in one of three forms:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;self&lt;&#x2F;code&gt; — borrows the value immutably&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;mut self&lt;&#x2F;code&gt; — borrows the value mutably&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;self&lt;&#x2F;code&gt; — takes ownership, consuming the value&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If a trait method takes &lt;code&gt;self&lt;&#x2F;code&gt;, calling it consumes the value. This follows linear consumption rules:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;trait Consume {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    fn consume(self)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn use_once&amp;lt;T: Consume&amp;gt;(x: T) {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    x.consume()  &#x2F;&#x2F; x is consumed here
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    &#x2F;&#x2F; x.consume()  &#x2F;&#x2F; ERROR: x already consumed
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A trait implementation for a linear type must respect the receiver mode. An &lt;code&gt;&amp;amp;self&lt;&#x2F;code&gt; method cannot consume the value. An &lt;code&gt;&amp;amp;mut self&lt;&#x2F;code&gt; method cannot let the value escape. A &lt;code&gt;self&lt;&#x2F;code&gt; method consumes it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;type-inference&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#type-inference&quot; aria-label=&quot;Anchor link for: type-inference&quot;&gt;#&lt;&#x2F;a&gt;Type Inference&lt;&#x2F;h2&gt;
&lt;p&gt;Type inference is &lt;strong&gt;local only&lt;&#x2F;strong&gt;. Function signatures must be fully annotated. Inside bodies, local types may be inferred:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn process(data: List&amp;lt;Int&amp;gt;) with(Alloc) -&amp;gt; List&amp;lt;Int&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let doubled = map(data, double)  &#x2F;&#x2F; return type inferred
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let filtered = filter(doubled, is_positive)  &#x2F;&#x2F; return type inferred
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    filtered
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can always understand a function’s interface without reading its body.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;modules&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#modules&quot; aria-label=&quot;Anchor link for: modules&quot;&gt;#&lt;&#x2F;a&gt;Modules&lt;&#x2F;h2&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;pub fn open(path: String) with(File) -&amp;gt; Result&amp;lt;File, IOError&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn read(file: &amp;amp;File) with(File) -&amp;gt; String {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn validate(path: String) -&amp;gt; Bool {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Visibility is &lt;code&gt;pub&lt;&#x2F;code&gt; or private by default. Multi-file modules use &lt;code&gt;mod name;&lt;&#x2F;code&gt; plus &lt;code&gt;import name.{symbol}&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;capabilities-as-public-contract&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#capabilities-as-public-contract&quot; aria-label=&quot;Anchor link for: capabilities-as-public-contract&quot;&gt;#&lt;&#x2F;a&gt;Capabilities as Public Contract&lt;&#x2F;h3&gt;
&lt;p&gt;Capabilities are part of a function’s signature and therefore part of the public API contract. Changing the required capability set of a public function is a breaking change. This applies in both directions: adding a capability requirement breaks callers who don’t have it; removing one changes the function’s guarantees.&lt;&#x2F;p&gt;
&lt;p&gt;When reviewing dependency updates, diff the capability declarations. A library that adds &lt;code&gt;with(Network)&lt;&#x2F;code&gt; to a function that previously had none is a significant change, even if the types remain identical.&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;mod filesystem;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;import filesystem.{open, read, write};
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;unsafe-trusted-and-ffi&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#unsafe-trusted-and-ffi&quot; aria-label=&quot;Anchor link for: unsafe-trusted-and-ffi&quot;&gt;#&lt;&#x2F;a&gt;Unsafe, Trusted, and FFI&lt;&#x2F;h2&gt;
&lt;p&gt;Concrete splits low-level safety into four layers:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Capabilities&lt;&#x2F;strong&gt; declare semantic effects in public signatures (&lt;code&gt;with(File)&lt;&#x2F;code&gt;, &lt;code&gt;with(Alloc)&lt;&#x2F;code&gt;). They propagate through the call graph and are auditable with &lt;code&gt;grep&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;trusted fn&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;trusted impl&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; mark code that uses raw pointers internally but exposes a safe API. Inside trusted code, raw pointer dereference, assignment, pointer arithmetic, and pointer casts are allowed without leaking &lt;code&gt;Unsafe&lt;&#x2F;code&gt; to callers. The trust boundary is explicit in the source and tracked through the full IR pipeline and audit reports.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;trusted extern fn&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; marks narrow audited foreign bindings such as libc-style math wrappers. This is intentionally narrower than general FFI and shows up separately in reports.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;with(Unsafe)&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; gates foreign or semantically dangerous boundaries. Ordinary &lt;code&gt;extern fn&lt;&#x2F;code&gt; calls still require &lt;code&gt;with(Unsafe)&lt;&#x2F;code&gt;, even inside trusted code.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The &lt;code&gt;Unsafe&lt;&#x2F;code&gt; capability gates operations the type system cannot currently verify: foreign function calls, raw pointer dereference (outside trusted code), raw pointer assignment (outside trusted code), and unsafe pointer casts (outside trusted code).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;Unsafe&lt;&#x2F;code&gt; propagates through the call graph like any other capability. Grep for &lt;code&gt;with(Unsafe)&lt;&#x2F;code&gt; to find all foreign boundaries. Grep for &lt;code&gt;trusted&lt;&#x2F;code&gt; to find all internal trust boundaries.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;raw-pointers&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#raw-pointers&quot; aria-label=&quot;Anchor link for: raw-pointers&quot;&gt;#&lt;&#x2F;a&gt;Raw Pointers&lt;&#x2F;h3&gt;
&lt;p&gt;Raw pointers exist for FFI and low-level memory manipulation:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;*const T         &#x2F;&#x2F; immutable raw pointer
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;*mut T           &#x2F;&#x2F; mutable raw pointer
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Raw pointers are &lt;code&gt;Copy&lt;&#x2F;code&gt;. They carry no lifetime information and no linearity guarantees. This is safe because:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Creating a raw pointer from a reference is safe.&lt;&#x2F;li&gt;
&lt;li&gt;Holding a raw pointer is safe. It’s a number.&lt;&#x2F;li&gt;
&lt;li&gt;Using a raw pointer requires &lt;code&gt;Unsafe&lt;&#x2F;code&gt;. Dereference, assignment, and unsafe casts are gated.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn to_ptr&amp;lt;T&amp;gt;(r: &amp;amp;T) -&amp;gt; *const T {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    return r as *const T;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn store&amp;lt;T&amp;gt;(ptr: *mut T, value: T) with(Unsafe) {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    *ptr = value;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The key boundary is deliberate:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safe&lt;&#x2F;strong&gt;: reference-to-pointer casts like &lt;code&gt;&amp;amp;x as *const T&lt;&#x2F;code&gt; or &lt;code&gt;&amp;amp;mut x as *mut T&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Unsafe&lt;&#x2F;strong&gt;: pointer dereference, pointer assignment, pointer-to-pointer casts, integer-to-pointer casts, pointer-to-integer casts, and other provenance-breaking operations&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;code&gt;Copy&lt;&#x2F;code&gt; does not imply usable. Raw pointers can be freely duplicated because they carry no guarantees. Safety is enforced at the point of use, not at the point of creation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;foreign-functions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#foreign-functions&quot; aria-label=&quot;Anchor link for: foreign-functions&quot;&gt;#&lt;&#x2F;a&gt;Foreign Functions&lt;&#x2F;h3&gt;
&lt;p&gt;Declare foreign functions with &lt;code&gt;extern fn&lt;&#x2F;code&gt;. Calling them normally requires &lt;code&gt;Unsafe&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;extern fn malloc(size: Uint) -&amp;gt; *mut Unit;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;extern fn free(ptr: *mut Unit);
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn alloc_raw(size: Uint) with(Unsafe) -&amp;gt; *mut Unit {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    return malloc(size);
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The compiler generates calling convention glue and links the symbol. Foreign signatures are restricted to FFI-safe types. Today that means primitive scalars, raw pointers, unit, and &lt;code&gt;#[repr(C)]&lt;&#x2F;code&gt; structs whose fields are themselves FFI-safe. A narrow audited subset can be declared as &lt;code&gt;trusted extern fn&lt;&#x2F;code&gt; so callers do not need &lt;code&gt;with(Unsafe)&lt;&#x2F;code&gt; for pure, well-understood foreign symbols. This is not a general safe-FFI escape hatch; it is a deliberately small carve-out.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;layout-and-repr-c&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#layout-and-repr-c&quot; aria-label=&quot;Anchor link for: layout-and-repr-c&quot;&gt;#&lt;&#x2F;a&gt;Layout and &lt;code&gt;#[repr(C)]&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Concrete now has an explicit FFI&#x2F;layout surface:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;con&quot; class=&quot;language-con z-code&quot;&gt;&lt;code class=&quot;language-con&quot; data-lang=&quot;con&quot;&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;#[repr(C)]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;struct Header {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    len: Uint,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    kind: u32,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The current rules are intentionally strict:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#[repr(C)]&lt;&#x2F;code&gt; structs cannot have generics&lt;&#x2F;li&gt;
&lt;li&gt;every field of a &lt;code&gt;#[repr(C)]&lt;&#x2F;code&gt; struct must itself be FFI-safe&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;extern fn&lt;&#x2F;code&gt; parameters and returns must be FFI-safe&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;#[repr(packed)]&lt;&#x2F;code&gt; and &lt;code&gt;#[repr(align(N))]&lt;&#x2F;code&gt; exist, but the broader ABI&#x2F;layout model is still being tightened&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This is one of the current implementation frontiers. The language now has a real low-level layout surface, but the long-term goal is to make the ABI model as explicit and mechanically trustworthy as the rest of the language.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;implementation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#implementation&quot; aria-label=&quot;Anchor link for: implementation&quot;&gt;#&lt;&#x2F;a&gt;Implementation&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;determinism&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#determinism&quot; aria-label=&quot;Anchor link for: determinism&quot;&gt;#&lt;&#x2F;a&gt;Determinism&lt;&#x2F;h3&gt;
&lt;p&gt;Concrete aims for &lt;strong&gt;bit-for-bit reproducible builds&lt;&#x2F;strong&gt;: same source + same compiler = identical binary. No timestamps, random seeds, or environment-dependent data in output.&lt;&#x2F;p&gt;
&lt;p&gt;For debugging, &lt;strong&gt;deterministic replay&lt;&#x2F;strong&gt;: random generation requires &lt;code&gt;Random&lt;&#x2F;code&gt; with explicit seed, system time requires &lt;code&gt;Clock&lt;&#x2F;code&gt;. Same inputs produce identical execution.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-grammar&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-grammar&quot; aria-label=&quot;Anchor link for: the-grammar&quot;&gt;#&lt;&#x2F;a&gt;The Grammar&lt;&#x2F;h3&gt;
&lt;p&gt;LL(1). Every parsing decision with a single token of lookahead. No ambiguity, no backtracking.&lt;&#x2F;p&gt;
&lt;p&gt;This is a permanent design constraint, not an implementation detail. Future language evolution is bounded by what LL(1) can express. We accept this constraint for tooling simplicity and error message quality.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;compilation-targets&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#compilation-targets&quot; aria-label=&quot;Anchor link for: compilation-targets&quot;&gt;#&lt;&#x2F;a&gt;Compilation Targets&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Native&lt;&#x2F;strong&gt; via direct LLVM IR emission today, with SSA as the backend boundary. MLIR and additional backends remain possible later, but the important architectural rule is that they should plug in after SSA rather than creating parallel semantic backend paths.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tooling&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#tooling&quot; aria-label=&quot;Anchor link for: tooling&quot;&gt;#&lt;&#x2F;a&gt;Tooling&lt;&#x2F;h3&gt;
&lt;p&gt;Today Concrete ships with the compiler, a built-in test runner (&lt;code&gt;--test&lt;&#x2F;code&gt;), project metadata, examples, and more than 370 end-to-end tests. The compiler exposes audit-focused inspection modes (&lt;code&gt;--report caps|unsafe|layout|interface|mono&lt;&#x2F;code&gt;) and internal stage outputs (&lt;code&gt;--emit-core&lt;&#x2F;code&gt;, &lt;code&gt;--emit-ssa&lt;&#x2F;code&gt;). The testing strategy has expanded well beyond smoke tests: fuzzing, property tests, trace tests, report-consistency tests, and selected codegen differential tests are now part of the project’s confidence story. A formatter, richer package workflow, linter, and REPL are better described as planned tooling than finished tooling. The standard library now covers more than 30 modules, so the next priority is less “add basics” and more “deepen, harden, and make the public surface cleaner while pushing formalization.”&lt;&#x2F;p&gt;
&lt;h3 id=&quot;profiling-and-tracing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#profiling-and-tracing&quot; aria-label=&quot;Anchor link for: profiling-and-tracing&quot;&gt;#&lt;&#x2F;a&gt;Profiling and Tracing&lt;&#x2F;h3&gt;
&lt;p&gt;Profiling and tracing are first-class:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Built into the runtime, not bolted on&lt;&#x2F;li&gt;
&lt;li&gt;Low overhead when disabled&lt;&#x2F;li&gt;
&lt;li&gt;Structured output for tooling integration&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Code is read more often than written, but executed more often than read. Performance visibility matters for systems programming.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-you-can-say-about-programs&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-you-can-say-about-programs&quot; aria-label=&quot;Anchor link for: what-you-can-say-about-programs&quot;&gt;#&lt;&#x2F;a&gt;What You Can Say About Programs&lt;&#x2F;h2&gt;
&lt;p&gt;If a program type-checks:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;“This function is pure.”&lt;&#x2F;strong&gt; No capabilities declared. No side effects, no IO, no allocation.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;“This resource is used exactly once.”&lt;&#x2F;strong&gt; Linear type. No leaks, no double-free, no use-after-free.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;“These are the only effects this code can perform.”&lt;&#x2F;strong&gt; Capability set is explicit and complete.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;“This code cannot escape the type system.”&lt;&#x2F;strong&gt; Unsafe operations require &lt;code&gt;with(Unsafe)&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;“Allocation happens here, using this allocator.”&lt;&#x2F;strong&gt; Call site binds the allocator.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;“Cleanup happens here.”&lt;&#x2F;strong&gt; &lt;code&gt;defer destroy(x)&lt;&#x2F;code&gt; is visible.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;“This build is reproducible.”&lt;&#x2F;strong&gt; Same inputs, same binary.&lt;&#x2F;p&gt;
&lt;p&gt;Mechanical guarantees from a type system proven sound in Lean. Not conventions, proofs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;example&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#example&quot; aria-label=&quot;Anchor link for: example&quot;&gt;#&lt;&#x2F;a&gt;Example&lt;&#x2F;h2&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;import FileSystem.{open, read, write}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;import Parse.{parse_csv}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn process_file(input_path: String, output_path: String) with(File, Alloc) -&amp;gt; Result&amp;lt;Unit, Error&amp;gt; {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let in_file = open(input_path)?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    defer destroy(in_file)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let content = read(&amp;amp;in_file)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let data = parse_csv(content)?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let output = transform(&amp;amp;data)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let out_file = open(output_path)?
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    defer destroy(out_file)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    write(&amp;amp;mut out_file, output)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    Ok(())
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn transform(data: &amp;amp;List&amp;lt;Row&amp;gt;) -&amp;gt; String {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn main!() {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    let arena = Arena.new()
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    defer arena.deinit()
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    match process_file(&amp;quot;input.csv&amp;quot;, &amp;quot;output.txt&amp;quot;) with(Alloc = arena) {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Ok(()) =&amp;gt; println(&amp;quot;Done&amp;quot;),
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        Err(e) =&amp;gt; println(&amp;quot;Error: &amp;quot; + e.message())
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Everything is visible: resource acquisition, cleanup scheduling, error propagation, allocator binding.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;influences&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#influences&quot; aria-label=&quot;Anchor link for: influences&quot;&gt;#&lt;&#x2F;a&gt;Influences&lt;&#x2F;h2&gt;
&lt;p&gt;The kernel calculus is formalized in Lean 4. Coq could serve the same role; we chose Lean for its performance and active development.&lt;&#x2F;p&gt;
&lt;p&gt;Austral shaped the type system more than any other language. Linear types in Concrete are strict: every value must be consumed exactly once. The capability system for effect tracking also comes from Austral.&lt;&#x2F;p&gt;
&lt;p&gt;From the broader systems-language tradition come borrowing, traits, error handling, and pattern matching. Concrete uses lexical regions instead of lifetime annotations, which keeps the model smaller and more explicit.&lt;&#x2F;p&gt;
&lt;p&gt;Zig’s influence shows in explicit allocator passing and defer. Zig functions that allocate take an allocator parameter; Concrete expresses the same idea through &lt;code&gt;with(Alloc)&lt;&#x2F;code&gt; and allocator binding at call sites.&lt;&#x2F;p&gt;
&lt;p&gt;Go had defer first. Go also shipped gofmt, which ended style debates by making one canonical format. We plan to ship a formatter.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;!&lt;&#x2F;code&gt; syntax for impure functions comes from Roc. &lt;code&gt;fn main!()&lt;&#x2F;code&gt; marks impurity at a glance.&lt;&#x2F;p&gt;
&lt;p&gt;Koka, Eff, and Frank are the algebraic effects languages. Concrete’s capabilities are a simplified version of their effect systems. Capability polymorphism is now part of the language design and current implementation, though the overall effect system is still intentionally much smaller and more explicit than those languages.&lt;&#x2F;p&gt;
&lt;p&gt;Haskell proved that pure-by-default is practical. Clean had uniqueness types (precursor to linear types) and purity before Haskell did.&lt;&#x2F;p&gt;
&lt;p&gt;Cyclone pioneered region-based memory, the research line that led to Rust’s lifetimes and our lexical regions. ATS showed linear types and theorem proving can coexist. Ada&#x2F;SPARK proved formal verification works in production: avionics, rail, security-critical systems.&lt;&#x2F;p&gt;
&lt;p&gt;CompCert and seL4 established that you can mechanically verify real systems software. A verified C compiler and a verified microkernel. That’s the standard we’re aiming for.&lt;&#x2F;p&gt;
&lt;p&gt;These ideas work. We’re combining them and proving the combination sound.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;who-should-use-this&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#who-should-use-this&quot; aria-label=&quot;Anchor link for: who-should-use-this&quot;&gt;#&lt;&#x2F;a&gt;Who Should Use This&lt;&#x2F;h2&gt;
&lt;p&gt;Concrete trades convenience for explicitness, flexibility for auditability. Prototyping is slower. Some patterns become verbose. You’ll miss interior mutability for certain data structures.&lt;&#x2F;p&gt;
&lt;p&gt;But for cryptographic primitives, consensus protocols, financial transaction systems, medical device firmware, the trade is worth it. Strong claims about program behavior, mechanically verified.&lt;&#x2F;p&gt;
&lt;p&gt;A language you can trust the way you trust mathematics: not because someone promises it works, but because you can check the proof.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;quick-reference&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#quick-reference&quot; aria-label=&quot;Anchor link for: quick-reference&quot;&gt;#&lt;&#x2F;a&gt;Quick Reference&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Annotation&lt;&#x2F;th&gt;&lt;th&gt;Meaning&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fn foo() -&amp;gt; T&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Pure function, no capabilities&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fn foo!() -&amp;gt; T&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Shorthand for &lt;code&gt;with(Std)&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fn foo() with(C) -&amp;gt; T&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Requires capability set &lt;code&gt;C&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;with(Alloc)&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Function may allocate&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;with(Alloc = a)&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Bind allocator &lt;code&gt;a&lt;&#x2F;code&gt; at call site&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;T&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Linear type, consumed exactly once&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;struct Copy T&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Unrestricted type, freely duplicated&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;amp;T&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Immutable reference&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;amp;mut T&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Mutable reference&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;*const T&lt;&#x2F;code&gt; &#x2F; &lt;code&gt;*mut T&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Raw pointer (unsafe to dereference)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;borrow x as y in R { }&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Explicit borrow with named region&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;defer expr&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Run &lt;code&gt;expr&lt;&#x2F;code&gt; at scope exit&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;destroy(x)&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Consume via destructor&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;extern fn foo(...)&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Foreign function binding&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;appendix-a-standard-capabilities&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#appendix-a-standard-capabilities&quot; aria-label=&quot;Anchor link for: appendix-a-standard-capabilities&quot;&gt;#&lt;&#x2F;a&gt;Appendix A: Standard Capabilities&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;code&gt;Std&lt;&#x2F;code&gt; capability (accessed via &lt;code&gt;!&lt;&#x2F;code&gt;) bundles these individual capabilities:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Capability&lt;&#x2F;th&gt;&lt;th&gt;Gates&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;File&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Open, read, write, close files. Directory operations.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Network&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Sockets, HTTP, DNS resolution.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Alloc&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Heap allocation. Requires allocator binding at call site.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Clock&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;System time, monotonic time, sleep.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Random&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Random number generation. Requires explicit seed for reproducibility.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Env&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Environment variables, command line arguments.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Process&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Spawn processes, exit codes, signals.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Console&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Stdin, stdout, stderr.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Capabilities not in &lt;code&gt;Std&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Capability&lt;&#x2F;th&gt;&lt;th&gt;Gates&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Unsafe&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Raw pointer operations, FFI calls, transmute, inline assembly. Never implicit.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;A function with no capability annotation is pure. A function with &lt;code&gt;!&lt;&#x2F;code&gt; has access to everything except &lt;code&gt;Unsafe&lt;&#x2F;code&gt;. A function with explicit &lt;code&gt;with(File, Alloc)&lt;&#x2F;code&gt; has exactly those capabilities.&lt;&#x2F;p&gt;
&lt;p&gt;Capabilities are not hierarchical. &lt;code&gt;Std&lt;&#x2F;code&gt; is a shorthand for a set, not a super-capability. You cannot request “half of Std.”&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;appendix-b-open-questions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#appendix-b-open-questions&quot; aria-label=&quot;Anchor link for: appendix-b-open-questions&quot;&gt;#&lt;&#x2F;a&gt;Appendix B: Open Questions&lt;&#x2F;h2&gt;
&lt;p&gt;These are unresolved design decisions:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Concurrency&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;No concurrency primitives exist. The language is currently single-threaded. Any future model must preserve:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Linearity (no data races from aliasing)&lt;&#x2F;li&gt;
&lt;li&gt;Determinism (reproducible execution)&lt;&#x2F;li&gt;
&lt;li&gt;Effect tracking (concurrency as capability)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Candidates: structured concurrency (like Trio&#x2F;libdill), deterministic parallelism (like Haskell’s &lt;code&gt;par&lt;&#x2F;code&gt;), actor model with linear message passing. Not decided.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Effect Handlers&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Capabilities track effects but don’t handle them. Full algebraic effects would allow:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;fn with_mock_filesystem&amp;lt;T&amp;gt;(f: fn() with(File) -&amp;gt; T) -&amp;gt; T {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    handle File in f() {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        open(path) =&amp;gt; resume(MockFile.new(path))
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;        read(file) =&amp;gt; resume(mock_data)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;    }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This enables testing, sandboxing, effect interception. Significant implementation complexity. Not committed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Module System&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Current design is still intentionally minimal. Open questions:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Parameterized modules (functors)?&lt;&#x2F;li&gt;
&lt;li&gt;Module-level capability restrictions?&lt;&#x2F;li&gt;
&lt;li&gt;Separate compilation units built on file summaries?&lt;&#x2F;li&gt;
&lt;li&gt;How much semantic authority should remain file-local before Core IR?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;FFI and ABI Model&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The implementation now has &lt;code&gt;#[repr(C)]&lt;&#x2F;code&gt;, FFI-safe validation, and explicit unsafe gating, but the ABI model is not finished. Remaining questions:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Integer mappings (is &lt;code&gt;Int&lt;&#x2F;code&gt; C’s &lt;code&gt;int&lt;&#x2F;code&gt; or &lt;code&gt;intptr_t&lt;&#x2F;code&gt;?)&lt;&#x2F;li&gt;
&lt;li&gt;Complete struct and enum layout guarantees&lt;&#x2F;li&gt;
&lt;li&gt;Calling conventions&lt;&#x2F;li&gt;
&lt;li&gt;Nullable pointer representation&lt;&#x2F;li&gt;
&lt;li&gt;String encoding at boundaries&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Variance&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Generic types have variance implications. &lt;code&gt;List&amp;lt;T&amp;gt;&lt;&#x2F;code&gt; is covariant in &lt;code&gt;T&lt;&#x2F;code&gt;. &lt;code&gt;fn(T) -&amp;gt; U&lt;&#x2F;code&gt; is contravariant in &lt;code&gt;T&lt;&#x2F;code&gt;. The spec doesn’t address this. For linear types, variance interacts with consumption. Needs formalization.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Macros&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;No macro system. Options:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;None (keep it simple)&lt;&#x2F;li&gt;
&lt;li&gt;Hygienic macros (Scheme-style)&lt;&#x2F;li&gt;
&lt;li&gt;Procedural macros (Rust-style)&lt;&#x2F;li&gt;
&lt;li&gt;Compile-time evaluation (Zig-style comptime)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Procedural macros would need capability restrictions. Not decided.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;appendix-c-glossary&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#appendix-c-glossary&quot; aria-label=&quot;Anchor link for: appendix-c-glossary&quot;&gt;#&lt;&#x2F;a&gt;Appendix C: Glossary&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Affine type&lt;&#x2F;strong&gt;: A type whose values can be used at most once. Rust’s ownership model is affine: you can drop a value without consuming it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Capability&lt;&#x2F;strong&gt;: A token that grants permission to perform an effect. Functions declare required capabilities; callers must have them. Capabilities propagate: if &lt;code&gt;f&lt;&#x2F;code&gt; calls &lt;code&gt;g&lt;&#x2F;code&gt;, and &lt;code&gt;g&lt;&#x2F;code&gt; needs &lt;code&gt;File&lt;&#x2F;code&gt;, then &lt;code&gt;f&lt;&#x2F;code&gt; needs &lt;code&gt;File&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Consumption&lt;&#x2F;strong&gt;: Using a linear value in a way that fulfills its “exactly once” obligation. Methods of consumption: pass to a function taking ownership, return, destructure via pattern match, call &lt;code&gt;destroy()&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Copy type&lt;&#x2F;strong&gt;: A type exempt from linearity. Values can be duplicated freely. Must be explicitly marked. Cannot have destructors or linear fields.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Destruction&lt;&#x2F;strong&gt;: Consuming a linear value by invoking its destructor. &lt;code&gt;destroy(x)&lt;&#x2F;code&gt; calls the type’s destructor and consumes &lt;code&gt;x&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Effect&lt;&#x2F;strong&gt;: An observable interaction with the world outside pure computation: IO, allocation, mutation, non-determinism. Concrete tracks effects through capabilities.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Elaboration&lt;&#x2F;strong&gt;: The compiler phase that transforms checked surface syntax into typed Core IR. In the current compiler, parsing, resolution, checking, elaboration, Core validation, monomorphization, lowering, SSA verification&#x2F;cleanup, and code emission are separate passes.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Kernel&lt;&#x2F;strong&gt;: The core calculus formalized in Lean. A small language with mechanically verified properties. The surface language elaborates into it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Lexical region&lt;&#x2F;strong&gt;: A scope that bounds reference lifetimes. References created in a region cannot escape it. Unlike Rust’s lifetime parameters, regions are always lexical and never appear in signatures.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Linear type&lt;&#x2F;strong&gt;: A type whose values must be used exactly once. Not zero (leak), not twice (double-use). Concrete’s default.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Purity&lt;&#x2F;strong&gt;: Absence of effects. A pure function computes a result from its inputs without IO, allocation, or mutation. In Concrete, functions without capability annotations are pure.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Raw pointer&lt;&#x2F;strong&gt;: A &lt;code&gt;*const T&lt;&#x2F;code&gt; or &lt;code&gt;*mut T&lt;&#x2F;code&gt; value. Carries no lifetime or linearity information. Safe to create and hold; unsafe to dereference.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Reference&lt;&#x2F;strong&gt;: A borrowed view of a value. &lt;code&gt;&amp;amp;T&lt;&#x2F;code&gt; for immutable, &lt;code&gt;&amp;amp;mut T&lt;&#x2F;code&gt; for mutable. The original value is inaccessible while borrowed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Region&lt;&#x2F;strong&gt;: See lexical region.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Std&lt;&#x2F;strong&gt;: The standard capability set. Shorthand for &lt;code&gt;File&lt;&#x2F;code&gt;, &lt;code&gt;Network&lt;&#x2F;code&gt;, &lt;code&gt;Alloc&lt;&#x2F;code&gt;, &lt;code&gt;Clock&lt;&#x2F;code&gt;, &lt;code&gt;Random&lt;&#x2F;code&gt;, &lt;code&gt;Env&lt;&#x2F;code&gt;, &lt;code&gt;Process&lt;&#x2F;code&gt;, &lt;code&gt;Console&lt;&#x2F;code&gt;. Excludes &lt;code&gt;Unsafe&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Unsafe&lt;&#x2F;strong&gt;: The capability that permits operations the type system cannot verify: FFI, raw pointer dereference, transmute.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;appendix-d-comparison-table&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#appendix-d-comparison-table&quot; aria-label=&quot;Anchor link for: appendix-d-comparison-table&quot;&gt;#&lt;&#x2F;a&gt;Appendix D: Comparison Table&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;&#x2F;th&gt;&lt;th&gt;Concrete&lt;&#x2F;th&gt;&lt;th&gt;Rust&lt;&#x2F;th&gt;&lt;th&gt;Zig&lt;&#x2F;th&gt;&lt;th&gt;Austral&lt;&#x2F;th&gt;&lt;th&gt;Go&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Memory safety&lt;&#x2F;td&gt;&lt;td&gt;Linear types&lt;&#x2F;td&gt;&lt;td&gt;Ownership + borrow checker&lt;&#x2F;td&gt;&lt;td&gt;Runtime checks (optional)&lt;&#x2F;td&gt;&lt;td&gt;Linear types&lt;&#x2F;td&gt;&lt;td&gt;GC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Linearity&lt;&#x2F;td&gt;&lt;td&gt;Strict (exactly once)&lt;&#x2F;td&gt;&lt;td&gt;Affine (at most once)&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;Strict&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GC&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Effect tracking&lt;&#x2F;td&gt;&lt;td&gt;Capabilities&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;Capabilities&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pure by default&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Explicit allocation&lt;&#x2F;td&gt;&lt;td&gt;Capability + binding&lt;&#x2F;td&gt;&lt;td&gt;Global allocator&lt;&#x2F;td&gt;&lt;td&gt;Allocator parameter&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;td&gt;GC&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Null&lt;&#x2F;td&gt;&lt;td&gt;None (&lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;None (&lt;code&gt;Option&amp;lt;T&amp;gt;&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;Optional (&lt;code&gt;?T&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;None (&lt;code&gt;Option[T]&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;td&gt;Yes (&lt;code&gt;nil&lt;&#x2F;code&gt;)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Exceptions&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;Panic (discouraged)&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;Panic&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Error handling&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Result&lt;&#x2F;code&gt; + &lt;code&gt;?&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Result&lt;&#x2F;code&gt; + &lt;code&gt;?&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Error unions&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Result&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Multiple returns&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Lifetime annotations&lt;&#x2F;td&gt;&lt;td&gt;None (lexical regions)&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;N&#x2F;A (GC)&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Formal verification&lt;&#x2F;td&gt;&lt;td&gt;Kernel in Lean&lt;&#x2F;td&gt;&lt;td&gt;External tools&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Defer&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;td&gt;No (RAII)&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;td&gt;No&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Interior mutability&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Cell&lt;&#x2F;code&gt;, &lt;code&gt;RefCell&lt;&#x2F;code&gt;, etc.&lt;&#x2F;td&gt;&lt;td&gt;Pointers&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;Pointers&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Unsafe escape hatch&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;with(Unsafe)&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;unsafe&lt;&#x2F;code&gt; blocks&lt;&#x2F;td&gt;&lt;td&gt;No safe&#x2F;unsafe distinction&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Unsafe_Module&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;No distinction&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Macros&lt;&#x2F;td&gt;&lt;td&gt;None (undecided)&lt;&#x2F;td&gt;&lt;td&gt;Procedural + declarative&lt;&#x2F;td&gt;&lt;td&gt;Comptime&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Concurrency&lt;&#x2F;td&gt;&lt;td&gt;None (undecided)&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;async&lt;&#x2F;code&gt;, threads, channels&lt;&#x2F;td&gt;&lt;td&gt;Threads, async&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;Goroutines, channels&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Formatter&lt;&#x2F;td&gt;&lt;td&gt;Planned&lt;&#x2F;td&gt;&lt;td&gt;rustfmt (separate)&lt;&#x2F;td&gt;&lt;td&gt;zig fmt&lt;&#x2F;td&gt;&lt;td&gt;None&lt;&#x2F;td&gt;&lt;td&gt;gofmt&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Grammar&lt;&#x2F;td&gt;&lt;td&gt;LL(1)&lt;&#x2F;td&gt;&lt;td&gt;Complex&lt;&#x2F;td&gt;&lt;td&gt;Simple&lt;&#x2F;td&gt;&lt;td&gt;Simple&lt;&#x2F;td&gt;&lt;td&gt;LALR&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;appendix-e-error-messages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#appendix-e-error-messages&quot; aria-label=&quot;Anchor link for: appendix-e-error-messages&quot;&gt;#&lt;&#x2F;a&gt;Appendix E: Error Messages&lt;&#x2F;h2&gt;
&lt;p&gt;These are representative error messages. The actual compiler may differ.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Linearity violation: value not consumed&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error[E0201]: linear value `f` is never consumed
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  --&amp;gt; src&#x2F;main.con:4:9
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 4 |     let f = open(&amp;quot;data.txt&amp;quot;)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |         ^ this value has type `File` which is linear
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = help: linear values must be consumed exactly once
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = help: add `defer destroy(f)` or pass `f` to a function that takes ownership
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Linearity violation: value consumed twice&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error[E0202]: value `f` consumed twice
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  --&amp;gt; src&#x2F;main.con:7:12
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 5 |     let content = read_all(f)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                           - first consumption here
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 6 |     
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 7 |     destroy(f)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |            ^ second consumption here
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = help: after passing `f` to `read_all`, you no longer own it
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Borrow escape&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error[E0301]: reference cannot escape its region
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  --&amp;gt; src&#x2F;main.con:3:12
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 2 |     borrow data as r in R {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                       --- region R starts here
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 3 |         return r
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                ^ cannot return reference with region R
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 4 |     }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |     - region R ends here
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = help: references are only valid within their borrow region
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Missing capability&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error[E0401]: function requires capability `Network` which is not available
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  --&amp;gt; src&#x2F;main.con:8:5
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 8 |     fetch(url)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |     ^^^^^^^^^^ requires `Network`
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = note: the current function has capabilities: {File, Alloc}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = help: add `Network` to the function&amp;#39;s capability declaration:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 2 | fn process(url: String) with(File, Alloc, Network) -&amp;gt; Result&amp;lt;Data, Error&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                                    +++++++++
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Mutable borrow conflict&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error[E0302]: cannot borrow `data` as immutable because it is already borrowed as mutable
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  --&amp;gt; src&#x2F;main.con:4:17
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 3 |     borrow mut data as m in R {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                       - mutable borrow occurs here
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 4 |         let len = length(&amp;amp;data)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                          ^^^^^ immutable borrow attempted here
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = help: mutable borrows are exclusive; no other borrows allowed
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Unsafe operation without capability&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;error[E0501]: operation requires `Unsafe` capability
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;  --&amp;gt; src&#x2F;main.con:6:5
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 6 |     ptr_read(addr)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |     ^^^^^^^^^^^^^^ unsafe operation
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = note: reading from raw pointers may cause undefined behavior
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   = help: add `Unsafe` to the function&amp;#39;s capabilities:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 2 | fn dangerous(addr: *const Int) with(Unsafe) -&amp;gt; Int
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;   |                                  ++++++++++++
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;references&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#references&quot; aria-label=&quot;Anchor link for: references&quot;&gt;#&lt;&#x2F;a&gt;References&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;languages&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#languages&quot; aria-label=&quot;Anchor link for: languages&quot;&gt;#&lt;&#x2F;a&gt;Languages&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lean-lang.org&#x2F;&quot;&gt;Lean 4&lt;&#x2F;a&gt; — theorem prover and programming language&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;austral-lang.org&#x2F;&quot;&gt;Austral&lt;&#x2F;a&gt; — linear types and capabilities for systems programming
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;austral-lang.org&#x2F;spec&#x2F;spec.html&quot;&gt;Specification&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&#x2F;&quot;&gt;Rust&lt;&#x2F;a&gt; — ownership, borrowing, traits&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ziglang.org&#x2F;&quot;&gt;Zig&lt;&#x2F;a&gt; — explicit allocators, defer, no hidden control flow&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.roc-lang.org&#x2F;&quot;&gt;Roc&lt;&#x2F;a&gt; — pure functional, &lt;code&gt;!&lt;&#x2F;code&gt; for effects&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;koka-lang.github.io&#x2F;koka&#x2F;doc&#x2F;index.html&quot;&gt;Koka&lt;&#x2F;a&gt; — algebraic effects and handlers&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.eff-lang.org&#x2F;&quot;&gt;Eff&lt;&#x2F;a&gt; — algebraic effects research language&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;frank-lang&#x2F;frank&quot;&gt;Frank&lt;&#x2F;a&gt; — effects as calling conventions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;clean.cs.ru.nl&#x2F;&quot;&gt;Clean&lt;&#x2F;a&gt; — uniqueness types, pure by default&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ats-lang.org&#x2F;&quot;&gt;ATS&lt;&#x2F;a&gt; — linear types with theorem proving&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;cyclone.thelanguage.org&#x2F;&quot;&gt;Cyclone&lt;&#x2F;a&gt; — region-based memory for C&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.adacore.com&#x2F;about-spark&quot;&gt;Ada&#x2F;SPARK&lt;&#x2F;a&gt; — formal verification in systems programming&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;verified-systems&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#verified-systems&quot; aria-label=&quot;Anchor link for: verified-systems&quot;&gt;#&lt;&#x2F;a&gt;Verified Systems&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;compcert.org&#x2F;&quot;&gt;CompCert&lt;&#x2F;a&gt; — verified C compiler&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;sel4.systems&#x2F;&quot;&gt;seL4&lt;&#x2F;a&gt; — verified microkernel&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;flint.cs.yale.edu&#x2F;certikos&#x2F;&quot;&gt;CertiKOS&lt;&#x2F;a&gt; — verified concurrent OS kernel&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;iris-project.org&#x2F;&quot;&gt;Iris&lt;&#x2F;a&gt; — higher-order concurrent separation logic&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;papers&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#papers&quot; aria-label=&quot;Anchor link for: papers&quot;&gt;#&lt;&#x2F;a&gt;Papers&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;homepages.inf.ed.ac.uk&#x2F;wadler&#x2F;topics&#x2F;linear-logic.html&quot;&gt;Linear Logic&lt;&#x2F;a&gt; — Wadler’s papers on linear logic&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;granule-project.github.io&#x2F;papers&#x2F;esop22-paper.pdf&quot;&gt;Linearity and Uniqueness: An Entente Cordiale&lt;&#x2F;a&gt; — linear vs unique vs affine&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;cyclone.thelanguage.org&#x2F;&quot;&gt;Cyclone&lt;&#x2F;a&gt; — region-based memory safety for C&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.eff-lang.org&#x2F;handlers-tutorial.pdf&quot;&gt;An Introduction to Algebraic Effects and Handlers&lt;&#x2F;a&gt; — Matija Pretnar&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;srl.cs.jhu.edu&#x2F;pubs&#x2F;SRL2003-02.pdf&quot;&gt;Capability Myths Demolished&lt;&#x2F;a&gt; — what capabilities actually provide&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.cs.cmu.edu&#x2F;~crary&#x2F;819-f09&#x2F;Landin66.pdf&quot;&gt;The Next 700 Programming Languages&lt;&#x2F;a&gt; — Landin’s classic&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.cs.yale.edu&#x2F;flint&#x2F;cs428&#x2F;doc&#x2F;HintsPL.pdf&quot;&gt;Hints on Programming Language Design&lt;&#x2F;a&gt; — Tony Hoare&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.cs.virginia.edu&#x2F;~evans&#x2F;cs655&#x2F;readings&#x2F;steele.pdf&quot;&gt;Growing a Language&lt;&#x2F;a&gt; — Guy Steele&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;plv.mpi-sws.org&#x2F;rustbelt&#x2F;popl18&#x2F;paper.pdf&quot;&gt;RustBelt: Securing the Foundations of the Rust Programming Language&lt;&#x2F;a&gt; — formal verification of Rust&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;plv.mpi-sws.org&#x2F;rustbelt&#x2F;stacked-borrows&#x2F;paper.pdf&quot;&gt;Stacked Borrows: An Aliasing Model for Rust&lt;&#x2F;a&gt; — Ralf Jung on aliasing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;patpannuto.com&#x2F;pubs&#x2F;levy15ownership.pdf&quot;&gt;Ownership is Theft: Experiences Building an Embedded OS in Rust&lt;&#x2F;a&gt; — Tock OS&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.microsoft.com&#x2F;en-us&#x2F;research&#x2F;wp-content&#x2F;uploads&#x2F;2016&#x2F;07&#x2F;history.pdf&quot;&gt;A History of Haskell: Being Lazy with Class&lt;&#x2F;a&gt; — design decisions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.cs.kent.ac.uk&#x2F;people&#x2F;staff&#x2F;dat&#x2F;miranda&#x2F;whyfp90.pdf&quot;&gt;Why Functional Programming Matters&lt;&#x2F;a&gt; — John Hughes&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.win.tue.nl&#x2F;~wstomv&#x2F;edu&#x2F;2ip30&#x2F;references&#x2F;criteria_for_modularization.pdf&quot;&gt;On the Criteria To Be Used in Decomposing Systems into Modules&lt;&#x2F;a&gt; — Parnas&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;clean.cs.ru.nl&#x2F;&quot;&gt;Clean&lt;&#x2F;a&gt; — uniqueness types specification&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.science&#x2F;publications&#x2F;using-lightweight-formal-methods-to-validate-a-key-value-storage-node-in-amazon-s3&quot;&gt;Using Lightweight Formal Methods to Validate a Key-Value Storage Node&lt;&#x2F;a&gt; — practical verification at AWS&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;blog-posts&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#blog-posts&quot; aria-label=&quot;Anchor link for: blog-posts&quot;&gt;#&lt;&#x2F;a&gt;Blog Posts&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Language Design Philosophy&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.dreamsongs.com&#x2F;RiseOfWorseIsBetter.html&quot;&gt;Worse is Better&lt;&#x2F;a&gt; — Richard Gabriel on simplicity vs correctness&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;paulgraham.com&#x2F;hundred.html&quot;&gt;The Hundred-Year Language&lt;&#x2F;a&gt; — Paul Graham&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blog.ploeh.dk&#x2F;2015&#x2F;04&#x2F;13&#x2F;less-is-more-language-features&#x2F;&quot;&gt;Less is more: language features&lt;&#x2F;a&gt; — Mark Seemann on constraints&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;curtclifton.net&#x2F;papers&#x2F;MosessonClifton06.pdf&quot;&gt;Out of the Tar Pit&lt;&#x2F;a&gt; — Moseley and Marks on complexity&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.cs.virginia.edu&#x2F;~evans&#x2F;cs655&#x2F;readings&#x2F;smalltalk.html&quot;&gt;Design Principles Behind Smalltalk&lt;&#x2F;a&gt; — Dan Ingalls&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;cdsmith.wordpress.com&#x2F;2011&#x2F;01&#x2F;09&#x2F;an-old-article-i-wrote&#x2F;&quot;&gt;What to Know Before Debating Type Systems&lt;&#x2F;a&gt; — Chris Smith&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;steve-yegge.blogspot.com&#x2F;2006&#x2F;03&#x2F;execution-in-kingdom-of-nouns.html&quot;&gt;Execution in the Kingdom of Nouns&lt;&#x2F;a&gt; — Steve Yegge&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Austral and Linear Types&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;borretti.me&#x2F;article&#x2F;introducing-austral&quot;&gt;Introducing Austral&lt;&#x2F;a&gt; — Fernando Borretti’s rationale&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;borretti.me&#x2F;article&#x2F;how-australs-linear-type-checker-works&quot;&gt;How Austral’s Linear Type Checker Works&lt;&#x2F;a&gt; — implementation decisions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;borretti.me&#x2F;article&#x2F;how-capabilities-work-austral&quot;&gt;How Capabilities Work in Austral&lt;&#x2F;a&gt; — how capabilities compose&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;borretti.me&#x2F;article&#x2F;type-systems-memory-safety&quot;&gt;Type Systems for Memory Safety&lt;&#x2F;a&gt; — survey of approaches&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;homepages.inf.ed.ac.uk&#x2F;wadler&#x2F;topics&#x2F;linear-logic.html&quot;&gt;Linear types can change the world!&lt;&#x2F;a&gt; — Wadler&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.tweag.io&#x2F;blog&#x2F;2017-03-13-linear-types&#x2F;&quot;&gt;Retrofitting Linear Types&lt;&#x2F;a&gt; — adding linear types to Haskell&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Rust Design Decisions&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;manishearth.github.io&#x2F;blog&#x2F;2015&#x2F;05&#x2F;17&#x2F;the-problem-with-shared-mutability&#x2F;&quot;&gt;The Problem with Single-threaded Shared Mutability&lt;&#x2F;a&gt; — why Rust forbids it&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;limpet.net&#x2F;mbrubeck&#x2F;2019&#x2F;02&#x2F;07&#x2F;rust-a-unique-perspective.html&quot;&gt;Rust: A unique perspective&lt;&#x2F;a&gt; — ownership from first principles&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;edition-guide&#x2F;rust-2018&#x2F;ownership-and-lifetimes&#x2F;non-lexical-lifetimes.html&quot;&gt;The Edition Guide: Non-Lexical Lifetimes&lt;&#x2F;a&gt; — why Rust moved beyond lexical scopes&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;smallcultfollowing.com&#x2F;babysteps&#x2F;blog&#x2F;2018&#x2F;04&#x2F;27&#x2F;an-alias-based-formulation-of-the-borrow-checker&#x2F;&quot;&gt;Polonius: the future of the borrow checker&lt;&#x2F;a&gt; — Niko Matsakis&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;smallcultfollowing.com&#x2F;babysteps&#x2F;blog&#x2F;2018&#x2F;11&#x2F;10&#x2F;after-nll-moving-from-borrowed-data-and-the-sentinel-pattern&#x2F;&quot;&gt;After NLL: Moving from borrowed data&lt;&#x2F;a&gt; — borrow checker limitations&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ralfj.de&#x2F;blog&#x2F;&quot;&gt;Ralf Jung’s Blog&lt;&#x2F;a&gt; — Stacked Borrows, unsafe, formal semantics&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;rust-unofficial.github.io&#x2F;too-many-lists&#x2F;&quot;&gt;Learn Rust With Entirely Too Many Linked Lists&lt;&#x2F;a&gt; — ownership through pain&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;nomicon&#x2F;&quot;&gt;The Rustonomicon&lt;&#x2F;a&gt; — dark arts of unsafe Rust&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Graydon Hoare (Rust creator)&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;graydon2.dreamwidth.org&#x2F;307105.html&quot;&gt;The Rust I Wanted Had No Future&lt;&#x2F;a&gt; — original vision&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;graydon2.dreamwidth.org&#x2F;307291.html&quot;&gt;Not Rust&lt;&#x2F;a&gt; — what Rust deliberately avoided&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;graydon2.dreamwidth.org&#x2F;253769.html&quot;&gt;What next for compiled languages?&lt;&#x2F;a&gt; — language evolution&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Zig Design Decisions&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ziglang&#x2F;zig&#x2F;issues&#x2F;10052&quot;&gt;Allocgate&lt;&#x2F;a&gt; — why Zig’s allocator design changed&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;kristoff.it&#x2F;blog&#x2F;what-is-zig-comptime&#x2F;&quot;&gt;What is Zig’s Comptime&lt;&#x2F;a&gt; — compile-time execution design&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Effects and Capabilities&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;overreacted.io&#x2F;algebraic-effects-for-the-rest-of-us&#x2F;&quot;&gt;Algebraic Effects for the Rest of Us&lt;&#x2F;a&gt; — Dan Abramov&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;journal.stuffwithstuff.com&#x2F;2015&#x2F;02&#x2F;01&#x2F;what-color-is-your-function&#x2F;&quot;&gt;What Color is Your Function?&lt;&#x2F;a&gt; — Bob Nystrom on effect tracking&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;vorpus.org&#x2F;blog&#x2F;notes-on-structured-concurrency-or-go-statement-considered-harmful&#x2F;&quot;&gt;Structured Concurrency&lt;&#x2F;a&gt; — Nathaniel Smith&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.eff-lang.org&#x2F;&quot;&gt;Eff Programming Language&lt;&#x2F;a&gt; — algebraic effects research language&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;koka-lang.github.io&#x2F;koka&#x2F;doc&#x2F;book.html&quot;&gt;Koka: Programming with Row-polymorphic Effect Types&lt;&#x2F;a&gt; — official book&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Roc and Purity&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.roc-lang.org&#x2F;faq&quot;&gt;Roc FAQ&lt;&#x2F;a&gt; — official FAQ and design rationale&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.roc-lang.org&#x2F;platforms&quot;&gt;Why Roc Uses Platform&#x2F;App Split&lt;&#x2F;a&gt; — effect isolation design&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Go Design Decisions&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;talks&#x2F;2012&#x2F;splash.article&quot;&gt;Go at Google: Language Design in the Service of Software Engineering&lt;&#x2F;a&gt; — Rob Pike&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;talks&#x2F;2015&#x2F;simplicity-is-complicated.slide&quot;&gt;Simplicity is Complicated&lt;&#x2F;a&gt; — Rob Pike&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;blog&#x2F;errors-are-values&quot;&gt;Errors are values&lt;&#x2F;a&gt; — Rob Pike&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;go-proverbs.github.io&#x2F;&quot;&gt;Go Proverbs&lt;&#x2F;a&gt; — design philosophy&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;go.dev&#x2F;blog&#x2F;toward-go2&quot;&gt;Toward Go 2&lt;&#x2F;a&gt; — Russ Cox on language evolution&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Memory and Allocators&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.rfleury.com&#x2F;p&#x2F;untangling-lifetimes-the-arena-allocator&quot;&gt;Untangling Lifetimes: The Arena Allocator&lt;&#x2F;a&gt; — Ryan Fleury&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;fitzgeraldnick.com&#x2F;2019&#x2F;11&#x2F;01&#x2F;always-bump-downwards.html&quot;&gt;Always Bump Downwards&lt;&#x2F;a&gt; — Nick Fitzgerald&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.gingerbill.org&#x2F;series&#x2F;memory-allocation-strategies&#x2F;&quot;&gt;Memory Allocation Strategies&lt;&#x2F;a&gt; — Bill Hall’s series&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Error Handling Design&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;joeduffyblog.com&#x2F;2016&#x2F;02&#x2F;07&#x2F;the-error-model&#x2F;&quot;&gt;The Error Model&lt;&#x2F;a&gt; — Joe Duffy on Midori’s approach&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;sled.rs&#x2F;errors&quot;&gt;Error Handling in a Correctness-Critical Rust Project&lt;&#x2F;a&gt; — sled database&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Formal Methods in Practice&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.hillelwayne.com&#x2F;post&#x2F;theorem-prover-showdown&#x2F;&quot;&gt;Proofs About Programs&lt;&#x2F;a&gt; — Hillel Wayne&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;brooker.co.za&#x2F;blog&#x2F;2022&#x2F;06&#x2F;02&#x2F;formal.html&quot;&gt;Formal Methods Only Solve Half My Problems&lt;&#x2F;a&gt; — Marc Brooker at AWS&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lamport.azurewebsites.net&#x2F;tla&#x2F;amazon-excerpt.html&quot;&gt;How AWS Uses Formal Methods&lt;&#x2F;a&gt; — Amazon’s TLA+ experience&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Lean 4&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lean-lang.org&#x2F;functional_programming_in_lean&#x2F;&quot;&gt;Functional Programming in Lean&lt;&#x2F;a&gt; — official book&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lean-lang.org&#x2F;theorem_proving_in_lean4&#x2F;&quot;&gt;Theorem Proving in Lean 4&lt;&#x2F;a&gt; — official book&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;leanprover-community&#x2F;lean4-metaprogramming-book&quot;&gt;Metaprogramming in Lean 4&lt;&#x2F;a&gt; — macros and tactics&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Type System Design&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lexi-lambda.github.io&#x2F;blog&#x2F;2019&#x2F;11&#x2F;05&#x2F;parse-don-t-validate&#x2F;&quot;&gt;Parse, Don’t Validate&lt;&#x2F;a&gt; — Alexis King&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lexi-lambda.github.io&#x2F;blog&#x2F;2020&#x2F;11&#x2F;01&#x2F;names-are-not-type-safety&#x2F;&quot;&gt;Names Are Not Type Safety&lt;&#x2F;a&gt; — Alexis King&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;lexi-lambda.github.io&#x2F;blog&#x2F;2020&#x2F;08&#x2F;13&#x2F;types-as-axioms-or-playing-god-with-static-types&#x2F;&quot;&gt;Types as Axioms, or: Playing God with Static Types&lt;&#x2F;a&gt; — Alexis King&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;homepages.inf.ed.ac.uk&#x2F;wadler&#x2F;papers&#x2F;expression&#x2F;expression.txt&quot;&gt;The Expression Problem&lt;&#x2F;a&gt; — Philip Wadler&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Bob Harper&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;existentialtype.wordpress.com&#x2F;2011&#x2F;03&#x2F;19&#x2F;dynamic-languages-are-static-languages&#x2F;&quot;&gt;Dynamic languages are static languages&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;existentialtype.wordpress.com&#x2F;2011&#x2F;04&#x2F;16&#x2F;modules-matter-most&#x2F;&quot;&gt;Modules matter most&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;talks&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#talks&quot; aria-label=&quot;Anchor link for: talks&quot;&gt;#&lt;&#x2F;a&gt;Talks&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=0jI-AlWEwYI&quot;&gt;Effects for Less&lt;&#x2F;a&gt; — Alexis King on effects (essential)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=Unq712gqu2U&quot;&gt;The Road to Zig 1.0&lt;&#x2F;a&gt; — Andrew Kelley&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=HgtRAbE1nBM&quot;&gt;Is It Time to Rewrite the OS in Rust?&lt;&#x2F;a&gt; — Bryan Cantrill&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=IOiZatlZtGU&quot;&gt;Propositions as Types&lt;&#x2F;a&gt; — Philip Wadler&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=nV3r1rB5_6E&quot;&gt;Correctness by Construction&lt;&#x2F;a&gt; — Derek Dreyer on RustBelt&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.infoq.com&#x2F;presentations&#x2F;Simple-Made-Easy&#x2F;&quot;&gt;Simple Made Easy&lt;&#x2F;a&gt; — Rich Hickey&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=GqmsQeSzMdw&quot;&gt;Constraints Liberate, Liberties Constrain&lt;&#x2F;a&gt; — Runar Bjarnason&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=_ahvzDzKdB0&quot;&gt;Growing a Language&lt;&#x2F;a&gt; — Guy Steele (watch this)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=7GcrT0SBSnI&quot;&gt;Why Algebraic Effects Matter&lt;&#x2F;a&gt; — Daan Leijen&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=vzfy4EKwG_Y&quot;&gt;Outperforming Imperative with Pure Functional Languages&lt;&#x2F;a&gt; — Richard Feldman&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=cpQwtwVKAfU&quot;&gt;Why Roc?&lt;&#x2F;a&gt; — Richard Feldman&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=pW-SOdj4Kkk&quot;&gt;Preventing the Collapse of Civilization&lt;&#x2F;a&gt; — Jonathan Blow on why new languages matter&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=TH9VCN6UkyQ&quot;&gt;Ideas about a new programming language for games&lt;&#x2F;a&gt; — Jonathan Blow on Jai&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=t0mhvd3-60Y&quot;&gt;Linear Types for Low-latency, High-throughput Systems&lt;&#x2F;a&gt; — Jean-Philippe Bernardy&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=Sj3b8Sltx1s&quot;&gt;seL4 and Formal Verification&lt;&#x2F;a&gt; — Gernot Heiser&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;books&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#books&quot; aria-label=&quot;Anchor link for: books&quot;&gt;#&lt;&#x2F;a&gt;Books&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.cis.upenn.edu&#x2F;~bcpierce&#x2F;tapl&#x2F;&quot;&gt;Types and Programming Languages&lt;&#x2F;a&gt; — Pierce&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.cs.cmu.edu&#x2F;~rwh&#x2F;pfpl&#x2F;&quot;&gt;Practical Foundations for Programming Languages&lt;&#x2F;a&gt; — Harper&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;adam.chlipala.net&#x2F;cpdt&#x2F;&quot;&gt;Certified Programming with Dependent Types&lt;&#x2F;a&gt; — Chlipala&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;softwarefoundations.cis.upenn.edu&#x2F;&quot;&gt;Software Foundations&lt;&#x2F;a&gt; — interactive Coq textbook&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;plfa.github.io&#x2F;&quot;&gt;Programming Language Foundations in Agda&lt;&#x2F;a&gt; — Wadler and Kokke&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mitpress.mit.edu&#x2F;9780262536431&#x2F;the-little-typer&#x2F;&quot;&gt;The Little Typer&lt;&#x2F;a&gt; — Friedman and Christiansen&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;craftinginterpreters.com&#x2F;&quot;&gt;Crafting Interpreters&lt;&#x2F;a&gt; — Bob Nystrom&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Death of the Inner Self</title>
        <published>2025-12-23T00:00:00+00:00</published>
        <updated>2025-12-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/les-circuits-longs/the-death-of-the-inner-self/"/>
        <id>https://federicocarrone.com/series/les-circuits-longs/the-death-of-the-inner-self/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/series/les-circuits-longs/the-death-of-the-inner-self/">&lt;p&gt;The core argument is simple: many features of human life that appear stable and natural are historically produced. As society accelerates, a number of these features begin to lose their function and their permanence. I believe consciousness as we know it is one of them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;individuality-as-technology&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#individuality-as-technology&quot; aria-label=&quot;Anchor link for: individuality-as-technology&quot;&gt;#&lt;&#x2F;a&gt;Individuality as technology&lt;&#x2F;h2&gt;
&lt;p&gt;Life is organized around information that replicates under constraint. Computation generalizes this biological logic. It allows selection and optimization to occur faster and at larger scales by externalizing memory, comparison, and feedback. Problems that once required internal deliberation can be solved through external processes that test, filter, and iterate possibilities.&lt;&#x2F;p&gt;
&lt;p&gt;Capital pushes this logic further. It reorganizes social life around continuous feedback, price signals, and competitive selection. As these forces compound, individuality starts to look less like a foundation and more like an interface that emerged to solve earlier coordination problems.&lt;&#x2F;p&gt;
&lt;p&gt;Capital behaves as an impersonal intelligence oriented toward speed, abstraction, and self-optimization. As cognition, decision-making, and coordination migrate into automated systems, the inner self loses its structural role. Over time, many assumptions we take for granted are worn down by this acceleration. Individuality and consciousness appear increasingly exposed to this process.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-construction-we-cannot-see&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-construction-we-cannot-see&quot; aria-label=&quot;Anchor link for: the-construction-we-cannot-see&quot;&gt;#&lt;&#x2F;a&gt;The construction we cannot see&lt;&#x2F;h2&gt;
&lt;p&gt;Fish do not realize they live in water. The medium that sustains them is so constant that it disappears from perception. Some of the most important structures are overlooked for the same reason. Individuality and consciousness belong to that category.&lt;&#x2F;p&gt;
&lt;p&gt;We tend to treat individuality and consciousness as self-evident facts, as if humans have always experienced themselves as bounded selves with an inner voice, a private mental space, and a continuous narrative identity. Because this experience feels natural, it is assumed to be timeless. However, for most of human history people did not describe themselves as individuals in the modern sense. Decisions were not understood as outcomes of inner deliberation, and agency was not located inside a private interior self. Action was organized through rituals, traditions, kinship, and prescribed roles. Meaning arrived from outside the person rather than from introspection. In many societies outside the Western trajectory, this structure remains largely intact.&lt;&#x2F;p&gt;
&lt;p&gt;The idea of a you inside your head observing your own thoughts is therefore a learned construction. It depends on language, habits, metaphors, and social practices that had to be developed and stabilized over time. Inner speech, narrative memory, moral self-examination, and the sense of authorship over action emerged as cultural achievements layered on top of older biological processes.&lt;&#x2F;p&gt;
&lt;p&gt;Modern societies actively reproduce this configuration. From early childhood, people are trained to understand themselves as autonomous units with opinions, preferences, goals, and an inner life that belongs only to them. The training is so pervasive that it becomes invisible. Other ways of being human recede from view, even though many have existed and some still persist.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-weakening-of-the-conditions&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-weakening-of-the-conditions&quot; aria-label=&quot;Anchor link for: the-weakening-of-the-conditions&quot;&gt;#&lt;&#x2F;a&gt;The weakening of the conditions&lt;&#x2F;h2&gt;
&lt;p&gt;The conditions that once made individuality functional are weakening. Earlier systems relied on human subjects to think, decide, judge, and take responsibility. Cognition and coordination were constrained by human minds. Individuality emerged as a solution: a stable self enabled long-term planning, moral accounting, and institutional continuity.&lt;&#x2F;p&gt;
&lt;p&gt;Earlier societies coordinated without modern consciousness. Contemporary systems increasingly coordinate without modern selves. Decision-making proceeds without inner deliberation. Meaning is delivered through incentives, metrics, and feedback loops.&lt;&#x2F;p&gt;
&lt;p&gt;At the cultural level, individuality remains constantly invoked. People are urged to be themselves, express themselves, optimize themselves. Yet the channels for expression arrive pre-shaped, quantified, and monetized. What appears as selfhood increasingly takes the form of managed performance within narrow bounds.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;replacement-by-degrees&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#replacement-by-degrees&quot; aria-label=&quot;Anchor link for: replacement-by-degrees&quot;&gt;#&lt;&#x2F;a&gt;Replacement by degrees&lt;&#x2F;h2&gt;
&lt;p&gt;The modern self does not collapse in a single moment. It is replaced function by function, each substitution small enough to go unnoticed.&lt;&#x2F;p&gt;
&lt;p&gt;Taste was once formed through a slow, private process: encountering things by accident, sitting with discomfort, learning to love what initially resisted you. Algorithmic recommendation compresses this into a profile that updates in real time. The system knows what you will like before you do. The inner process of forming a preference, the hesitation, the revision, the gradual shaping of sensibility, loses its purpose when an external system performs it faster and with better accuracy. What remains looks like taste but functions as consumption.&lt;&#x2F;p&gt;
&lt;p&gt;Judgment follows a similar path. In organizations that once depended on accumulated experience, performance metrics now determine what counts as competent work. The slow formation of professional intuition, the kind that takes years to develop and resists easy articulation, gets flattened against quarterly targets. When the metric becomes the institution’s memory of what the work is for, the judgment it was meant to approximate quietly disappears. People still show up. They optimize what is measured. The rest erodes.&lt;&#x2F;p&gt;
&lt;p&gt;Inner deliberation faces the same pressure from a different direction. When an AI assistant can draft your emails, plan your week, summarize your reading, and suggest your next decision, the internal process of thinking through a problem starts to feel unnecessary. Not wrong, just slow. The assistant is not forcing you to stop thinking. It is making thinking feel like friction in a system that rewards speed. Over time, the habit of sustained internal reflection weakens for the same reason any unused capacity weakens: through disuse.&lt;&#x2F;p&gt;
&lt;p&gt;Each of these substitutions is individually reasonable. Each solves a real problem. Taken together, they describe a pattern where the functions that once required a self are gradually absorbed by systems that do not.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-is-at-stake&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-is-at-stake&quot; aria-label=&quot;Anchor link for: what-is-at-stake&quot;&gt;#&lt;&#x2F;a&gt;What is at stake&lt;&#x2F;h2&gt;
&lt;p&gt;The modern self once felt inevitable because it solved concrete problems. It enabled abstraction, continuity, and responsibility at scale. Its future usefulness is far less certain.&lt;&#x2F;p&gt;
&lt;p&gt;The self depends on performing certain functions, and when those functions migrate outward, the self weakens not through suppression but through redundancy.&lt;&#x2F;p&gt;
&lt;p&gt;The question is not whether individuality was real. It was. It produced philosophy, law, science, art, and institutions that reshaped the world. The question is whether it will remain functional as the systems around it absorb more of what it used to do. A coordination technology that no longer coordinates does not persist on sentimentality alone.&lt;&#x2F;p&gt;
&lt;p&gt;None of this means the self will vanish. It means the conditions under which it developed are changing, and what comes next may look different enough that the word “individuality” stops pointing at anything recognizable. Whether that transition is a loss, a transformation, or simply the next phase of the same process that produced the self in the first place is not something that can be settled in advance. But it should be named clearly, because what cannot be seen clearly cannot be preserved deliberately.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Notes on permanence, time, and ergodicity</title>
        <published>2025-12-15T00:00:00+00:00</published>
        <updated>2025-12-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/les-circuits-longs/notes-on-culture-infrastructure-time-and-ergodicity/"/>
        <id>https://federicocarrone.com/series/les-circuits-longs/notes-on-culture-infrastructure-time-and-ergodicity/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/series/les-circuits-longs/notes-on-culture-infrastructure-time-and-ergodicity/">&lt;p&gt;&lt;a rel=&quot;noopener&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ergodicgroup.com&#x2F;&quot;&gt;Ergodic Group&lt;&#x2F;a&gt; is built around a basic observation: some systems improve the longer you stay with them. Repetition sharpens execution, experience carries forward, and judgment builds on itself.&lt;&#x2F;p&gt;
&lt;p&gt;At Hermès, a leather worker trains for two years before touching a bag. One artisan makes one bag start to finish, every stitch by hand, fifteen to twenty-four hours of work per piece. This is the opposite of speed at all costs. It is also one of the most successful luxury companies in the world. The constraint is not overhead. It is what the customer is paying for.&lt;&#x2F;p&gt;
&lt;p&gt;The broader culture moves in the other direction. Cycles shorten. Signals multiply. Decision horizons shrink. A lot of institutions keep moving while quietly losing the judgment they once had. They stay busy, but they stop getting better. Copying outruns learning.&lt;&#x2F;p&gt;
&lt;p&gt;In that environment, endurance tells you something. If a system keeps working under stress for a long time, its structure probably matches reality better than its competitors’. The internet did not flatten everything. It made it easier to see who had substance and who was living off distribution.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;two-forms-of-time&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#two-forms-of-time&quot; aria-label=&quot;Anchor link for: two-forms-of-time&quot;&gt;#&lt;&#x2F;a&gt;Two forms of time&lt;&#x2F;h2&gt;
&lt;p&gt;Time operates in human systems in two fundamentally different ways.&lt;&#x2F;p&gt;
&lt;p&gt;Measured time is divisible and uniform: schedules, deadlines, accounting periods, discount rates. It can be allocated, optimized, and exchanged. Most planning systems live here. They assume value can be judged apart from history.&lt;&#x2F;p&gt;
&lt;p&gt;Lived time works differently. It accumulates. Learning, memory, and judgment develop through it, and each cycle changes the next one. Anything that depends on formation happens here. Snapshots miss the point because the value is in what compounds.&lt;&#x2F;p&gt;
&lt;p&gt;In 2001, Boeing moved its headquarters from Seattle to Chicago. The stated reason was to position the company closer to “Wall Street and governments.” Engineers who understood the planes were physically separated from executives who understood the spreadsheets. Over the next two decades, Boeing spent $41.5 billion on stock buybacks while cutting capital expenditure to half of Airbus’s rate. Harry Stonecipher, who took over as CEO, said he wanted Boeing “run like a business rather than a great engineering firm.” The 737 MAX, designed to avoid the cost of pilot retraining, killed 346 people. This is what happens when lived time is forced into measured time.&lt;&#x2F;p&gt;
&lt;p&gt;Berkshire Hathaway made the opposite bet. Buffett has refused quarterly earnings guidance since 1996. Shareholders are told to judge the business over decades, not quarters. The result is six decades of compounding judgment, the longest sustained record in American corporate history. Same markets, different use of time.&lt;&#x2F;p&gt;
&lt;p&gt;When lived time gets forced into measured time, formation breaks down. Standards do not settle. Judgment does not compound. You only find out what a system really is if you leave it alone long enough to show you.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;formation-under-constraint&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#formation-under-constraint&quot; aria-label=&quot;Anchor link for: formation-under-constraint&quot;&gt;#&lt;&#x2F;a&gt;Formation under constraint&lt;&#x2F;h2&gt;
&lt;p&gt;Excellence comes from sustained practice under the right constraints. Errors have to be survivable. People need room to adjust without every bad iteration becoming fatal. Judgment improves when experience carries over from one attempt to the next.&lt;&#x2F;p&gt;
&lt;p&gt;At Pixar, every film is terrible for years before it is good. Ed Catmull describes the process as taking movies “from suck to not-suck.” The mechanism is the Braintrust: a group of fellow directors and storytellers who meet every few months to review each film in production. The key detail is that the Braintrust has no authority. The director is not required to take a single suggestion. That keeps candor high without turning feedback into bureaucracy.&lt;&#x2F;p&gt;
&lt;p&gt;Most studios kill projects after one bad screening. Pixar treats bad screenings as information, not verdicts. The difference is not talent. It is structure. Formation takes time, and the Braintrust protects that time by separating honest feedback from the power to cancel.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;four-domains&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#four-domains&quot; aria-label=&quot;Anchor link for: four-domains&quot;&gt;#&lt;&#x2F;a&gt;Four domains&lt;&#x2F;h2&gt;
&lt;p&gt;Ergodic Group works across four domains: mathematics, code, culture, and craft. Most companies live mostly in one of them. The edge comes from connecting them.&lt;&#x2F;p&gt;
&lt;p&gt;Mathematics sets the structure and the constraints. Code turns that structure into action and tests it against reality. Culture lets intent survive changes in personnel. Craft brings the whole thing back to materials, tolerances, and physical consequences.&lt;&#x2F;p&gt;
&lt;p&gt;SpaceX shows how these domains work on each other. The math: a technique called lossless convexification lets an onboard computer solve fuel-optimal landing trajectories in real time, computing the exact moment to fire the engines so velocity hits zero at touchdown. The code: autonomous guidance software recomputes trajectories during descent, adjusting for wind and sensor readings, which makes landings on ocean platforms possible. The culture: failures are instrumented, not hidden. Between 2013 and 2016, SpaceX crashed booster after booster, and each crash produced telemetry that led to a specific fix. Hydraulic fluid ran out, so they added more. A throttle valve stuck, so they redesigned it. The craft: when carbon fiber layup produced wrinkles at roughly $200 per kilogram, SpaceX switched Starship to stainless steel at roughly $3 per kilogram. Steel gets stronger at cryogenic temperatures, handles far more heat, and opened reentry profiles that carbon fiber could not. A materials decision changed the vehicle, the software, and the math.&lt;&#x2F;p&gt;
&lt;p&gt;The point is not that these domains coexist. It is that learning compounds when they stay connected.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ergodicity-as-a-filter&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ergodicity-as-a-filter&quot; aria-label=&quot;Anchor link for: ergodicity-as-a-filter&quot;&gt;#&lt;&#x2F;a&gt;Ergodicity as a filter&lt;&#x2F;h2&gt;
&lt;p&gt;Ergodicity describes a situation where repetition improves the usual outcome because learning carries over from one round to the next.&lt;&#x2F;p&gt;
&lt;p&gt;Claude Shannon spent fifteen years at Bell Labs before publishing “A Mathematical Theory of Communication” in 1948. He was not being graded on quarterly output. Bell Labs gave researchers something modern organizations rarely give anyone: enough uninterrupted time to get to the bottom of a problem. That setup produced the transistor, information theory, Unix, the laser, and cellular telephony. The transistor did not come from a brainstorm. It came from people with different specialties working near each other for years.&lt;&#x2F;p&gt;
&lt;p&gt;When AT&amp;amp;T was broken up in 1984, that model disappeared with it. No later technology company has reproduced the same output. The institution itself held the judgment, and that judgment did not survive disassembly.&lt;&#x2F;p&gt;
&lt;p&gt;As acceleration intensifies, most sectors get noisier and more fragile. Coordination gets harder. Institutional memory thins out. Advantages that looked durable turn out to depend on a few people, a few habits, or a distribution edge that disappears. Infrastructure and culture last longer because they are not just products to be sold. They are environments people operate inside. When learning carries forward, time starts working in your favor.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;operation&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#operation&quot; aria-label=&quot;Anchor link for: operation&quot;&gt;#&lt;&#x2F;a&gt;Operation&lt;&#x2F;h2&gt;
&lt;p&gt;In 1984, GM and Toyota opened a joint factory in Fremont, California called NUMMI. Toyota sent over four hundred trainers from Japan for months of side-by-side work with American employees. Absenteeism dropped from twenty percent to two percent. Defect rates fell to the lowest in the United States.&lt;&#x2F;p&gt;
&lt;p&gt;GM tried to export the lessons. A vice president told employees to “take a picture of every square inch” of NUMMI and replicate it at other plants. It failed everywhere. The visible process looked the same. The results did not. The missing piece was judgment, and judgment does not travel well as a memo. Toyota had not built a checklist. It had built a way of working.&lt;&#x2F;p&gt;
&lt;p&gt;Ergodic Group is built on what NUMMI proved and what GM missed. The value is not in the visible process. It is in the judgment that accumulates when people have time to learn, when the links between domains stay intact, and when repetition actually improves the work.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The new financial backend of the world</title>
        <published>2025-12-09T00:00:00+00:00</published>
        <updated>2025-12-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/ethereum/the-new-financial-backend-of-the-world/"/>
        <id>https://federicocarrone.com/series/ethereum/the-new-financial-backend-of-the-world/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/series/ethereum/the-new-financial-backend-of-the-world/">&lt;p&gt;&lt;strong&gt;By Federico Carrone and Roberto Catalan&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Ethereum is emerging as a general purpose financial backend that reduces the cost and complexity of building financial services while improving their speed and security. For decades the internet accelerated communication but did not create a neutral system for defining ownership or enforcing obligations. Economic activity moved online without the accompanying machinery of rights, records, and jurisdiction. Ethereum fills this gap by embedding these functions in software and enforcing them through a distributed validator set.&lt;&#x2F;p&gt;
&lt;p&gt;Markets depend on property rights, and property rights depend on reliable systems for recording ownership, supporting transfer, and enforcing obligations. Prices then communicate scarcity and preference, enabling coordination at scale. Technological progress has repeatedly lowered the cost of transmitting information and synchronizing action. Ethereum extends this pattern by lowering the cost of establishing and verifying ownership across borders.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;from-internet-native-to-global-infrastructure&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#from-internet-native-to-global-infrastructure&quot; aria-label=&quot;Anchor link for: from-internet-native-to-global-infrastructure&quot;&gt;#&lt;&#x2F;a&gt;From internet native to global infrastructure&lt;&#x2F;h2&gt;
&lt;p&gt;Ethereum’s early innovation was the introduction of programmable digital assets with defined economic properties. Issuers could establish monetary rules, engineer scarcity, and integrate assets into applications. Before Ethereum, such experimentation required constructing a  network and persuading others to secure it, a process limited to technically sophisticated groups. Ethereum replaced infrastructure duplication with shared security and a general purpose environment, turning issuance from a capital intensive undertaking into a software driven activity.&lt;&#x2F;p&gt;
&lt;p&gt;The more consequential development has been the recognition that Ethereum can reconstruct traditional financial services in a form that is more transparent and less operationally burdensome. Financial institutions devote substantial resources to authorization, accounting, monitoring, dispute resolution, and reporting. Consumer interfaces sit atop complex internal systems designed to prevent error and misconduct. Ethereum substitutes a portion of this apparatus with a shared ledger, a programmable execution environment, and cryptographic enforcement. Administrative complexity is reduced because core functions are delegated to software rather than replicated within each institution.&lt;&#x2F;p&gt;
&lt;p&gt;Ethereum reduces that burden by providing a shared ledger with real time updates, a programmable space for defining rules, and cryptographic enforcement. It does not remove institutions but changes which parts of the financial stack they must build themselves. Issuance becomes simpler, custody more secure, and administration less dependent on proprietary infrastructure.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;software-trust-and-the-reduction-of-friction&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#software-trust-and-the-reduction-of-friction&quot; aria-label=&quot;Anchor link for: software-trust-and-the-reduction-of-friction&quot;&gt;#&lt;&#x2F;a&gt;Software, trust and the reduction of friction&lt;&#x2F;h2&gt;
&lt;p&gt;Some economists describe transaction costs through three frictions: triangulation, transfer and trust. Triangulation concerns how economic actors identify each other and agree on terms. Transfer concerns how value moves between them. Trust concerns the enforcement of obligations. Traditional financial architecture manages these frictions through scale, proprietary systems, and coordination among intermediaries.&lt;&#x2F;p&gt;
&lt;p&gt;Ethereum remove middlemen and therefore lowers the three frictions enumerated before. Open marketplaces support discovery of assets and prices. Digital value can settle globally within minutes without the layers of correspondent banking. Obligations can be executed automatically and verified publicly. These capabilities do not eliminate institutional functions but shift part of the work from organizations to software, reducing cost and operational risk.&lt;&#x2F;p&gt;
&lt;p&gt;New entrants benefit immediately. They can rely on infrastructure maintained by thousands of engineers rather than building their own systems for settlement, custody, and enforcement. Business logic becomes code. Obligations can be automated. Settlement becomes immediate. Users retain custody. This expands the range of viable business models and allows firms to serve markets that incumbents consider too small or too complex.&lt;&#x2F;p&gt;
&lt;p&gt;Having a single global ledger also changes operational dynamics. Many institutions operate multiple databases that require frequent reconciliation and remain vulnerable to error. Ethereum maintains a continuously updated and replicated record that cannot be amended retroactively. Redundancy and recoverability become default properties rather than costly internal functions.&lt;&#x2F;p&gt;
&lt;p&gt;Security follows the same pattern. Instead of defending a central database, Ethereum distributes verification among many independent actors. Altering history requires coordination at scale and becomes prohibitively expensive. Confidence arises from system design rather than institutional promises.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;new-financial-services-and-global-reach&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#new-financial-services-and-global-reach&quot; aria-label=&quot;Anchor link for: new-financial-services-and-global-reach&quot;&gt;#&lt;&#x2F;a&gt;New financial services and global reach&lt;&#x2F;h2&gt;
&lt;p&gt;These features enable services that resemble established financial activities but operate with different cost structures. International transfers can use digital dollars rather than correspondent networks. Loans can enforce collateral rules in code. Local payment systems can interoperate without proprietary standards. Individuals in unstable economies can store value in digital instruments independent of local monetary fragility.&lt;&#x2F;p&gt;
&lt;p&gt;Clearing, custody, reconciliation, monitoring, and enforcement shift from organizational processes into shared software. Companies can focus on product design and distribution rather than maintaining complex internal infrastructure. Scale is achieved by acquiring users, because infrastructure is shared. Value accrues to applications rather than to duplicated internal systems.&lt;&#x2F;p&gt;
&lt;p&gt;The impact is most visible in markets with fragile financial systems. In economies with unstable currencies or slow payment networks, Ethereum provides immediate functional gains. In developed markets the benefits appear incremental but accumulate as more instruments and processes become programmable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;institutional-transformation-and-long-term-dynamics&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#institutional-transformation-and-long-term-dynamics&quot; aria-label=&quot;Anchor link for: institutional-transformation-and-long-term-dynamics&quot;&gt;#&lt;&#x2F;a&gt;Institutional transformation and long term dynamics&lt;&#x2F;h2&gt;
&lt;p&gt;Many financial instruments are heterogeneous. Corporate debt is a clear example. Terms differ by maturity, coupon, covenants, collateral, and risk. Trading depends on bilateral negotiation and intermediaries who maintain records and enforce obligations. Ethereum can represent these instruments digitally, track ownership, and execute terms automatically. Contracts retain their specificity, while administration becomes standardized and interoperable.&lt;&#x2F;p&gt;
&lt;p&gt;The boundary between what firms must build and what software can enforce is moving. Regulation and legal systems remain central, but the institutions sitting on top of them look different when settlement, custody, and enforcement are handled by shared infrastructure instead of proprietary systems.&lt;&#x2F;p&gt;
&lt;p&gt;Ethereum already functions as an alternative financial rail. Multiple independently developed clients, substantial real world usage, an active research community, and a commitment to openness and verification set it apart from other blockchain networks.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;#&lt;&#x2F;a&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Ethereum converts core financial frictions into software functions, and that changes the economics of building and operating financial services. Institutions become lighter and more focused. Firms that adopt Ethereum early will operate at lower cost and gain a head start against competitors still running on legacy systems.&lt;&#x2F;p&gt;
&lt;p&gt;Technological transitions begin in niches where incumbents do not meet demand. As systems mature, costs fall and broader adoption becomes feasible. Ethereum followed this path. It began with internet native communities, expanded across emerging markets where users lacked reliable financial tools, and is now positioned to upgrade mainstream markets by making financial companies easier to create and operate.&lt;&#x2F;p&gt;
&lt;p&gt;Software is becoming the organizing principle of financial infrastructure. Ethereum makes that concrete. Regulation and institutional adaptation will shape how far it goes, but the economic incentives already point toward systems that are open, verifiable, and resilient.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The missing institution of the Internet</title>
        <published>2025-12-02T00:00:00+00:00</published>
        <updated>2025-12-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/series/ethereum/the-missing-institution-of-the-internet/"/>
        <id>https://federicocarrone.com/series/ethereum/the-missing-institution-of-the-internet/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/series/ethereum/the-missing-institution-of-the-internet/">&lt;p&gt;&lt;strong&gt;By Federico Carrone and Roberto Catalan&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Modern economic systems rest on two foundations: tools that expand productive capacity and institutions that define who controls their output. The internet transformed how information moves, but it did not reconstruct the institutional machinery that governs ownership and exchange. Digital economic life therefore expanded without a durable system of rights, enforcement, or jurisdiction. Blockchain networks, and Ethereum in particular, address this gap by embedding institutional functions in software and enforcing them through economic incentives and cryptographic verification.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;technology-culture-and-institutional-design&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#technology-culture-and-institutional-design&quot; aria-label=&quot;Anchor link for: technology-culture-and-institutional-design&quot;&gt;#&lt;&#x2F;a&gt;Technology, Culture and Institutional Design&lt;&#x2F;h2&gt;
&lt;p&gt;Humans build two kinds of things: tools that expand what individuals can do, and institutions that coordinate what groups can do together. Fire, agriculture, medicine and computing are tools. Property rights, contracts, markets and corporate structures are institutions. The two feed each other. Tools expand capacity, institutions channel it into collective action, and the combination compounds over time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;property-rights-and-markets-as-social-technologies&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#property-rights-and-markets-as-social-technologies&quot; aria-label=&quot;Anchor link for: property-rights-and-markets-as-social-technologies&quot;&gt;#&lt;&#x2F;a&gt;Property Rights and Markets as Social Technologies&lt;&#x2F;h2&gt;
&lt;p&gt;People invest when they believe they will keep what they earn. Property rights give that assurance by specifying who owns what, who can use it, and who is excluded. Markets sit on top of these rights and coordinate production through prices. None of this is natural. It is all engineered through law and political settlement.&lt;&#x2F;p&gt;
&lt;p&gt;Prices, money and contracts compress information about scarcity and risk so that strangers can trade without needing to trust each other or answer to a central planner. The global expansion of trade in the twentieth century ran on this machinery: neutral jurisdictions, corporate structures, and legal containers that let participants from different regulatory environments collaborate. Whatever you think of it, this infrastructure underwrote the international economic order of the late twentieth century.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-missing-architecture-of-digital-ownership&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-missing-architecture-of-digital-ownership&quot; aria-label=&quot;Anchor link for: the-missing-architecture-of-digital-ownership&quot;&gt;#&lt;&#x2F;a&gt;The Missing Architecture of Digital Ownership&lt;&#x2F;h2&gt;
&lt;p&gt;The internet lowered the cost of communication and commerce across borders, but it did not establish a neutral mechanism for defining and enforcing claims on digital assets. Offline, ownership is adjudicated by courts, enforced by states and geographically bounded. Online, in the absence of a global authority, ownership defaults to either national legal systems or to the platforms that mediate activity.&lt;&#x2F;p&gt;
&lt;p&gt;Corporations filled this vacuum by providing infrastructure for identity, communication and exchange. They set terms of access, mediate transactions and retain discretionary control over assets generated within their systems. Users and firms may create content, build businesses and accumulate value, but their rights are contingent on the policies of the platform operator.&lt;&#x2F;p&gt;
&lt;p&gt;The experience of Zynga illustrates this dynamic. The company developed a profitable games business on Facebook and briefly achieved a valuation exceeding that of Electronic Arts. Its fortunes deteriorated when Facebook revised its policies and altered its revenue share. Zynga owned its intellectual property and its infrastructure but not the environment on which its business model depended, a common position for firms built on platform economies. In digital markets, platforms function as de facto landlords.&lt;&#x2F;p&gt;
&lt;p&gt;This is not an isolated case but a structural feature of platform centered economies: extensive participation paired with limited control.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ethereum-as-an-institutional-experiment&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#ethereum-as-an-institutional-experiment&quot; aria-label=&quot;Anchor link for: ethereum-as-an-institutional-experiment&quot;&gt;#&lt;&#x2F;a&gt;Ethereum as an Institutional Experiment&lt;&#x2F;h2&gt;
&lt;p&gt;Ethereum is a response to this institutional absence. It provides a mechanism for creating, transferring and enforcing digital assets without reliance on corporate or national intermediaries. The system operates as a verifiable computing environment in which rules are encoded in software and enforced collectively by a distributed network.&lt;&#x2F;p&gt;
&lt;p&gt;Traditional computing systems require users to trust the operator. Ethereum distributes computation across thousands of machines that execute identical code and verify each other in a continuous process. Outputs are accepted when consensus is reached and misbehavior is economically penalized. Under these conditions, property rights and contractual commitments can be represented as digital objects whose enforcement does not depend on courts or discretionary authority.&lt;&#x2F;p&gt;
&lt;p&gt;This architecture automates functions normally performed by institutions. Auditors repeat financial records to detect manipulation. Courts resolve disputes. Regulators impose compliance standards. These systems are essential but costly and slow. Ethereum replicates aspects of verification and enforcement at the system level using software, mathematics and economic incentives.&lt;&#x2F;p&gt;
&lt;p&gt;The network is open to participation without authorization and resistant to censorship because no single entity can unilaterally block or rewrite transactions. These properties arise from the structure of the system rather than ideological intent.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-emergence-of-a-digital-financial-system&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-emergence-of-a-digital-financial-system&quot; aria-label=&quot;Anchor link for: the-emergence-of-a-digital-financial-system&quot;&gt;#&lt;&#x2F;a&gt;The Emergence of a Digital Financial System&lt;&#x2F;h2&gt;
&lt;p&gt;The first adopters of Ethereum were technologists experimenting with new mechanisms for ownership and coordination. Most of the culture and products were created for themselves. Over time, a broader range of actors began using the system for financial services.&lt;&#x2F;p&gt;
&lt;p&gt;The most consequential development has been the rise of stablecoins, digital representations of fiat currency backed by real world assets. Their combined market capitalization exceeds three hundred billion dollars, with a majority circulating on Ethereum. Transaction volumes on blockchain networks now approach those processed by major payment systems.&lt;&#x2F;p&gt;
&lt;p&gt;Stablecoins replicate core financial functions such as store of value and transfer of funds without geographic restrictions and with continuous settlement. Their programmability enabled the construction of lending protocols that allow users to lend and borrow assets with risk parameters enforced in software rather than through institutional mediation.&lt;&#x2F;p&gt;
&lt;p&gt;These systems differ from traditional financial infrastructure. Participation is global rather than jurisdictional. Switching costs are low because services are built on interoperable standards. Exit is immediate. Risk is transparent though often misunderstood.&lt;&#x2F;p&gt;
&lt;p&gt;Compare that to countries like Argentina, where interoperability between banks and fintech wallets, something as trivial as scanning a QR code, is still an ongoing regulatory battle. Incumbents try to use their market position to avoid being interoperable. On Ethereum, interoperability is structural. Individuals can receive payment, convert assets, provide liquidity and borrow collateralized funds within minutes from a mobile device. In legacy systems, similar transactions take days and incur high fees. Adoption reflects demand for neutral infrastructure in environments where intermediation is unreliable.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;implications&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#implications&quot; aria-label=&quot;Anchor link for: implications&quot;&gt;#&lt;&#x2F;a&gt;Implications&lt;&#x2F;h2&gt;
&lt;p&gt;Several areas of financial activity are migrating to blockchain based systems, including remittances, trade finance and private credit. Others, such as corporate debt markets, remain fragmented and costly but exhibit characteristics that may make them suitable for digital reconstruction on top of Ethereum.&lt;&#x2F;p&gt;
&lt;p&gt;Plenty can still go wrong. Regulatory uncertainty, operational risk and rough user experience all constrain adoption. Scaling throughput without giving up decentralization remains an open engineering problem. Software vulnerabilities and governance failures have already caused real losses and will cause more.&lt;&#x2F;p&gt;
&lt;p&gt;Early evidence suggests that parts of financial intermediation can run at lower cost and with more transparency than existing systems. Whether that continues depends as much on how regulators and incumbents respond as on the technology itself.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;artificial-intelligence-and-coordination&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#artificial-intelligence-and-coordination&quot; aria-label=&quot;Anchor link for: artificial-intelligence-and-coordination&quot;&gt;#&lt;&#x2F;a&gt;Artificial Intelligence and Coordination&lt;&#x2F;h2&gt;
&lt;p&gt;Artificial intelligence increases productive capacity by automating tasks but does not resolve questions of ownership, governance or compliance. Output may be generated more efficiently, but disputes over entitlement, liability and compensation persist.&lt;&#x2F;p&gt;
&lt;p&gt;Artificial intelligence and blockchains, but in particular Ethereum, are the two biggest innovations in the decades to come. The two technologies solve concrete core primitives of humans: productivity gains and coordination. Artificial intelligence will make people more productive, but it will not eliminate the bureaucratic machinery required to verify and enforce outcomes. Ethereum introduces a technology that complements AI: a system where humans and autonomous agents can coordinate, trade, and settle disputes directly through code, without relying on institutions to prove that everyone followed the rules.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;#&lt;&#x2F;a&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The internet lowered the cost of transmitting information but left digital ownership in the hands of whoever runs the platform. Ethereum reconstructs elements of property rights and contractual enforcement as public infrastructure encoded in software.&lt;&#x2F;p&gt;
&lt;p&gt;It may end up as core infrastructure or it may remain a specialized tool. That depends on regulators, incumbents, and whether the engineering problems get solved. But it has already shown that financial coordination can run at a different cost structure, and that digital property can exist without a central administrator.&lt;&#x2F;p&gt;
&lt;p&gt;The internet built an economy without institutions. Ethereum is an attempt to build them.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Next 10 Years of Ethereum</title>
        <published>2025-11-15T00:00:00+00:00</published>
        <updated>2025-11-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/talks/next-10-years-of-ethereum/"/>
        <id>https://federicocarrone.com/talks/next-10-years-of-ethereum/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/talks/next-10-years-of-ethereum/"></content>
        
    </entry>
    <entry xml:lang="en">
        <title>Ethereum&#x27;s Native Rollup Roadmap with Justin Drake</title>
        <published>2025-10-01T00:00:00+00:00</published>
        <updated>2025-10-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/talks/podcast-with-justin-drake/"/>
        <id>https://federicocarrone.com/talks/podcast-with-justin-drake/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/talks/podcast-with-justin-drake/"></content>
        
    </entry>
    <entry xml:lang="en">
        <title>Crypto doctrine</title>
        <published>2025-09-25T00:00:00+00:00</published>
        <updated>2025-09-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/articles/crypto-doctrine/"/>
        <id>https://federicocarrone.com/articles/crypto-doctrine/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/articles/crypto-doctrine/">&lt;h1 id=&quot;crypto-and-the-accelerated-and-chaotic-21st-century&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#crypto-and-the-accelerated-and-chaotic-21st-century&quot; aria-label=&quot;Anchor link for: crypto-and-the-accelerated-and-chaotic-21st-century&quot;&gt;#&lt;&#x2F;a&gt;Crypto and the accelerated and chaotic 21st Century&lt;&#x2F;h1&gt;
&lt;p&gt;Crypto has been most useful where trust is weakest. In practice, it has found product-market fit in two places:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;In countries where inflation, capital controls, or censorship are ordinary constraints, crypto gives people and companies tools they actually need.&lt;&#x2F;li&gt;
&lt;li&gt;In internet-native communities, crypto provides a financial layer that lets people coordinate, speculate, and build markets at a scale the web did not support before.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;People that don’t live in a developing country or that didn’t grow up with the internet have enormous difficulties understanding crypto because they don’t have skin in its game. They believe crypto doesn’t have any “real” use case or that is not serious enough. They are right. The thing is that we are living in a world that’s becoming more absurd.&lt;&#x2F;p&gt;
&lt;p&gt;Memes do not only make you laugh anymore, memes are now winning elections.&lt;&#x2F;p&gt;
&lt;p&gt;These use cases will grow with time and probably new ones will be found. The world is becoming more chaotic and more divided each day. Crypto benefits from that kind of environment because it reduces the number of places where trust has to be taken on faith.&lt;&#x2F;p&gt;
&lt;p&gt;One of crypto’s prime advantages is that it kills many of the middlemen and allows us to coordinate even in the harshest environments. Trust assumptions fall because more of the system is enforced by incentives, compilers, distributed systems, and cryptography. That does not remove politics or disagreement. It just narrows the set of things people need to argue about.&lt;&#x2F;p&gt;
&lt;p&gt;Most of us are internet natives. We grew up on IRC, 4chan, Reddit, Hacker News, Twitter, Bitcoin, and Ethereum, and we also have roots in unstable countries. We are the Fremen of crypto, raised in a harsh environment. We know what chaotic societies feel like from the inside, and we know what it takes to build inside them. At the same time, we are builders who like working at the frontier of engineering and scientific change.&lt;&#x2F;p&gt;
&lt;p&gt;Open source and decentralization are not just philosophical preferences for crypto. They are practical conditions for the ecosystem to work. Building in the open, helping other people onboard, and creating systems larger than the original project are part of how crypto survives long term. This can look irrational if you assume the only goal is short-term extraction. It is more legible if you assume the goal is to help a new financial and coordination layer persist.&lt;&#x2F;p&gt;
&lt;p&gt;Our main objective is to help these new internet highways get built in sustainable ways. Economic sustainability matters, but so do resilience, openness, and the ability to resist the usual drift toward centralization. Centralization is almost always easier in the short run. If pure money were the only objective, there would be simpler ways to make it. We treat money as a tool, not the final point.&lt;&#x2F;p&gt;
&lt;p&gt;With or without money, you will find us building.&lt;&#x2F;p&gt;
&lt;p&gt;“Top-down management leveraging command-and-control hierarchies are for the mahogany boardrooms of yesteryear. We are navigators, adventurers, and explorers of the future. We are married to the sea” - Yearn’s Blue Pill&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zero-Knowledge Proofs and the Economics of Verification</title>
        <published>2023-04-13T00:00:00+00:00</published>
        <updated>2023-04-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://federicocarrone.com/articles/transforming-the-future-with-zero-knowledge-proofs-fully-homomorphic-encryption-and-new-distributed-systems-algorithms/"/>
        <id>https://federicocarrone.com/articles/transforming-the-future-with-zero-knowledge-proofs-fully-homomorphic-encryption-and-new-distributed-systems-algorithms/</id>
        
        <content type="html" xml:base="https://federicocarrone.com/articles/transforming-the-future-with-zero-knowledge-proofs-fully-homomorphic-encryption-and-new-distributed-systems-algorithms/">&lt;p&gt;Scientific and engineering fields usually move in long stretches of incremental work. Then, every so often, a new tool or idea changes the constraints and the whole field jumps. Most of the time progress comes from thousands of small improvements made by researchers, engineers, and companies. But occasionally something arrives that changes what is practical, not just what is theoretically possible.&lt;&#x2F;p&gt;
&lt;p&gt;The public usually notices breakthroughs in areas like aerospace, energy, or AI. Cryptography moves more quietly, even when the consequences are just as large. During the COVID years, the field made real progress, especially in zero-knowledge proofs and other primitives that make verification cheaper and privacy easier to preserve. The bet in this piece is that these advances will matter well beyond cryptography itself.&lt;&#x2F;p&gt;
&lt;p&gt;One of the most important changes has been practical speed. Zero-knowledge proofs have existed since the 1980s, but for a long time they lived mostly in papers because the proving costs were too high for ordinary systems. Over the last decade, and especially in the last few years, that changed. Engineers pushed them much closer to real-world use.&lt;&#x2F;p&gt;
&lt;p&gt;The financial system still depends on intermediaries: auditors, regulators, accountants, banks, and payment networks. That system works when the institutions inside it are trusted and the surrounding state has enough legitimacy to enforce the rules. Bitcoin introduced a different model: a permissionless monetary network where users can move value without asking an intermediary for access. In places where inflation, capital controls, or institutional weakness are part of daily life, that difference is not theoretical. It is immediate.&lt;&#x2F;p&gt;
&lt;p&gt;As trust becomes more uneven, systems that can be independently verified become more attractive. That does not mean social trust disappears. It means more parts of the stack will be built so they rely on less of it.&lt;&#x2F;p&gt;
&lt;p&gt;Bitcoin was designed primarily as a monetary asset and settlement network, so expressive computation on top of it has always been limited by design. Ethereum expanded that design space by allowing more complex programs, which is why lending, exchanges, and other financial applications grew there first. But blockchains still impose severe constraints. Computation is expensive, throughput is limited, and the cost of moving meaningful value is often too high.&lt;&#x2F;p&gt;
&lt;p&gt;This is where zero-knowledge proofs and related distributed-systems primitives become useful. A zero-knowledge proof lets one party show that a computation was done correctly without revealing the underlying data and without forcing everyone else to rerun the computation. The crucial asymmetry is that proving is expensive, but verification is much cheaper. That is what makes the technique economically meaningful rather than just mathematically elegant.&lt;&#x2F;p&gt;
&lt;p&gt;At the beginning it’s difficult to grasp, even for engineers, that this technology is possible. The mathematics behind it, until recently, seemed magical, and that’s why it was called moon math. Thanks to ZKPs, transferring money in systems similar to Bitcoin becomes cheaper and much faster because there is no need for every node to re-execute each transaction. In some architectures, one node can process all the transactions and prove them using ZKPs, while the rest simply verify them, saving valuable computing resources. Among other things, ZKPs enable creating a financial system that doesn’t depend on social trust like traditional finance and that doesn’t depend as much on re-executing algorithms as Bitcoin.&lt;&#x2F;p&gt;
&lt;p&gt;Zero Knowledge Proofs facilitate the development of an entirely new range of applications that are executed and proven on a single computer outside the blockchain, with verification happening within Ethereum. The cost of verification is much lower than the cost of proving or executing the computation. Ethereum will evolve from a slow yet secure distributed mainframe, where execution time is shared among all users to run small programs, into a distributed computer that stores and verifies proofs generated externally from the blockchain.&lt;&#x2F;p&gt;
&lt;p&gt;Blockchains are not the only systems that benefit from these primitives. As AI-generated content begins to overshadow human-generated content on the internet, ZKPs become useful for verifying that content came from a specific model, system, or approved pipeline. “Proof of humanity” systems are already using ZKPs to verify that a human is accessing specific resources.&lt;&#x2F;p&gt;
&lt;p&gt;More broadly, some industries will face growing pressure to prove they are operating correctly rather than asking users to trust them. Online gaming, ad networks, and other opaque intermediaries are obvious candidates. Fully Homomorphic Encryption, a related primitive that enables computation on encrypted data without exposing it, will play a similar role wherever privacy constraints are binding.&lt;&#x2F;p&gt;
&lt;p&gt;In the past decade, we have launched applications serving tens of millions of users. We are now focused on helping others build startups around these technologies where the technical advantage is real and the use case is concrete.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
