<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Orb Blog</title>
        <link>https://orb.almadar.io/blog</link>
        <description>Orb Blog</description>
        <lastBuildDate>Tue, 17 Feb 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Trait Machines of Loving Grace]]></title>
            <link>https://orb.almadar.io/blog/trait-machines-of-loving-grace</link>
            <guid>https://orb.almadar.io/blog/trait-machines-of-loving-grace</guid>
            <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Autonomous systems are getting more capable and less legible. Machine learning models can perceive, classify, and optimize, but as capability grows, interpretability shrinks. In safety-critical environments, systems act faster than humans can understand why. Trait Machines address this by making autonomous behavior explicitly readable, auditable, and constrainable without discarding machine learning.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBPcmJpdCByaW5nIC0tPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSIxODAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtZGFzaGFycmF5PSI4IDQiIG9wYWNpdHk9IjAuMiIvPgogICAgPCEtLSBDb25uZWN0aW9uIGxpbmVzIC0tPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjMwMCIgeDI9IjQwMCIgeTI9IjEzMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNSAzIiBvcGFjaXR5PSIwLjQiLz48bGluZSB4MT0iNDAwIiB5MT0iMzAwIiB4Mj0iNTQ3IiB5Mj0iMjE1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNCIvPjxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSI1NDciIHkyPSIzODUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC40Ii8+PGxpbmUgeDE9IjQwMCIgeTE9IjMwMCIgeDI9IjQwMCIgeTI9IjQ3MCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNSAzIiBvcGFjaXR5PSIwLjQiLz48bGluZSB4MT0iNDAwIiB5MT0iMzAwIiB4Mj0iMjUzIiB5Mj0iMzg1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNCIvPjxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSIyNTMiIHkyPSIyMTUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC40Ii8+CiAgICA8IS0tIENlbnRyYWwgZW50aXR5IC0tPgogICAgPHJlY3QgeD0iMzQwIiB5PSIyNjAiIHdpZHRoPSIxMjAiIGhlaWdodD0iODAiIHJ4PSI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iNCIgZmlsdGVyPSJ1cmwoI2dsb3cpIi8+CiAgICA8cmVjdCB4PSIzNjAiIHk9IjI3OCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjgiLz4KICAgIDxyZWN0IHg9IjM2MCIgeT0iMjkyIiB3aWR0aD0iNzAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzYwIiB5PSIzMDQiIHdpZHRoPSI1NSIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzNjAiIHk9IjMxNiIgd2lkdGg9IjY1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gVHJhaXQgbm9kZXMgLS0+CiAgICA8cmVjdCB4PSIzNTAiIHk9IjEwOCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NCIgcng9IjE4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+PHJlY3QgeD0iMzcwIiB5PSIxMjUiIHdpZHRoPSI2MCIgaGVpZ2h0PSI2IiByeD0iMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC42Ii8+PHJlY3QgeD0iNDk3IiB5PSIxOTMiIHdpZHRoPSIxMDAiIGhlaWdodD0iNDQiIHJ4PSIxOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPjxyZWN0IHg9IjUxNyIgeT0iMjEwIiB3aWR0aD0iNjAiIGhlaWdodD0iNiIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNiIvPjxyZWN0IHg9IjQ5NyIgeT0iMzYzIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ0IiByeD0iMTgiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz48cmVjdCB4PSI1MTciIHk9IjM4MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYiIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjYiLz48cmVjdCB4PSIzNTAiIHk9IjQ0OCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NCIgcng9IjE4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+PHJlY3QgeD0iMzcwIiB5PSI0NjUiIHdpZHRoPSI2MCIgaGVpZ2h0PSI2IiByeD0iMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC42Ii8+PHJlY3QgeD0iMjAzIiB5PSIzNjMiIHdpZHRoPSIxMDAiIGhlaWdodD0iNDQiIHJ4PSIxOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPjxyZWN0IHg9IjIyMyIgeT0iMzgwIiB3aWR0aD0iNjAiIGhlaWdodD0iNiIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNiIvPjxyZWN0IHg9IjIwMyIgeT0iMTkzIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ0IiByeD0iMTgiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz48cmVjdCB4PSIyMjMiIHk9IjIxMCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYiIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjYiLz4KICAKPC9nPgogIDxnIGNsYXNzPSJkYXJrLXZhcmlhbnQiPgogIDxkZWZzPgogICAgPGZpbHRlciBpZD0iZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjgiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyIGlkPSJzb2Z0LWdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICAKICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSI4MDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjMTExMTE3Ii8+CiAgICA8IS0tIE9yYml0IHJpbmcgLS0+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSIzMDAiIHI9IjE4MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1kYXNoYXJyYXk9IjggNCIgb3BhY2l0eT0iMC4yIi8+CiAgICA8IS0tIENvbm5lY3Rpb24gbGluZXMgLS0+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMzAwIiB4Mj0iNDAwIiB5Mj0iMTMwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNCIvPjxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSI1NDciIHkyPSIyMTUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC40Ii8+PGxpbmUgeDE9IjQwMCIgeTE9IjMwMCIgeDI9IjU0NyIgeTI9IjM4NSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNSAzIiBvcGFjaXR5PSIwLjQiLz48bGluZSB4MT0iNDAwIiB5MT0iMzAwIiB4Mj0iNDAwIiB5Mj0iNDcwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNCIvPjxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSIyNTMiIHkyPSIzODUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC40Ii8+PGxpbmUgeDE9IjQwMCIgeTE9IjMwMCIgeDI9IjI1MyIgeTI9IjIxNSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNSAzIiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gQ2VudHJhbCBlbnRpdHkgLS0+CiAgICA8cmVjdCB4PSIzNDAiIHk9IjI2MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI4MCIgcng9IjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI0IiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxyZWN0IHg9IjM2MCIgeT0iMjc4IiB3aWR0aD0iNTAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuOCIvPgogICAgPHJlY3QgeD0iMzYwIiB5PSIyOTIiIHdpZHRoPSI3MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzNjAiIHk9IjMwNCIgd2lkdGg9IjU1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjM2MCIgeT0iMzE2IiB3aWR0aD0iNjUiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBUcmFpdCBub2RlcyAtLT4KICAgIDxyZWN0IHg9IjM1MCIgeT0iMTA4IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ0IiByeD0iMTgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz48cmVjdCB4PSIzNzAiIHk9IjEyNSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYiIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjYiLz48cmVjdCB4PSI0OTciIHk9IjE5MyIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NCIgcng9IjE4IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+PHJlY3QgeD0iNTE3IiB5PSIyMTAiIHdpZHRoPSI2MCIgaGVpZ2h0PSI2IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+PHJlY3QgeD0iNDk3IiB5PSIzNjMiIHdpZHRoPSIxMDAiIGhlaWdodD0iNDQiIHJ4PSIxOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPjxyZWN0IHg9IjUxNyIgeT0iMzgwIiB3aWR0aD0iNjAiIGhlaWdodD0iNiIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNiIvPjxyZWN0IHg9IjM1MCIgeT0iNDQ4IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjQ0IiByeD0iMTgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz48cmVjdCB4PSIzNzAiIHk9IjQ2NSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYiIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjYiLz48cmVjdCB4PSIyMDMiIHk9IjM2MyIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0NCIgcng9IjE4IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+PHJlY3QgeD0iMjIzIiB5PSIzODAiIHdpZHRoPSI2MCIgaGVpZ2h0PSI2IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+PHJlY3QgeD0iMjAzIiB5PSIxOTMiIHdpZHRoPSIxMDAiIGhlaWdodD0iNDQiIHJ4PSIxOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPjxyZWN0IHg9IjIyMyIgeT0iMjEwIiB3aWR0aD0iNjAiIGhlaWdodD0iNiIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNiIvPgogIAo8L2c+Cjwvc3ZnPg==" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>Autonomous systems are getting more capable and less legible. Machine learning models can perceive, classify, and optimize, but as capability grows, interpretability shrinks. In safety-critical environments, systems act faster than humans can understand why. Trait Machines address this by making autonomous behavior explicitly readable, auditable, and constrainable without discarding machine learning.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-core-idea">The Core Idea<a href="https://orb.almadar.io/blog/trait-machines-of-loving-grace#the-core-idea" class="hash-link" aria-label="Direct link to The Core Idea" title="Direct link to The Core Idea" translate="no">​</a></h2>
<p>A Trait Machine is a constrained state machine with five elements: states (situations the system can be in), events (things that happen), transitions (how state changes), guards (conditions that must be true), and effects (what the system does). State machines are decades old. The difference is how .orb composes and exposes them for autonomous systems.</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-9-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-9-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-9-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">Robot</text></g><g opacity="0.7" transform="rotate(-60,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(60,239,200)">Movement</text></g><g opacity="0.7" transform="rotate(0,300,200)"><ellipse cx="300" cy="200" rx="75" ry="32" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="219" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(0,219,200)">ObstacleStop</text></g><g opacity="0.7" transform="rotate(60,300,200)"><ellipse cx="300" cy="200" rx="95" ry="40" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="199" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(-60,199,200)">Scanning</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="326" y1="200" x2="334" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="300" y1="226" x2="300" y2="234" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="274" y1="200" x2="266" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/control</text></g><g opacity="1"><rect x="308.58870022479493" y="324.28784639787557" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="313.58870022479493" y="346.28784639787557" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/monitor</text></g></svg></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="safety-as-a-trait">Safety as a Trait<a href="https://orb.almadar.io/blog/trait-machines-of-loving-grace#safety-as-a-trait" class="hash-link" aria-label="Direct link to Safety as a Trait" title="Direct link to Safety as a Trait" translate="no">​</a></h2>
<p>Safety is not a separate layer bolted onto the system. It is expressed in the same language as capability. Here is an obstacle detection trait for a patrol robot:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ObstacleStop"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Robot"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"patrolling"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stopped"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"patrolling"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stopped"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OBSTACLE_DETECTED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.distance"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.motors"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"off"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"STOPPED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"reason"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"obstacle too close"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stopped"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"patrolling"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CLEAR"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.motors"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"on"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Two states, two transitions, one guard. If an obstacle is closer than 0.5 meters, motors turn off. The trait is intentionally small. Small systems are readable. Readable systems are debuggable. Debuggable systems are trustworthy.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flat-composition">Flat Composition<a href="https://orb.almadar.io/blog/trait-machines-of-loving-grace#flat-composition" class="hash-link" aria-label="Direct link to Flat Composition" title="Direct link to Flat Composition" translate="no">​</a></h2>
<p>An inspection robot composes multiple traits at the entity level:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"InspectionRobot"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"persistence"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"runtime"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"position"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"motors"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"on"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"scanResult"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"zone"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Movement"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"InspectionRobot"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ObstacleStop"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"InspectionRobot"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Scanning"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"InspectionRobot"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ZoneEnforcement"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"InspectionRobot"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Composition is flat. You can inspect the robot's full behavioral surface by reading the trait list. No execution trees to trace.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="constraining-machine-learning">Constraining Machine Learning<a href="https://orb.almadar.io/blog/trait-machines-of-loving-grace#constraining-machine-learning" class="hash-link" aria-label="Direct link to Constraining Machine Learning" title="Direct link to Constraining Machine Learning" translate="no">​</a></h2>
<p>Trait Machines do not replace ML. They constrain it. A learned navigation model proposes paths, but the trait guard validates them before execution:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"navigating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"NAVIGATE_TO"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.isCollisionFree"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.speedWithinLimit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.avoidsRestricted"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.currentPath"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.proposedPath"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>If the guard fails, the system stays in <code>idle</code> and emits <code>PATH_REJECTED</code>. The model learns. The boundaries remain explicit. Guard rejections become structured training data: <code>PATH_REJECTED: restricted zone violation</code>. Learning becomes search inside safety, not across it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="runtime-legibility">Runtime Legibility<a href="https://orb.almadar.io/blog/trait-machines-of-loving-grace#runtime-legibility" class="hash-link" aria-label="Direct link to Runtime Legibility" title="Direct link to Runtime Legibility" translate="no">​</a></h2>
<p>Every decision produces a structured trace:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">14:03:22 State: patrolling</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">14:03:22 Event: OBSTACLE_DETECTED { distance: 0.3m, type: "person" }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">14:03:22 Guard: (&lt; @payload.distance 0.5) -&gt; TRUE</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">14:03:22 Transition: patrolling --&gt; stopped</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">14:03:22 Effect: (set motors "off")</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">14:03:22 Effect: (emit STOPPED { reason: "person detected at 0.3m" })</span><br></span></code></pre></div></div>
<p>Every decision is reconstructable as logic, not inference. Safety reviewers, domain experts, and regulators can read exactly why a system acted the way it did, while it runs, not after forensic analysis.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compile-time-validation">Compile-Time Validation<a href="https://orb.almadar.io/blog/trait-machines-of-loving-grace#compile-time-validation" class="hash-link" aria-label="Direct link to Compile-Time Validation" title="Direct link to Compile-Time Validation" translate="no">​</a></h2>
<p><code>orbital validate</code> detects unreachable states, unhandled events, invalid bindings, deadlocks, and cross-trait communication gaps at compile time, shifting failures from runtime to build time. Guards are deterministic, bounded-cost, and independent of global system size, enabling static worst-case timing certification.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-practical-claim">The Practical Claim<a href="https://orb.almadar.io/blog/trait-machines-of-loving-grace#the-practical-claim" class="hash-link" aria-label="Direct link to The Practical Claim" title="Direct link to The Practical Claim" translate="no">​</a></h2>
<p>Trait Machines do not solve alignment, replace ML, or remove human specification risk. They provide a behavioral specification and constraint layer where the specification is the system: the same artifact defines behavior, validates composition, and generates runtime execution logic.</p>
<p>Systems that act in human environments should be understandable by humans while they act. Not eventually. Not after analysis. While they run.</p>]]></content:encoded>
            <category>Robotics</category>
            <category>AI Safety</category>
            <category>State Machines</category>
            <category>Vision</category>
            <category>Orbital</category>
        </item>
        <item>
            <title><![CDATA[Modeling Memory with .orb]]></title>
            <link>https://orb.almadar.io/blog/ai-orbital-memory</link>
            <guid>https://orb.almadar.io/blog/ai-orbital-memory</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[An AI agent needs memory. Most approaches reach for vector databases and similarity search. In .orb, memory is just another Orbital Unit with entities, traits, and state machines.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBPdXRlciBtZW1vcnkgcmluZyAtLT4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjMwMCIgcj0iMTgwIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iMTIgNiIgb3BhY2l0eT0iMC41Ii8+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSIzMDAiIHI9IjE2MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIE1lbW9yeSBzZWdtZW50cyBvbiByaW5nIC0tPgogICAgPHJlY3QgeD0iMzk1IiB5PSIxMTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMiIgcng9IjQiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHRyYW5zZm9ybT0icm90YXRlKC0yMCA0MDAgMzAwKSIvPgogICAgPHJlY3QgeD0iMzk1IiB5PSIxMTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMiIgcng9IjQiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHRyYW5zZm9ybT0icm90YXRlKDI1IDQwMCAzMDApIi8+CiAgICA8cmVjdCB4PSIzOTUiIHk9IjExMCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjIyIiByeD0iNCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgdHJhbnNmb3JtPSJyb3RhdGUoNzAgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgxMTUgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgxNjAgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgyMDUgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgyNTAgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgyOTUgNDAwIDMwMCkiLz4KICAgIDwhLS0gQ2VudHJhbCBvcmJpdGFsIHVuaXQgLS0+CiAgICA8cG9seWdvbiBwb2ludHM9IjQwMCwyNDAgNDYwLDI3MCA0NjAsMzMwIDQwMCwzNjAgMzQwLDMzMCAzNDAsMjcwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMyIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSIyNSIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSI4IiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8IS0tIENvbm5lY3Rpb24gc3Bva2VzIHRvIG1lbW9yeSByaW5nIC0tPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjI0MCIgeDI9IjQwMCIgeTI9IjE0NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxsaW5lIHgxPSI0NjAiIHkxPSIyNzAiIHgyPSI1NDAiIHkyPSIxODAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIgb3BhY2l0eT0iMC41Ii8+CiAgICA8bGluZSB4MT0iNDYwIiB5MT0iMzMwIiB4Mj0iNTQwIiB5Mj0iNDIwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI0IDMiIG9wYWNpdHk9IjAuNSIvPgogICAgPGxpbmUgeDE9IjM0MCIgeTE9IjI3MCIgeDI9IjI2MCIgeTI9IjE4MCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxsaW5lIHgxPSIzNDAiIHkxPSIzMzAiIHgyPSIyNjAiIHkyPSI0MjAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIgb3BhY2l0eT0iMC41Ii8+CiAgCjwvZz4KICA8ZyBjbGFzcz0iZGFyay12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iIzExMTExNyIvPgogICAgPCEtLSBPdXRlciBtZW1vcnkgcmluZyAtLT4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjMwMCIgcj0iMTgwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iMTIgNiIgb3BhY2l0eT0iMC41Ii8+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSIzMDAiIHI9IjE2MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIE1lbW9yeSBzZWdtZW50cyBvbiByaW5nIC0tPgogICAgPHJlY3QgeD0iMzk1IiB5PSIxMTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMiIgcng9IjQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHRyYW5zZm9ybT0icm90YXRlKC0yMCA0MDAgMzAwKSIvPgogICAgPHJlY3QgeD0iMzk1IiB5PSIxMTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyMiIgcng9IjQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHRyYW5zZm9ybT0icm90YXRlKDI1IDQwMCAzMDApIi8+CiAgICA8cmVjdCB4PSIzOTUiIHk9IjExMCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjIyIiByeD0iNCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgdHJhbnNmb3JtPSJyb3RhdGUoNzAgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgxMTUgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgxNjAgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgyMDUgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgyNTAgNDAwIDMwMCkiLz4KICAgIDxyZWN0IHg9IjM5NSIgeT0iMTEwIiB3aWR0aD0iNDAiIGhlaWdodD0iMjIiIHJ4PSI0IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgyOTUgNDAwIDMwMCkiLz4KICAgIDwhLS0gQ2VudHJhbCBvcmJpdGFsIHVuaXQgLS0+CiAgICA8cG9seWdvbiBwb2ludHM9IjQwMCwyNDAgNDYwLDI3MCA0NjAsMzMwIDQwMCwzNjAgMzQwLDMzMCAzNDAsMjcwIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSIyNSIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSI4IiBmaWxsPSIjZmZmZmZmIi8+CiAgICA8IS0tIENvbm5lY3Rpb24gc3Bva2VzIHRvIG1lbW9yeSByaW5nIC0tPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjI0MCIgeDI9IjQwMCIgeTI9IjE0NSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxsaW5lIHgxPSI0NjAiIHkxPSIyNzAiIHgyPSI1NDAiIHkyPSIxODAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIgb3BhY2l0eT0iMC41Ii8+CiAgICA8bGluZSB4MT0iNDYwIiB5MT0iMzMwIiB4Mj0iNTQwIiB5Mj0iNDIwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI0IDMiIG9wYWNpdHk9IjAuNSIvPgogICAgPGxpbmUgeDE9IjM0MCIgeTE9IjI3MCIgeDI9IjI2MCIgeTI9IjE4MCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxsaW5lIHgxPSIzNDAiIHkxPSIzMzAiIHgyPSIyNjAiIHkyPSI0MjAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIgb3BhY2l0eT0iMC41Ii8+CiAgCjwvZz4KPC9zdmc+" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>An AI agent needs memory. Most approaches reach for vector databases and similarity search. In .orb, memory is just another Orbital Unit with entities, traits, and state machines.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="memory-as-an-orbital-unit">Memory as an Orbital Unit<a href="https://orb.almadar.io/blog/ai-orbital-memory#memory-as-an-orbital-unit" class="hash-link" aria-label="Direct link to Memory as an Orbital Unit" title="Direct link to Memory as an Orbital Unit" translate="no">​</a></h2>
<p>In .orb, everything is an Orbital Unit: an entity (data shape), traits (state machine behaviors), and pages (routes). Memory fits this model naturally. A memory system has structured data (what to remember), state transitions (when to record and retrieve), and UI (how to surface context).</p>
<p>Here is the Orbital Unit for an agent memory system:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-1-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-1-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-1-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">AgentMemory</text></g><g opacity="0.7" transform="rotate(-60,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(60,239,200)">RecallTrait</text></g><g opacity="0.7" transform="rotate(60,300,200)"><ellipse cx="300" cy="200" rx="75" ry="32" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="219" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(-60,219,200)">RecordTrait</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="318.3847763108502" y1="181.61522368914976" x2="324.04163056034264" y2="175.9583694396574" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="326" y1="200" x2="334" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="318.3847763108502" y1="218.38477631085024" x2="324.04163056034264" y2="224.0416305603426" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="300" y1="226" x2="300" y2="234" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="281.6152236891498" y1="218.38477631085024" x2="275.95836943965736" y2="224.0416305603426" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="274" y1="200" x2="266" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="281.6152236891498" y1="181.61522368914976" x2="275.95836943965736" y2="175.9583694396574" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">MemoryInspector</text></g></svg></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-entity-what-gets-remembered">The Entity: What Gets Remembered<a href="https://orb.almadar.io/blog/ai-orbital-memory#the-entity-what-gets-remembered" class="hash-link" aria-label="Direct link to The Entity: What Gets Remembered" title="Direct link to The Entity: What Gets Remembered" translate="no">​</a></h2>
<p>The <code>AgentMemory</code> entity captures structured fields rather than raw text chunks:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AgentMemory"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"sessionId"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"required"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"prompt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"required"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"patterns"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"array"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"entities"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"array"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"items"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"success"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"boolean"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"errorType"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"confidence"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"number"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"createdAt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"timestamp"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Each memory record is a typed row with queryable fields, not a vector embedding. You can ask "which patterns failed last week?" with a field filter instead of cosine similarity.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-trait-recording-and-recalling">The Trait: Recording and Recalling<a href="https://orb.almadar.io/blog/ai-orbital-memory#the-trait-recording-and-recalling" class="hash-link" aria-label="Direct link to The Trait: Recording and Recalling" title="Direct link to The Trait: Recording and Recalling" translate="no">​</a></h2>
<p>The <code>RecordTrait</code> manages the lifecycle of a memory entry through a state machine:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"RecordTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AgentMemory"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"recording"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stored"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"failed"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"recording"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SESSION_START"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.sessionId"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.sessionId"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.prompt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.prompt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"recording"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stored"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SESSION_COMPLETE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.success"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.patterns"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.patterns"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"create"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AgentMemory"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"recording"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"failed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SESSION_ERROR"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.success"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.errorType"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.errorType"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"create"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AgentMemory"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Every session moves through <code>idle</code> to <code>recording</code> to either <code>stored</code> or <code>failed</code>. The state machine enforces that you cannot mark a session complete without first starting it, and every outcome gets persisted.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-recall-trait-querying-memory">The Recall Trait: Querying Memory<a href="https://orb.almadar.io/blog/ai-orbital-memory#the-recall-trait-querying-memory" class="hash-link" aria-label="Direct link to The Recall Trait: Querying Memory" title="Direct link to The Recall Trait: Querying Memory" translate="no">​</a></h2>
<p>The <code>RecallTrait</code> handles retrieval. When the agent starts a new session, it queries past memories by structured fields:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"RecallTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"AgentMemory"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"listens"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SESSION_START"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"triggers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LOAD_CONTEXT"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"waiting"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"loaded"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"waiting"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"loaded"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LOAD_CONTEXT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"call-service"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"queryMemory"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"filter"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"success"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"sort"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"createdAt"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"desc"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"limit"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>No embeddings, no similarity thresholds. The recall trait listens for <code>SESSION_START</code> (emitted by <code>RecordTrait</code>) and loads the 10 most recent successful sessions. The compiler validates that the <code>emits</code>/<code>listens</code> wiring is complete.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-beats-vector-search">Why This Beats Vector Search<a href="https://orb.almadar.io/blog/ai-orbital-memory#why-this-beats-vector-search" class="hash-link" aria-label="Direct link to Why This Beats Vector Search" title="Direct link to Why This Beats Vector Search" translate="no">​</a></h2>
<p>Vector similarity finds text that looks alike. Structured .orb memory finds records by exact field queries: "all sessions where <code>success</code> is false and <code>patterns</code> contains <code>entity-table</code>." The difference matters when an agent needs to answer questions like "what errors did I hit when building list views?" A vector search would return documents about lists and errors. A field query returns the exact sessions.</p>
<p>The state machine also gives you something vectors cannot: a transition history. You can trace the path from <code>idle</code> to <code>recording</code> to <code>failed</code>, see what error occurred, and correlate it with the patterns used. Temporal reasoning becomes a graph traversal instead of a prompt engineering exercise.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="composing-memory-with-other-orbitals">Composing Memory with Other Orbitals<a href="https://orb.almadar.io/blog/ai-orbital-memory#composing-memory-with-other-orbitals" class="hash-link" aria-label="Direct link to Composing Memory with Other Orbitals" title="Direct link to Composing Memory with Other Orbitals" translate="no">​</a></h2>
<p>Because memory is an Orbital Unit, it composes with the rest of your application through events. The <code>RecordTrait</code> emits <code>SESSION_COMPLETE</code>. A <code>PreferenceTrait</code> on a separate <code>UserPreference</code> entity can listen for it and update the user's preferred patterns. A <code>ProjectContextTrait</code> can listen and add newly created entities to the project registry.</p>
<p>Each unit stays independent. The compiler verifies all event wiring at compile time. No message goes unhandled, no listener references a nonexistent event.</p>
<p>Memory in .orb is not a special subsystem. It follows the same entity-trait-page formula as every other part of your application.</p>]]></content:encoded>
            <category>Architecture</category>
            <category>AI &amp; Machine Learning</category>
        </item>
        <item>
            <title><![CDATA[The Closed Circuit Pattern in .orb]]></title>
            <link>https://orb.almadar.io/blog/closed-circuit-pattern</link>
            <guid>https://orb.almadar.io/blog/closed-circuit-pattern</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Ever opened a modal and could not close it? That is a broken circuit. The .orb compiler makes it impossible to build one.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBDeWNsZSBvdXRsaW5lIC0tPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSIxNzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtZGFzaGFycmF5PSI4IDQiIG9wYWNpdHk9IjAuMiIvPgogICAgPCEtLSBBcnJvd3MgLS0+CiAgICA8bGluZSB4MT0iNDMzIiB5MT0iMTU5IiB4Mj0iNTA2IiB5Mj0iMjAxIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgb3BhY2l0eT0iMC41Ii8+PHBvbHlnb24gcG9pbnRzPSI1MDMsMjA1IDUxNCwyMDYgNTA4LDE5NyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+PGxpbmUgeDE9IjUzOSIgeTE9IjI1OCIgeDI9IjUzOSIgeTI9IjM0MiIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuNSIvPjxwb2x5Z29uIHBvaW50cz0iNTM0LDM0MiA1MzksMzUyIDU0NCwzNDIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNSIvPjxsaW5lIHgxPSI1MDYiIHkxPSIzOTkiIHgyPSI0MzMiIHkyPSI0NDEiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjUiLz48cG9seWdvbiBwb2ludHM9IjQzMCw0MzcgNDI0LDQ0NiA0MzUsNDQ1IiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjUiLz48bGluZSB4MT0iMzY3IiB5MT0iNDQxIiB4Mj0iMjk0IiB5Mj0iMzk5IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgb3BhY2l0eT0iMC41Ii8+PHBvbHlnb24gcG9pbnRzPSIyOTcsMzk1IDI4NiwzOTQgMjkyLDQwMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+PGxpbmUgeDE9IjI2MSIgeTE9IjM0MiIgeDI9IjI2MSIgeTI9IjI1OCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuNSIvPjxwb2x5Z29uIHBvaW50cz0iMjY2LDI1OCAyNjEsMjQ4IDI1NiwyNTgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNSIvPjxsaW5lIHgxPSIyOTQiIHkxPSIyMDEiIHgyPSIzNjciIHkyPSIxNTkiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjUiLz48cG9seWdvbiBwb2ludHM9IjM3MCwxNjMgMzc2LDE1NCAzNjUsMTU1IiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjUiLz4KICAgIDwhLS0gTm9kZXMgLS0+CiAgICA8cmVjdCB4PSIzNjUiIHk9IjEyMiIgd2lkdGg9IjcwIiBoZWlnaHQ9IjM2IiByeD0iOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPjxwb2x5Z29uIHBvaW50cz0iNTM5LDE5MiA1NjcsMjIwIDUzOSwyNDggNTExLDIyMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPjxyZWN0IHg9IjUwNCIgeT0iMzYyIiB3aWR0aD0iNzAiIGhlaWdodD0iMzYiIHJ4PSI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+PHJlY3QgeD0iMzY1IiB5PSI0NDIiIHdpZHRoPSI3MCIgaGVpZ2h0PSIzNiIgcng9IjgiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz48cmVjdCB4PSIyMjYiIHk9IjM2MiIgd2lkdGg9IjcwIiBoZWlnaHQ9IjM2IiByeD0iOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPjxyZWN0IHg9IjIyNiIgeT0iMjAyIiB3aWR0aD0iNzAiIGhlaWdodD0iMzYiIHJ4PSI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8IS0tIENlbnRlciBsYWJlbCAtLT4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjMwMCIgcj0iMzAiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBmaWx0ZXI9InVybCgjc29mdC1nbG93KSIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSIxMCIgZmlsbD0iIzAwMDAwMCIvPgogIAo8L2c+CiAgPGcgY2xhc3M9ImRhcmstdmFyaWFudCI+CiAgPGRlZnM+CiAgICA8ZmlsdGVyIGlkPSJnbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iOCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9InNvZnQtZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgPC9kZWZzPgogIAogICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiMxMTExMTciLz4KICAgIDwhLS0gQ3ljbGUgb3V0bGluZSAtLT4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjMwMCIgcj0iMTcwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWRhc2hhcnJheT0iOCA0IiBvcGFjaXR5PSIwLjIiLz4KICAgIDwhLS0gQXJyb3dzIC0tPgogICAgPGxpbmUgeDE9IjQzMyIgeTE9IjE1OSIgeDI9IjUwNiIgeTI9IjIwMSIgc3Ryb2tlPSIjZjVmNWY1IiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuNSIvPjxwb2x5Z29uIHBvaW50cz0iNTAzLDIwNSA1MTQsMjA2IDUwOCwxOTciIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuNSIvPjxsaW5lIHgxPSI1MzkiIHkxPSIyNTgiIHgyPSI1MzkiIHkyPSIzNDIiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjUiLz48cG9seWdvbiBwb2ludHM9IjUzNCwzNDIgNTM5LDM1MiA1NDQsMzQyIiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjUiLz48bGluZSB4MT0iNTA2IiB5MT0iMzk5IiB4Mj0iNDMzIiB5Mj0iNDQxIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMiIgb3BhY2l0eT0iMC41Ii8+PHBvbHlnb24gcG9pbnRzPSI0MzAsNDM3IDQyNCw0NDYgNDM1LDQ0NSIgZmlsbD0iI2Y1ZjVmNSIgb3BhY2l0eT0iMC41Ii8+PGxpbmUgeDE9IjM2NyIgeTE9IjQ0MSIgeDI9IjI5NCIgeTI9IjM5OSIgc3Ryb2tlPSIjZjVmNWY1IiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuNSIvPjxwb2x5Z29uIHBvaW50cz0iMjk3LDM5NSAyODYsMzk0IDI5Miw0MDMiIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuNSIvPjxsaW5lIHgxPSIyNjEiIHkxPSIzNDIiIHgyPSIyNjEiIHkyPSIyNTgiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjUiLz48cG9seWdvbiBwb2ludHM9IjI2NiwyNTggMjYxLDI0OCAyNTYsMjU4IiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjUiLz48bGluZSB4MT0iMjk0IiB5MT0iMjAxIiB4Mj0iMzY3IiB5Mj0iMTU5IiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMiIgb3BhY2l0eT0iMC41Ii8+PHBvbHlnb24gcG9pbnRzPSIzNzAsMTYzIDM3NiwxNTQgMzY1LDE1NSIgZmlsbD0iI2Y1ZjVmNSIgb3BhY2l0eT0iMC41Ii8+CiAgICA8IS0tIE5vZGVzIC0tPgogICAgPHJlY3QgeD0iMzY1IiB5PSIxMjIiIHdpZHRoPSI3MCIgaGVpZ2h0PSIzNiIgcng9IjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz48cG9seWdvbiBwb2ludHM9IjUzOSwxOTIgNTY3LDIyMCA1MzksMjQ4IDUxMSwyMjAiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz48cmVjdCB4PSI1MDQiIHk9IjM2MiIgd2lkdGg9IjcwIiBoZWlnaHQ9IjM2IiByeD0iOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPjxyZWN0IHg9IjM2NSIgeT0iNDQyIiB3aWR0aD0iNzAiIGhlaWdodD0iMzYiIHJ4PSI4IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+PHJlY3QgeD0iMjI2IiB5PSIzNjIiIHdpZHRoPSI3MCIgaGVpZ2h0PSIzNiIgcng9IjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz48cmVjdCB4PSIyMjYiIHk9IjIwMiIgd2lkdGg9IjcwIiBoZWlnaHQ9IjM2IiByeD0iOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPCEtLSBDZW50ZXIgbGFiZWwgLS0+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSIzMDAiIHI9IjMwIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgZmlsdGVyPSJ1cmwoI3NvZnQtZ2xvdykiLz4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjMwMCIgcj0iMTAiIGZpbGw9IiNmZmZmZmYiLz4KICAKPC9nPgo8L3N2Zz4=" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>Ever opened a modal and could not close it? That is a broken circuit. The .orb compiler makes it impossible to build one.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-users-get-stuck">The Problem: Users Get Stuck<a href="https://orb.almadar.io/blog/closed-circuit-pattern#the-problem-users-get-stuck" class="hash-link" aria-label="Direct link to The Problem: Users Get Stuck" title="Direct link to The Problem: Users Get Stuck" translate="no">​</a></h2>
<p>A modal opens via <code>setIsOpen(true)</code>. The close button calls <code>setIsOpen(false)</code>. But if the handler has a bug, or the close button was never wired up, the user is trapped. In traditional codebases, this bug survives until someone reports it in production.</p>
<p>In .orb, every UI interaction must complete a full circuit: user action triggers an event, the event bus routes it to the state machine, the state machine transitions and updates the UI, and the updated UI is ready for the next action. No shortcuts, no direct state mutations.</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-cc-1-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="4" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><linearGradient id="avl-cc-1-grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.15"></stop><stop offset="50%" stop-color="var(--color-primary)" stop-opacity="0.4"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0.15"></stop></linearGradient><marker id="avl-cc-1-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)" opacity="0.6"></path></marker></defs><style>
          @keyframes avl-cc-flow { from { stroke-dashoffset: 24; } to { stroke-dashoffset: 0; } }
        </style><circle cx="300" cy="200" r="150" fill="none" stroke="var(--color-primary)" stroke-width="0.3" opacity="0.06"></circle><circle cx="300" cy="200" r="50" fill="none" stroke="var(--color-primary)" stroke-width="0.5" opacity="0.08"></circle><g><path d="M322,97.32050807568876 Q395.9615242270663,142.28718707889794 379.92304845413264,239.21539030917347" fill="none" stroke="url(#avl-cc-1-grad)" stroke-width="1.5" stroke-dasharray="8 6" marker-end="url(#avl-cc-1-arrow)" style="animation:avl-cc-flow 1.5s linear infinite"></path><g opacity="0.8"><path d="M394.9615242270663,124.28718707889794 L397.9615242270663,124.28718707889794 L396.4615242270663,127.78718707889794 L398.4615242270663,127.78718707889794 L394.4615242270663,132.28718707889794 L395.9615242270663,128.78718707889794 L393.9615242270663,128.78718707889794 Z" fill="var(--color-primary)"></path><text x="395.9615242270663" y="144.28718707889794" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit">OPEN</text></g></g><g><path d="M359.92304845413264,260 Q302,311.9615242270663 244.0769515458674,260.00000000000006" fill="none" stroke="url(#avl-cc-1-grad)" stroke-width="1.5" stroke-dasharray="8 6" marker-end="url(#avl-cc-1-arrow)" style="animation:avl-cc-flow 1.5s linear infinite"></path><g opacity="0.8"><path d="M301,293.9615242270663 L304,293.9615242270663 L302.5,297.4615242270663 L304.5,297.4615242270663 L300.5,301.9615242270663 L302,298.4615242270663 L300,298.4615242270663 Z" fill="var(--color-primary)"></path><text x="302" y="313.9615242270663" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit">SAVE</text></g></g><g><path d="M218.0769515458674,242.67949192431126 Q202.03847577293368,145.75128869403574 276,100.78460969082653" fill="none" stroke="url(#avl-cc-1-grad)" stroke-width="1.5" stroke-dasharray="8 6" marker-end="url(#avl-cc-1-arrow)" style="animation:avl-cc-flow 1.5s linear infinite"></path><g opacity="0.8"><path d="M201.03847577293368,127.75128869403574 L204.03847577293368,127.75128869403574 L202.53847577293368,131.25128869403574 L204.53847577293368,131.25128869403574 L200.53847577293368,135.75128869403574 L202.03847577293368,132.25128869403574 L200.03847577293368,132.25128869403574 Z" fill="var(--color-primary)"></path><text x="202.03847577293368" y="147.75128869403574" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit">SUCCESS</text></g></g><g><path d="M381.92304845413264,242.67949192431124 Q397.9615242270663,145.75128869403574 324,100.78460969082653" fill="none" stroke="url(#avl-cc-1-grad)" stroke-width="1.5" stroke-dasharray="8 6" marker-end="url(#avl-cc-1-arrow)" style="animation:avl-cc-flow 1.5s linear infinite"></path><g opacity="0.8"><path d="M396.9615242270663,127.75128869403574 L399.9615242270663,127.75128869403574 L398.4615242270663,131.25128869403574 L400.4615242270663,131.25128869403574 L396.4615242270663,135.75128869403574 L397.9615242270663,132.25128869403574 L395.9615242270663,132.25128869403574 Z" fill="var(--color-primary)"></path><text x="397.9615242270663" y="147.75128869403574" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit">CLOSE</text></g></g><g><path d="M240.0769515458674,260.00000000000006 Q298,311.9615242270663 355.92304845413264,260" fill="none" stroke="url(#avl-cc-1-grad)" stroke-width="1.5" stroke-dasharray="8 6" marker-end="url(#avl-cc-1-arrow)" style="animation:avl-cc-flow 1.5s linear infinite"></path><g opacity="0.8"><path d="M297,293.9615242270663 L300,293.9615242270663 L298.5,297.4615242270663 L300.5,297.4615242270663 L296.5,301.9615242270663 L298,298.4615242270663 L296,298.4615242270663 Z" fill="var(--color-primary)"></path><text x="298" y="313.9615242270663" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit">ERROR</text></g></g><g opacity="1" transform="translate(260,64)"><rect x="0" y="0" width="80" height="32" rx="16" ry="16" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="40" y="16" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">browsing</text></g><g opacity="1" transform="translate(363.92304845413264,244)"><rect x="0" y="0" width="80" height="32" rx="16" ry="16" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="40" y="16" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">modalOpen</text></g><g opacity="1" transform="translate(156.0769515458674,244.00000000000006)"><rect x="0" y="0" width="80" height="32" rx="16" ry="16" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="40" y="16" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">saving</text></g><circle cx="300" cy="200" r="3" fill="var(--color-primary)" opacity="0.4"></circle></svg></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-orb-enforces-the-circuit">How .orb Enforces the Circuit<a href="https://orb.almadar.io/blog/closed-circuit-pattern#how-orb-enforces-the-circuit" class="hash-link" aria-label="Direct link to How .orb Enforces the Circuit" title="Direct link to How .orb Enforces the Circuit" translate="no">​</a></h2>
<p>The compiler runs a closed-circuit validator that checks three rules:</p>
<p><strong>Rule 1: Events must have transitions.</strong> If a UI pattern includes a button with <code>"event": "OPEN_MODAL"</code>, a transition must handle that event in the current state. Otherwise:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: CIRCUIT_ORPHAN_EVENT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Action 'Open' emits event 'OPEN_MODAL' which has no</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  transition handler in the current state.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  The button will render but clicking it will do nothing.</span><br></span></code></pre></div></div>
<p><strong>Rule 2: Overlay slots must have exits.</strong> If a transition renders to the <code>modal</code> or <code>drawer</code> slot, another transition must exit that state and clear the overlay:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: CIRCUIT_NO_OVERLAY_EXIT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  State 'EditModal' renders to 'modal' slot but has no exit</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  transition. Users will be stuck in this overlay.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Fix: Add a transition from 'EditModal' with event 'CANCEL'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  or 'CLOSE' that includes: ["render-ui", "modal", null]</span><br></span></code></pre></div></div>
<p><strong>Rule 3: Main slot must render.</strong> Every state that the user can land in must render something to the main slot, or the page will be blank.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="example-a-modal-that-cannot-break">Example: A Modal That Cannot Break<a href="https://orb.almadar.io/blog/closed-circuit-pattern#example-a-modal-that-cannot-break" class="hash-link" aria-label="Direct link to Example: A Modal That Cannot Break" title="Direct link to Example: A Modal That Cannot Break" translate="no">​</a></h2>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modalOpen"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"page-header"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Tasks"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"actions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"label"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"New Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OPEN_MODAL"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modalOpen"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OPEN_MODAL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"form-section"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"submitEvent"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"cancelEvent"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CLOSE"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modalOpen"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CLOSE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modalOpen"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"create"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.data"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Three ways to exit: click Cancel (triggers <code>CLOSE</code>), click Save (triggers <code>SAVE</code>), or press Escape / click the overlay (the auto-generated modal wrapper emits <code>UI:CLOSE</code>, which the runtime routes to the <code>CLOSE</code> transition). All three paths transition back to <code>browsing</code> and clear the modal slot.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-slot-hierarchy">The Slot Hierarchy<a href="https://orb.almadar.io/blog/closed-circuit-pattern#the-slot-hierarchy" class="hash-link" aria-label="Direct link to The Slot Hierarchy" title="Direct link to The Slot Hierarchy" translate="no">​</a></h2>
<p>Different slots have different exit requirements:</p>
<table><thead><tr><th>Slot</th><th>Exit Required?</th><th>Why</th></tr></thead><tbody><tr><td><code>main</code></td><td>No</td><td>This is home base</td></tr><tr><td><code>sidebar</code></td><td>No</td><td>Can coexist with main</td></tr><tr><td><code>modal</code></td><td>Yes</td><td>Blocks interaction</td></tr><tr><td><code>drawer</code></td><td>Yes</td><td>Blocks interaction</td></tr><tr><td><code>toast</code></td><td>No</td><td>Auto-dismisses</td></tr></tbody></table>
<p>The compiler only enforces exit transitions for overlay slots (<code>modal</code>, <code>drawer</code>) because those block the user from interacting with the rest of the application.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters">Why This Matters<a href="https://orb.almadar.io/blog/closed-circuit-pattern#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>The closed circuit pattern turns a class of runtime bugs into compile-time errors. You cannot ship a modal without a close path. You cannot render a button that triggers nothing. You cannot leave a user on a blank page.</p>
<p>Remove the <code>CLOSE</code> transition from the example above and run <code>orbital validate</code>. The compiler will refuse to proceed. The circuit must be complete before code generation begins.</p>
<p>Traditional testing catches these bugs by running specific scenarios and hoping you covered the broken path. The .orb compiler proves the circuit is complete for every path, every time.</p>]]></content:encoded>
            <category>Architecture</category>
            <category>State Machines</category>
        </item>
        <item>
            <title><![CDATA[The .orb Compiler That Says No]]></title>
            <link>https://orb.almadar.io/blog/compiler-that-says-no</link>
            <guid>https://orb.almadar.io/blog/compiler-that-says-no</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Most compilers check syntax. The .orb compiler checks logic. It runs 50+ validation rules across 12 modules before generating a single line of code, catching bugs that would normally survive all the way to production.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBJbmNvbWluZyBhcnJvdyAoYmFkIGNvZGUpIC0tPgogICAgPHJlY3QgeD0iODAiIHk9IjI1NSIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI2MCIgcng9IjgiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjYiLz4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMjczIiB3aWR0aD0iNDAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMTAwIiB5PSIyODMiIHdpZHRoPSI3MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cmVjdCB4PSIxMDAiIHk9IjI5MyIgd2lkdGg9IjU1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxsaW5lIHgxPSIyNDAiIHkxPSIyODUiIHgyPSIzMzAiIHkyPSIyODUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMzI2LDI3OCAzMzgsMjg1IDMyNiwyOTIiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDwhLS0gU2hpZWxkIC8gc3RvcCBzaWduIChvY3RhZ29uKSAtLT4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDAwLDIyMCA0NDAsMjM1IDQ1NSwyNzAgNDU1LDMxMCA0NDAsMzQ1IDQwMCwzNjAgMzYwLDM0NSAzNDUsMzEwIDM0NSwyNzAgMzYwLDIzNSIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjQiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPCEtLSBYIGluc2lkZSBzaGllbGQgLS0+CiAgICA8bGluZSB4MT0iMzgwIiB5MT0iMjY4IiB4Mj0iNDIwIiB5Mj0iMzA4IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMy41Ii8+CiAgICA8bGluZSB4MT0iNDIwIiB5MT0iMjY4IiB4Mj0iMzgwIiB5Mj0iMzA4IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMy41Ii8+CiAgICA8IS0tIE91dGdvaW5nIGFycm93ICh2YWxpZGF0ZWQpIC0tPgogICAgPGxpbmUgeDE9IjQ1NSIgeTE9IjI4NSIgeDI9IjU0MCIgeTI9IjI4NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI1MzYsMjc4IDU0OCwyODUgNTM2LDI5MiIgZmlsbD0iIzAwMDAwMCIvPgogICAgPCEtLSBWYWxpZCBvdXRwdXQgLS0+CiAgICA8cmVjdCB4PSI1NTUiIHk9IjI1NSIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI2MCIgcng9IjgiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxyZWN0IHg9IjU3NSIgeT0iMjczIiB3aWR0aD0iNTAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNiIvPgogICAgPHJlY3QgeD0iNTc1IiB5PSIyODMiIHdpZHRoPSI4MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICA8cmVjdCB4PSI1NzUiIHk9IjI5MyIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gQ2hlY2ttYXJrIGJlc2lkZSBvdXRwdXQgLS0+CiAgICA8cGF0aCBkPSJNNzI1IDI3MCBMNzM1IDI4MiBMNzU1IDI1OCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMuNSIvPgogICAgPCEtLSBSZWplY3RlZCBpdGVtcyBmYWxsaW5nIGJlbG93IHNoaWVsZCAtLT4KICAgIDxyZWN0IHg9IjM3MCIgeT0iMzkwIiB3aWR0aD0iNjAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIgb3BhY2l0eT0iMC4zIiB0cmFuc2Zvcm09InJvdGF0ZSgtMTAgNDAwIDQwNSkiLz4KICAgIDxyZWN0IHg9IjM4NSIgeT0iNDMwIiB3aWR0aD0iNTAiIGhlaWdodD0iMjUiIHJ4PSI0IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIgb3BhY2l0eT0iMC4yNSIgdHJhbnNmb3JtPSJyb3RhdGUoOCA0MTAgNDQyKSIvPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjM2MCIgeDI9IjM5NSIgeTI9IjM4NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBvcGFjaXR5PSIwLjQiLz4KICAKPC9nPgogIDxnIGNsYXNzPSJkYXJrLXZhcmlhbnQiPgogIDxkZWZzPgogICAgPGZpbHRlciBpZD0iZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjgiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyIGlkPSJzb2Z0LWdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICAKICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSI4MDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjMTExMTE3Ii8+CiAgICA8IS0tIEluY29taW5nIGFycm93IChiYWQgY29kZSkgLS0+CiAgICA8cmVjdCB4PSI4MCIgeT0iMjU1IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjYwIiByeD0iOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZjVmNWY1IiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuNiIvPgogICAgPHJlY3QgeD0iMTAwIiB5PSIyNzMiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2Y1ZjVmNSIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIxMDAiIHk9IjI4MyIgd2lkdGg9IjcwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMjkzIiB3aWR0aD0iNTUiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuMyIvPgogICAgPGxpbmUgeDE9IjI0MCIgeTE9IjI4NSIgeDI9IjMzMCIgeTI9IjI4NSIgc3Ryb2tlPSIjZjVmNWY1IiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHBvbHlnb24gcG9pbnRzPSIzMjYsMjc4IDMzOCwyODUgMzI2LDI5MiIgZmlsbD0iI2Y1ZjVmNSIvPgogICAgPCEtLSBTaGllbGQgLyBzdG9wIHNpZ24gKG9jdGFnb24pIC0tPgogICAgPHBvbHlnb24gcG9pbnRzPSI0MDAsMjIwIDQ0MCwyMzUgNDU1LDI3MCA0NTUsMzEwIDQ0MCwzNDUgNDAwLDM2MCAzNjAsMzQ1IDM0NSwzMTAgMzQ1LDI3MCAzNjAsMjM1IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iNCIgZmlsdGVyPSJ1cmwoI2dsb3cpIi8+CiAgICA8IS0tIFggaW5zaWRlIHNoaWVsZCAtLT4KICAgIDxsaW5lIHgxPSIzODAiIHkxPSIyNjgiIHgyPSI0MjAiIHkyPSIzMDgiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzLjUiLz4KICAgIDxsaW5lIHgxPSI0MjAiIHkxPSIyNjgiIHgyPSIzODAiIHkyPSIzMDgiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzLjUiLz4KICAgIDwhLS0gT3V0Z29pbmcgYXJyb3cgKHZhbGlkYXRlZCkgLS0+CiAgICA8bGluZSB4MT0iNDU1IiB5MT0iMjg1IiB4Mj0iNTQwIiB5Mj0iMjg1IiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjUzNiwyNzggNTQ4LDI4NSA1MzYsMjkyIiBmaWxsPSIjZjVmNWY1Ii8+CiAgICA8IS0tIFZhbGlkIG91dHB1dCAtLT4KICAgIDxyZWN0IHg9IjU1NSIgeT0iMjU1IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjYwIiByeD0iOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNTc1IiB5PSIyNzMiIHdpZHRoPSI1MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+CiAgICA8cmVjdCB4PSI1NzUiIHk9IjI4MyIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9IjU3NSIgeT0iMjkzIiB3aWR0aD0iNjAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBDaGVja21hcmsgYmVzaWRlIG91dHB1dCAtLT4KICAgIDxwYXRoIGQ9Ik03MjUgMjcwIEw3MzUgMjgyIEw3NTUgMjU4IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMy41Ii8+CiAgICA8IS0tIFJlamVjdGVkIGl0ZW1zIGZhbGxpbmcgYmVsb3cgc2hpZWxkIC0tPgogICAgPHJlY3QgeD0iMzcwIiB5PSIzOTAiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMCIgcng9IjQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxIiBvcGFjaXR5PSIwLjMiIHRyYW5zZm9ybT0icm90YXRlKC0xMCA0MDAgNDA1KSIvPgogICAgPHJlY3QgeD0iMzg1IiB5PSI0MzAiIHdpZHRoPSI1MCIgaGVpZ2h0PSIyNSIgcng9IjQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxIiBvcGFjaXR5PSIwLjI1IiB0cmFuc2Zvcm09InJvdGF0ZSg4IDQxMCA0NDIpIi8+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMzYwIiB4Mj0iMzk1IiB5Mj0iMzg1IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI0IDMiIG9wYWNpdHk9IjAuNCIvPgogIAo8L2c+Cjwvc3ZnPg==" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>Most compilers check syntax. The .orb compiler checks logic. It runs 50+ validation rules across 12 modules before generating a single line of code, catching bugs that would normally survive all the way to production.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-compiler-catches">What the Compiler Catches<a href="https://orb.almadar.io/blog/compiler-that-says-no#what-the-compiler-catches" class="hash-link" aria-label="Direct link to What the Compiler Catches" title="Direct link to What the Compiler Catches" translate="no">​</a></h2>
<p>Here is a state machine with several problems. The compiler finds all of them before any code is generated:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-sm-1-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><linearGradient id="avl-sm-1-grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.1"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0.05"></stop></linearGradient></defs><style>
          @keyframes avl-sm-dash { from { stroke-dashoffset: 20; } to { stroke-dashoffset: 0; } }
        </style><circle cx="300" cy="200" r="180" fill="url(#avl-sm-1-grad)"></circle><g><g opacity="0.7"><defs><marker id="avl-tr-1-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M343.1335136523794,57.071067811865476 Q405.28284271247463,99.5254833995939 421.00862197135154,173.12994231491118" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-1-arrow)"></path></g><text x="389.12346314604054" y="69.26131316480966" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">EDIT</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-2-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M423.83704909609776,175.95836943965736 Q408.11126983722085,102.3539105243401 345.9619407771256,59.899494936611674" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-2-arrow)"></path></g><text x="423.10193359837564" y="118.51329009077415" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">SAVE</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-3-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M265.3517677218592,65.55634918610404 Q203.20243866176395,108.01076477383249 187.476659402887,181.6152236891498" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-3-arrow)"></path></g><text x="227.84709960243654" y="86.23187591328681" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">OPEN</text></g><g opacity="1" transform="translate(255,32)"><circle cx="-16" cy="18" r="6" fill="var(--color-primary)"></circle><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">browsing</text></g><g opacity="1" transform="translate(405,182)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">editing</text></g><g opacity="1" transform="translate(255,332)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">archived</text></g><g opacity="1" transform="translate(105,182.00000000000003)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">modalOpen</text></g></svg></div>
<p>Three validation errors exist in this diagram:</p>
<ol>
<li class=""><strong>Unreachable state</strong>: <code>archived</code> has no incoming transition. It can never be entered.</li>
<li class=""><strong>No overlay exit</strong>: <code>modalOpen</code> renders to a modal slot but has no <code>CLOSE</code> or <code>CANCEL</code> transition. Users will be stuck.</li>
<li class=""><strong>Orphan action</strong>: If the <code>editing</code> state renders a Delete button emitting <code>DELETE</code>, no transition handles that event.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="concrete-validation-examples">Concrete Validation Examples<a href="https://orb.almadar.io/blog/compiler-that-says-no#concrete-validation-examples" class="hash-link" aria-label="Direct link to Concrete Validation Examples" title="Direct link to Concrete Validation Examples" translate="no">​</a></h2>
<p><strong>Unreachable state</strong> (the compiler catches dead states in your machine):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: ORB_T_UNREACHABLE_STATE</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  State 'Archived' in trait 'TaskInteraction' has no incoming</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  transitions. It can never be reached.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Either add a transition to this state or remove it.</span><br></span></code></pre></div></div>
<p><strong>Stuck overlay</strong> (the crown jewel of .orb validation):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: CIRCUIT_NO_OVERLAY_EXIT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  State 'EditModal' renders to 'modal' slot but has no exit</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  transition. Users will be stuck in this overlay.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Fix: Add a transition from 'EditModal' with event 'CANCEL'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  or 'CLOSE' that includes: ["render-ui", "modal", null]</span><br></span></code></pre></div></div>
<p><strong>Orphaned event</strong> (a button that does nothing when clicked):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: CIRCUIT_ORPHAN_EVENT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Action 'Delete' in state 'Viewing' emits event 'DELETE'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  which has no transition handler in the current state.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  The button will render but clicking it will do nothing.</span><br></span></code></pre></div></div>
<p><strong>Typo in a field reference</strong> (with suggestions):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: ORB_B_UNKNOWN_FIELD</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Binding '@entity.staus' references field 'staus' which</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  doesn't exist on entity 'Task'.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Did you mean 'status'?</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Available fields: title, description, status, priority</span><br></span></code></pre></div></div>
<p><strong>Wrong operator arity</strong> (logic errors in s-expressions):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: ORB_S_WRONG_ARITY</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Operator 'and' expects 2+ arguments, got 1.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Expression: ["and", ["=", "@entity.status", "active"]]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  'and' with a single argument is always equal to that argument.</span><br></span></code></pre></div></div>
<p><strong>Emit without listener</strong> (fire-and-forget events):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: ORB_X_ORPHAN_EMIT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Trait 'OrderTrait' emits 'ORDER_COMPLETED' but no trait</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  has a matching 'listens' declaration.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Every emitted event must have at least one listener.</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-12-validation-modules">The 12 Validation Modules<a href="https://orb.almadar.io/blog/compiler-that-says-no#the-12-validation-modules" class="hash-link" aria-label="Direct link to The 12 Validation Modules" title="Direct link to The 12 Validation Modules" translate="no">​</a></h2>
<p>The compiler runs validators in sequence, each targeting a different concern:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Schema -&gt; Entity -&gt; Trait -&gt; Effect -&gt; RenderUI -&gt; Slot -&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">S-Expression -&gt; Binding -&gt; Service -&gt; CrossOrbital -&gt; Icon -&gt; ClosedCircuit</span><br></span></code></pre></div></div>
<p><strong>Entity</strong> catches duplicate fields, invalid relation targets, and reserved field names. <strong>Trait</strong> checks for initial states, reachability, and determinism. <strong>S-Expression</strong> validates operator names, argument counts, and type compatibility. <strong>Binding</strong> ensures every <code>@entity.field</code> reference points to a real field on the linked entity. <strong>CrossOrbital</strong> verifies that every <code>emit</code> has a matching <code>listens</code> somewhere. <strong>ClosedCircuit</strong> proves every UI interaction completes a full loop.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="error-quality">Error Quality<a href="https://orb.almadar.io/blog/compiler-that-says-no#error-quality" class="hash-link" aria-label="Direct link to Error Quality" title="Direct link to Error Quality" translate="no">​</a></h2>
<p>Compare a typical compiler error:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: unexpected token at line 47, column 12</span><br></span></code></pre></div></div>
<p>With an .orb validation error:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: CIRCUIT_NO_OVERLAY_EXIT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  State 'EditModal' renders to 'modal' slot but has no exit</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  transition. Users will be stuck in this overlay.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Location: orbitals[0].traits[0].stateMachine.states[2]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Fix: Add a transition from 'EditModal' with event 'CANCEL'</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  or 'CLOSE' that includes: ["render-ui", "modal", null]</span><br></span></code></pre></div></div>
<p>Every error includes a searchable code, a human explanation of impact, the exact location, and a concrete fix. Many include copy-paste solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-validation-beats-testing">Why Validation Beats Testing<a href="https://orb.almadar.io/blog/compiler-that-says-no#why-validation-beats-testing" class="hash-link" aria-label="Direct link to Why Validation Beats Testing" title="Direct link to Why Validation Beats Testing" translate="no">​</a></h2>
<p>Testing proves specific scenarios work. Validation proves no scenario can break. Tests are samples. Validation is proof.</p>
<p>The .orb compiler does not check whether your application works in the cases you tested. It checks whether your application can possibly produce a stuck modal, a dead-end state, a button that does nothing, or a broken event chain. 50+ rules, 12 modules, under 50ms.</p>]]></content:encoded>
            <category>Compiler</category>
            <category>Rust</category>
            <category>Engineering</category>
        </item>
        <item>
            <title><![CDATA[Composing Behavior with Emit/Listen in .orb]]></title>
            <link>https://orb.almadar.io/blog/composing-behavior</link>
            <guid>https://orb.almadar.io/blog/composing-behavior</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In .orb, Orbital Units communicate through events. Each unit declares what it emits and what it listens to. The compiler verifies the wiring is complete. This is how you compose complex behavior from simple, independent parts.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBTbWFsbCBtYWNoaW5lIEEgKHRvcC1sZWZ0KSAtLT4KICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgMTQwKSI+CiAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxODAiIGhlaWdodD0iMTAwIiByeD0iOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgICAgPGNpcmNsZSBjeD0iNDAiIGN5PSI1MCIgcj0iMTYiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICAgIDxjaXJjbGUgY3g9IjEwMCIgY3k9IjUwIiByPSIxNiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgICAgPGNpcmNsZSBjeD0iMTQ1IiBjeT0iNTAiIHI9IjE2IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgICA8bGluZSB4MT0iNTYiIHkxPSI1MCIgeDI9Ijg0IiB5Mj0iNTAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgICAgPGxpbmUgeDE9IjExNiIgeTE9IjUwIiB4Mj0iMTI5IiB5Mj0iNTAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDwvZz4KICAgIDwhLS0gU21hbGwgbWFjaGluZSBCICh0b3AtcmlnaHQpIC0tPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLCAzMjApIj4KICAgICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSIxMDAiIHJ4PSI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9IjUwIiByPSIxNiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgICAgPGNpcmNsZSBjeD0iMTAwIiBjeT0iNTAiIHI9IjE2IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgICA8bGluZSB4MT0iNTYiIHkxPSI1MCIgeDI9Ijg0IiB5Mj0iNTAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDwvZz4KICAgIDwhLS0gU21hbGwgbWFjaGluZSBDIChtaWQpIC0tPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIwLCA1MDApIj4KICAgICAgPHJlY3QgeD0iMCIgeT0iLTIwIiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjgwIiByeD0iOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgICAgPGNpcmNsZSBjeD0iNTAiIGN5PSIyMCIgcj0iMTQiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICAgIDxjaXJjbGUgY3g9IjEzMCIgY3k9IjIwIiByPSIxNCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgICAgPGxpbmUgeDE9IjY0IiB5MT0iMjAiIHgyPSIxMTYiIHkyPSIyMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPC9nPgogICAgPCEtLSBBcnJvd3MgZnJvbSBzbWFsbCBtYWNoaW5lcyB0byBjb21wb3NlZCAtLT4KICAgIDxwYXRoIGQ9Ik0zMDAgMTkwIEMgMzgwIDE5MCwgNDAwIDI0MCwgNDUwIDI2MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjYgMyIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI0NDYsMjU0IDQ1NiwyNjAgNDQ2LDI2NiIgZmlsbD0iIzAwMDAwMCIvPgogICAgPHBhdGggZD0iTTMwMCAzNzAgQyAzODAgMzcwLCA0MDAgMzMwLCA0NTAgMzEwIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNiAzIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjQ0NiwzMDQgNDU2LDMxMCA0NDYsMzE2IiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8cGF0aCBkPSJNMzAwIDUwMCBDIDM4MCA0ODAsIDQyMCA0MDAsIDQ1MCAzNjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI2IDMiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDQ2LDM1NCA0NTYsMzYwIDQ0NiwzNjYiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDwhLS0gTGFyZ2UgY29tcG9zZWQgbWFjaGluZSAocmlnaHQpIC0tPgogICAgPHJlY3QgeD0iNDYwIiB5PSIxNDAiIHdpZHRoPSIyNjAiIGhlaWdodD0iMzQwIiByeD0iMTIiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIzIiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDwhLS0gTm9kZXMgaW5zaWRlIGNvbXBvc2VkIG1hY2hpbmUgLS0+CiAgICA8Y2lyY2xlIGN4PSI1MzAiIGN5PSIyMTAiIHI9IjIwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8Y2lyY2xlIGN4PSI2NTAiIGN5PSIyMTAiIHI9IjIwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8Y2lyY2xlIGN4PSI1MzAiIGN5PSIzMTAiIHI9IjIwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8Y2lyY2xlIGN4PSI2NTAiIGN5PSIzMTAiIHI9IjIwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8Y2lyY2xlIGN4PSI1OTAiIGN5PSI0MDAiIHI9IjIwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8IS0tIElubmVyIGNvbm5lY3Rpb25zIC0tPgogICAgPGxpbmUgeDE9IjU1MCIgeTE9IjIxMCIgeDI9IjYzMCIgeTI9IjIxMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGxpbmUgeDE9IjUzMCIgeTE9IjIzMCIgeDI9IjUzMCIgeTI9IjI5MCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGxpbmUgeDE9IjY1MCIgeTE9IjIzMCIgeDI9IjY1MCIgeTI9IjI5MCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGxpbmUgeDE9IjU1MCIgeTE9IjMxMCIgeDI9IjYzMCIgeTI9IjMxMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGxpbmUgeDE9IjU0NSIgeTE9IjMyNSIgeDI9IjU3NSIgeTI9IjM4NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGxpbmUgeDE9IjYzNSIgeTE9IjMyNSIgeDI9IjYwNSIgeTI9IjM4NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIAo8L2c+CiAgPGcgY2xhc3M9ImRhcmstdmFyaWFudCI+CiAgPGRlZnM+CiAgICA8ZmlsdGVyIGlkPSJnbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iOCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9InNvZnQtZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgPC9kZWZzPgogIAogICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiMxMTExMTciLz4KICAgIDwhLS0gU21hbGwgbWFjaGluZSBBICh0b3AtbGVmdCkgLS0+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAsIDE0MCkiPgogICAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjEwMCIgcng9IjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICAgIDxjaXJjbGUgY3g9IjQwIiBjeT0iNTAiIHI9IjE2IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgICA8Y2lyY2xlIGN4PSIxMDAiIGN5PSI1MCIgcj0iMTYiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICAgIDxjaXJjbGUgY3g9IjE0NSIgY3k9IjUwIiByPSIxNiIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgICAgPGxpbmUgeDE9IjU2IiB5MT0iNTAiIHgyPSI4NCIgeTI9IjUwIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMS41Ii8+CiAgICAgIDxsaW5lIHgxPSIxMTYiIHkxPSI1MCIgeDI9IjEyOSIgeTI9IjUwIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMS41Ii8+CiAgICA8L2c+CiAgICA8IS0tIFNtYWxsIG1hY2hpbmUgQiAodG9wLXJpZ2h0KSAtLT4KICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgMzIwKSI+CiAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxODAiIGhlaWdodD0iMTAwIiByeD0iOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgICAgPGNpcmNsZSBjeD0iNDAiIGN5PSI1MCIgcj0iMTYiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICAgIDxjaXJjbGUgY3g9IjEwMCIgY3k9IjUwIiByPSIxNiIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgICAgPGxpbmUgeDE9IjU2IiB5MT0iNTAiIHgyPSI4NCIgeTI9IjUwIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMS41Ii8+CiAgICA8L2c+CiAgICA8IS0tIFNtYWxsIG1hY2hpbmUgQyAobWlkKSAtLT4KICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCwgNTAwKSI+CiAgICAgIDxyZWN0IHg9IjAiIHk9Ii0yMCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSI4MCIgcng9IjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICAgIDxjaXJjbGUgY3g9IjUwIiBjeT0iMjAiIHI9IjE0IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgICA8Y2lyY2xlIGN4PSIxMzAiIGN5PSIyMCIgcj0iMTQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICAgIDxsaW5lIHgxPSI2NCIgeTE9IjIwIiB4Mj0iMTE2IiB5Mj0iMjAiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDwvZz4KICAgIDwhLS0gQXJyb3dzIGZyb20gc21hbGwgbWFjaGluZXMgdG8gY29tcG9zZWQgLS0+CiAgICA8cGF0aCBkPSJNMzAwIDE5MCBDIDM4MCAxOTAsIDQwMCAyNDAsIDQ1MCAyNjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI2IDMiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDQ2LDI1NCA0NTYsMjYwIDQ0NiwyNjYiIGZpbGw9IiNmZmZmZmYiLz4KICAgIDxwYXRoIGQ9Ik0zMDAgMzcwIEMgMzgwIDM3MCwgNDAwIDMzMCwgNDUwIDMxMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjYgMyIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI0NDYsMzA0IDQ1NiwzMTAgNDQ2LDMxNiIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPHBhdGggZD0iTTMwMCA1MDAgQyAzODAgNDgwLCA0MjAgNDAwLCA0NTAgMzYwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNiAzIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjQ0NiwzNTQgNDU2LDM2MCA0NDYsMzY2IiBmaWxsPSIjZmZmZmZmIi8+CiAgICA8IS0tIExhcmdlIGNvbXBvc2VkIG1hY2hpbmUgKHJpZ2h0KSAtLT4KICAgIDxyZWN0IHg9IjQ2MCIgeT0iMTQwIiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjM0MCIgcng9IjEyIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIgZmlsdGVyPSJ1cmwoI2dsb3cpIi8+CiAgICA8IS0tIE5vZGVzIGluc2lkZSBjb21wb3NlZCBtYWNoaW5lIC0tPgogICAgPGNpcmNsZSBjeD0iNTMwIiBjeT0iMjEwIiByPSIyMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPGNpcmNsZSBjeD0iNjUwIiBjeT0iMjEwIiByPSIyMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPGNpcmNsZSBjeD0iNTMwIiBjeT0iMzEwIiByPSIyMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPGNpcmNsZSBjeD0iNjUwIiBjeT0iMzEwIiByPSIyMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPGNpcmNsZSBjeD0iNTkwIiBjeT0iNDAwIiByPSIyMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPCEtLSBJbm5lciBjb25uZWN0aW9ucyAtLT4KICAgIDxsaW5lIHgxPSI1NTAiIHkxPSIyMTAiIHgyPSI2MzAiIHkyPSIyMTAiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxsaW5lIHgxPSI1MzAiIHkxPSIyMzAiIHgyPSI1MzAiIHkyPSIyOTAiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxsaW5lIHgxPSI2NTAiIHkxPSIyMzAiIHgyPSI2NTAiIHkyPSIyOTAiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxsaW5lIHgxPSI1NTAiIHkxPSIzMTAiIHgyPSI2MzAiIHkyPSIzMTAiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxsaW5lIHgxPSI1NDUiIHkxPSIzMjUiIHgyPSI1NzUiIHkyPSIzODUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxsaW5lIHgxPSI2MzUiIHkxPSIzMjUiIHgyPSI2MDUiIHkyPSIzODUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAKPC9nPgo8L3N2Zz4=" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>In .orb, Orbital Units communicate through events. Each unit declares what it emits and what it listens to. The compiler verifies the wiring is complete. This is how you compose complex behavior from simple, independent parts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-pattern-emit-and-listen">The Pattern: Emit and Listen<a href="https://orb.almadar.io/blog/composing-behavior#the-pattern-emit-and-listen" class="hash-link" aria-label="Direct link to The Pattern: Emit and Listen" title="Direct link to The Pattern: Emit and Listen" translate="no">​</a></h2>
<p>Two Orbital Units that know nothing about each other can work together through events. A <code>DefendOrbital</code> emits <code>SHIELD_DEPLETED</code> when its shield breaks. A <code>MendOrbital</code> listens for that event and triggers emergency healing.</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><marker id="avl-el-1-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)" opacity="0.6"></path></marker><linearGradient id="avl-el-1-grad" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.5"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0.2"></stop></linearGradient></defs><style>
          @keyframes avl-el-dash { from { stroke-dashoffset: 16; } to { stroke-dashoffset: 0; } }
        </style><g opacity="1"><circle cx="180" cy="200" r="80" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="180" cy="200" r="80" fill="var(--color-primary)" opacity="0.03"></circle><text x="180" y="112" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">DefendOrbital</text></g><g opacity="1"><circle cx="180" cy="200" r="18" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="180" cy="200" r="18" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="180" y1="180" x2="180" y2="172" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="197.32050807568876" y1="210" x2="204.2487113059643" y2="214" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="162.67949192431124" y1="210" x2="155.75128869403574" y2="214" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><circle cx="420" cy="200" r="80" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="420" cy="200" r="80" fill="var(--color-primary)" opacity="0.03"></circle><text x="420" y="112" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">MendOrbital</text></g><g opacity="1"><circle cx="420" cy="200" r="18" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="420" cy="200" r="18" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="420" y1="180" x2="420" y2="172" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="420" y1="220" x2="420" y2="228" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><path d="M264,200 L332,200" fill="none" stroke="url(#avl-el-1-grad)" stroke-width="2" stroke-dasharray="6 4" marker-end="url(#avl-el-1-arrow)" style="animation:avl-el-dash 1s linear infinite"></path><text x="300" y="178" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold" opacity="0.8">~<!-- -->SHIELD_DEPLETED</text><g opacity="0.6"><g><circle cx="300" cy="154" r="2.1" fill="var(--color-primary)"></circle><path d="M295.1,149.1 A7,7 0 0,1 304.9,149.1" fill="none" stroke="var(--color-primary)" stroke-width="1.5"></path><path d="M293,147 A9.799999999999999,9.799999999999999 0 0,1 307,147" fill="none" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></path></g></g><text x="300" y="218" text-anchor="middle" fill="var(--color-primary)" font-size="12" font-family="inherit" opacity="0.3" letter-spacing="4">~ ~ ~</text></svg></div>
<p>Neither orbital references the other by name. They communicate through the event bus, and the compiler checks that every <code>emits</code> declaration has a matching <code>listens</code> somewhere.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-it-works-in-orb">How It Works in .orb<a href="https://orb.almadar.io/blog/composing-behavior#how-it-works-in-orb" class="hash-link" aria-label="Direct link to How It Works in .orb" title="Direct link to How It Works in .orb" translate="no">​</a></h2>
<p>The Defend orbital's trait declares its emissions:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ShieldTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"emits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"SHIELD_ACTIVATED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SHIELD_DEPLETED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Ready"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Active"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Cooldown"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Ready"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Active"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ACTIVATE_SHIELD"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.shieldHp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.maxShieldHp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SHIELD_ACTIVATED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Active"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Cooldown"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SHIELD_BROKEN"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.shieldHp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SHIELD_DEPLETED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>The Mend orbital's trait declares what it listens for:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"HealTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"listens"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SHIELD_DEPLETED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"triggers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMERGENCY_HEAL"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Healing"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Healing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMERGENCY_HEAL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.hp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"+"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.hp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.maxHp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Healing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"HEAL_COMPLETE"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>When the shield breaks, <code>SHIELD_DEPLETED</code> fires. The Mend orbital receives it and triggers <code>EMERGENCY_HEAL</code>, healing 20% of max HP. Equip both orbitals together and you get automatic healing on shield break. Remove the Mend orbital and the Defend orbital still works on its own.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-compiler-guarantee">The Compiler Guarantee<a href="https://orb.almadar.io/blog/composing-behavior#the-compiler-guarantee" class="hash-link" aria-label="Direct link to The Compiler Guarantee" title="Direct link to The Compiler Guarantee" translate="no">​</a></h2>
<p>If a trait declares <code>"emits": ["ORDER_COMPLETED"]</code> but no other trait has a matching <code>listens</code> entry, the compiler rejects the program:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">Error: ORB_X_ORPHAN_EMIT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Trait 'OrderTrait' emits 'ORDER_COMPLETED' but no trait</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  has a matching 'listens' declaration.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Every emitted event must have at least one listener.</span><br></span></code></pre></div></div>
<p>This prevents fire-and-forget events. In a microservices architecture, this would be a message published to a queue with no consumer, silently dropping data. In .orb, the compiler catches it before any code is generated.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="business-application-order-processing">Business Application: Order Processing<a href="https://orb.almadar.io/blog/composing-behavior#business-application-order-processing" class="hash-link" aria-label="Direct link to Business Application: Order Processing" title="Direct link to Business Application: Order Processing" translate="no">​</a></h2>
<p>The same pattern applies to business software. Three orbitals handle order processing:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OrderTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"emits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"ORDER_PLACED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PaymentTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"listens"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ORDER_PLACED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"triggers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PROCESS_PAYMENT"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"emits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"PAYMENT_CONFIRMED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PAYMENT_FAILED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"InventoryTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"listens"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PAYMENT_CONFIRMED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"triggers"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"RESERVE_STOCK"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"emits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"STOCK_RESERVED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Order emits <code>ORDER_PLACED</code>. Payment listens and processes. On success, Payment emits <code>PAYMENT_CONFIRMED</code>. Inventory listens and reserves stock. Three self-contained units with verified event wiring.</p>
<p>Compare this to the microservices equivalent: three services, three deployments, a message queue, dead letter queues, saga patterns for distributed transactions, and monitoring for each service. The .orb version compiles to a single application with the same event-driven architecture, minus the infrastructure overhead. And the compiler guarantees no event goes unhandled.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="composable-standard-library">Composable Standard Library<a href="https://orb.almadar.io/blog/composing-behavior#composable-standard-library" class="hash-link" aria-label="Direct link to Composable Standard Library" title="Direct link to Composable Standard Library" translate="no">​</a></h2>
<p>.orb includes standard library behaviors that compose through the same emit/listen mechanism:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"uses"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"std/Pagination"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"as"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Paginate"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"ref"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Paginate.traits.PaginationTrait"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"ref"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TaskInteraction"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Your task list now has pagination. No implementation code, just composition. The pagination trait emits page-change events, and the interaction trait listens and re-renders.</p>
<p>Composition in .orb is not a design recommendation. It is the only way units communicate, and the compiler enforces that every connection is valid.</p>]]></content:encoded>
            <category>Architecture</category>
            <category>Gaming</category>
            <category>Composition</category>
        </item>
        <item>
            <title><![CDATA[State Machines vs Boolean Flags in .orb]]></title>
            <link>https://orb.almadar.io/blog/fsm-underused-pattern</link>
            <guid>https://orb.almadar.io/blog/fsm-underused-pattern</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Five boolean flags create 32 possible state combinations. Most are invalid. A state machine with five named states has exactly five valid states. That is the core argument for modeling UI behavior in .orb.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBTdGF0ZSAxOiBJZGxlIC0tPgogICAgPHJlY3QgeD0iMTAwIiB5PSIyNTAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNjAiIHJ4PSIxMiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgIDxyZWN0IHg9IjEyMCIgeT0iMjY4IiB3aWR0aD0iNTAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNyIvPgogICAgPCEtLSBTdGF0ZSAyOiBBY3RpdmUgLS0+CiAgICA8cmVjdCB4PSIzMzAiIHk9IjEzMCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSI2MCIgcng9IjEyIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMyIgZmlsdGVyPSJ1cmwoI2dsb3cpIi8+CiAgICA8cmVjdCB4PSIzNTAiIHk9IjE0OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjgiIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjciLz4KICAgIDwhLS0gU3RhdGUgMzogQ29tcGxldGUgLS0+CiAgICA8cmVjdCB4PSI1NjAiIHk9IjI1MCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSI2MCIgcng9IjEyIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMyIvPgogICAgPHJlY3QgeD0iNTgwIiB5PSIyNjgiIHdpZHRoPSI3MCIgaGVpZ2h0PSI4IiByeD0iMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC43Ii8+CiAgICA8IS0tIFRyYW5zaXRpb246IElkbGUgLT4gQWN0aXZlIC0tPgogICAgPHBhdGggZD0iTTI0MCAyNTUgUSAzMDAgMTgwLCAzMzAgMTYwIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHBvbHlnb24gcG9pbnRzPSIzMjYsMTY1IDMzNSwxNTggMzMwLDE2OCIgZmlsbD0iIzAwMDAwMCIvPgogICAgPCEtLSBUcmFuc2l0aW9uOiBBY3RpdmUgLT4gQ29tcGxldGUgLS0+CiAgICA8cGF0aCBkPSJNNDcwIDE4NSBRIDU0MCAyMzAsIDU2MCAyNjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjU1NSwyNTUgNTY1LDI1OCA1NTgsMjY2IiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8IS0tIFRyYW5zaXRpb246IENvbXBsZXRlIC0+IElkbGUgKHJlc2V0KSAtLT4KICAgIDxwYXRoIGQ9Ik01NjAgMzA1IFEgNDAwIDQyMCwgMjQwIDMwNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNiA0IiBvcGFjaXR5PSIwLjUiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMjQ1LDMwMCAyMzgsMzEwIDI0OCwzMDgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNSIvPgogICAgPCEtLSBUcmFuc2l0aW9uIGxhYmVsIGJhcnMgLS0+CiAgICA8cmVjdCB4PSIyNjAiIHk9IjIwMCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9IjUwMCIgeT0iMjE1IiB3aWR0aD0iNDAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNSIvPgogICAgPHJlY3QgeD0iMzgwIiB5PSIzOTUiIHdpZHRoPSI0MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIEVudHJ5IGluZGljYXRvciBvbiBmaXJzdCBzdGF0ZSAtLT4KICAgIDxsaW5lIHgxPSI2MCIgeTE9IjI4MCIgeDI9Ijk1IiB5Mj0iMjgwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjkyLDI3NCAxMDIsMjgwIDkyLDI4NiIgZmlsbD0iIzAwMDAwMCIvPgogIAo8L2c+CiAgPGcgY2xhc3M9ImRhcmstdmFyaWFudCI+CiAgPGRlZnM+CiAgICA8ZmlsdGVyIGlkPSJnbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iOCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9InNvZnQtZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgPC9kZWZzPgogIAogICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiMxMTExMTciLz4KICAgIDwhLS0gU3RhdGUgMTogSWRsZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMjUwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjYwIiByeD0iMTIiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzIi8+CiAgICA8cmVjdCB4PSIxMjAiIHk9IjI2OCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjgiIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjciLz4KICAgIDwhLS0gU3RhdGUgMjogQWN0aXZlIC0tPgogICAgPHJlY3QgeD0iMzMwIiB5PSIxMzAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNjAiIHJ4PSIxMiIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjMiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPHJlY3QgeD0iMzUwIiB5PSIxNDgiIHdpZHRoPSI2MCIgaGVpZ2h0PSI4IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC43Ii8+CiAgICA8IS0tIFN0YXRlIDM6IENvbXBsZXRlIC0tPgogICAgPHJlY3QgeD0iNTYwIiB5PSIyNTAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNjAiIHJ4PSIxMiIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgIDxyZWN0IHg9IjU4MCIgeT0iMjY4IiB3aWR0aD0iNzAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNyIvPgogICAgPCEtLSBUcmFuc2l0aW9uOiBJZGxlIC0+IEFjdGl2ZSAtLT4KICAgIDxwYXRoIGQ9Ik0yNDAgMjU1IFEgMzAwIDE4MCwgMzMwIDE2MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZjVmNWY1IiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMzI2LDE2NSAzMzUsMTU4IDMzMCwxNjgiIGZpbGw9IiNmNWY1ZjUiLz4KICAgIDwhLS0gVHJhbnNpdGlvbjogQWN0aXZlIC0+IENvbXBsZXRlIC0tPgogICAgPHBhdGggZD0iTTQ3MCAxODUgUSA1NDAgMjMwLCA1NjAgMjYwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI1NTUsMjU1IDU2NSwyNTggNTU4LDI2NiIgZmlsbD0iI2Y1ZjVmNSIvPgogICAgPCEtLSBUcmFuc2l0aW9uOiBDb21wbGV0ZSAtPiBJZGxlIChyZXNldCkgLS0+CiAgICA8cGF0aCBkPSJNNTYwIDMwNSBRIDQwMCA0MjAsIDI0MCAzMDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjYgNCIgb3BhY2l0eT0iMC41Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjI0NSwzMDAgMjM4LDMxMCAyNDgsMzA4IiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjUiLz4KICAgIDwhLS0gVHJhbnNpdGlvbiBsYWJlbCBiYXJzIC0tPgogICAgPHJlY3QgeD0iMjYwIiB5PSIyMDAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgICA8cmVjdCB4PSI1MDAiIHk9IjIxNSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9IjM4MCIgeT0iMzk1IiB3aWR0aD0iNDAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuMyIvPgogICAgPCEtLSBFbnRyeSBpbmRpY2F0b3Igb24gZmlyc3Qgc3RhdGUgLS0+CiAgICA8bGluZSB4MT0iNjAiIHkxPSIyODAiIHgyPSI5NSIgeTI9IjI4MCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI5MiwyNzQgMTAyLDI4MCA5MiwyODYiIGZpbGw9IiNmZmZmZmYiLz4KICAKPC9nPgo8L3N2Zz4=" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>Five boolean flags create 32 possible state combinations. Most are invalid. A state machine with five named states has exactly five valid states. That is the core argument for modeling UI behavior in .orb.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-boolean-flag-trap">The Boolean Flag Trap<a href="https://orb.almadar.io/blog/fsm-underused-pattern#the-boolean-flag-trap" class="hash-link" aria-label="Direct link to The Boolean Flag Trap" title="Direct link to The Boolean Flag Trap" translate="no">​</a></h2>
<p>This pattern is everywhere in React codebases:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:rgb(80, 250, 123)">UserProfile</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isLoading</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsLoading</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isEditing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsEditing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isSaving</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsSaving</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isSuccess</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsSuccess</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Can isLoading and isError both be true?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Can isEditing and isSaving both be true?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// Can isSuccess and isError both be true?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// The code does not answer these questions.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Five booleans, 32 combinations, and the valid subset is never explicitly defined. Bugs come from states you did not consider: loading and error simultaneously, editing and saving at the same time, success lingering after a retry triggers an error.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-state-machine-alternative">The State Machine Alternative<a href="https://orb.almadar.io/blog/fsm-underused-pattern#the-state-machine-alternative" class="hash-link" aria-label="Direct link to The State Machine Alternative" title="Direct link to The State Machine Alternative" translate="no">​</a></h2>
<p>The same behavior, modeled as a .orb state machine:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-sm-2-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><linearGradient id="avl-sm-2-grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.1"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0.05"></stop></linearGradient></defs><style>
          @keyframes avl-sm-dash { from { stroke-dashoffset: 20; } to { stroke-dashoffset: 0; } }
        </style><circle cx="300" cy="200" r="180" fill="url(#avl-sm-2-grad)"></circle><g><g opacity="0.7"><defs><marker id="avl-tr-4-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M346.6952557518821,53.22307161793505 Q391.8513795076401,78.91220218118895 406.83399976991046,128.6568303516542" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-4-arrow)"></path></g><text x="383.5460070306497" y="49.96465541805248" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">FETCH</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-5-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M410.07006774741023,131.00797136082411 Q395.08744748513993,81.26334319035885 349.93132372938186,55.574212627104934" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-5-arrow)"></path></g><text x="410.83757261536084" y="82.48929992071002" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">SUCCESS</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-6-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M393.658477444273,153.6474508437579 Q302,116.98405986604868 210.34152255572695,153.6474508437579" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-6-arrow)"></path></g><text x="338.6633909777092" y="133.6474508437579" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">ERROR</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-7-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M326.55451091991426,67.21503942599401 Q400.01890540354236,168.7363467295061 383.20256533754065,292.91687580006874" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-7-arrow)"></path></g><text x="373.98273576664707" y="125.03704651821809" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">EDIT</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-8-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M339.167787843871,321.3525491562421 Q302,336.2196642937905 264.83221215612906,321.3525491562421" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-8-arrow)"></path></g><text x="316.8671151375484" y="341.3525491562421" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">SAVE</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-9-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M226.97404488050148,300.4293057977487 Q210.1577048144997,176.24877672718608 283.6220992981278,74.727469423674" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-9-arrow)"></path></g><text x="224.9473308798863" y="226.53841499802735" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">SUCCESS</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-10-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M196.6903794317566,300.4293057977487 Q160.79402423861453,243.9963042674218 173.71942325759917,178.3749202674319" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-10-arrow)"></path></g><text x="170.7779622536063" y="269.99333002615265" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">ERROR</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-11-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M384.4386333150404,296.72110186524935 Q401.2549733810422,172.5405727946867 327.79057889741404,71.01926549117462" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-11-arrow)"></path></g><text x="397.8780255111974" y="219.1220071330286" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">CANCEL</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-12-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M196.98335528009937,140.7161752933235 Q211.96597554236976,90.97154712285821 257.1220992981278,65.2824165596043" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-12-arrow)"></path></g><text x="203.26927343965846" y="101.90570778570877" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">RETRY</text></g><g opacity="1" transform="translate(255,32)"><circle cx="-16" cy="18" r="6" fill="var(--color-primary)"></circle><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">idle</text></g><g opacity="1" transform="translate(397.658477444273,135.6474508437579)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">loading</text></g><g opacity="1" transform="translate(343.167787843871,303.3525491562421)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">editing</text></g><g opacity="1" transform="translate(166.83221215612906,303.3525491562421)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">saving</text></g><g opacity="1" transform="translate(112.34152255572695,135.6474508437579)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">error</text></g></svg></div>
<p>Five states, nine transitions. The entity is in exactly one state at a time. <code>loading</code> and <code>error</code> cannot coexist. <code>editing</code> and <code>saving</code> cannot coexist. Every valid transition is explicitly defined.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="orb-code-form-submission">.orb Code: Form Submission<a href="https://orb.almadar.io/blog/fsm-underused-pattern#orb-code-form-submission" class="hash-link" aria-label="Direct link to .orb Code: Form Submission" title="Direct link to .orb Code: Form Submission" translate="no">​</a></h2>
<p>Here is a form submission flow in .orb that replaces a tangle of boolean flags:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SubmitTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ContactForm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"editing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"validating"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"submitting"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"success"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"editing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"validating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SUBMIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"validate"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"validating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"submitting"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"VALIDATED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.valid"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"call-service"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"submitForm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"validating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"editing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"VALIDATED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.valid"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"submitting"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"success"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SUCCESS"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"page-header"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Submitted!"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"submitting"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"FAILURE"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"editing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"RETRY"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>This makes several classes of bugs impossible:</p>
<ul>
<li class="">Cannot submit while already submitting (no transition from <code>submitting</code> on <code>SUBMIT</code>)</li>
<li class="">Cannot be in both success and error (mutually exclusive states)</li>
<li class="">Validation is its own state, not a side effect crammed into the submit handler</li>
<li class="">Clear retry path from error back to editing</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-checkout-example">The Checkout Example<a href="https://orb.almadar.io/blog/fsm-underused-pattern#the-checkout-example" class="hash-link" aria-label="Direct link to The Checkout Example" title="Direct link to The Checkout Example" translate="no">​</a></h2>
<p>A checkout flow with booleans:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">function</span><span class="token plain"> </span><span class="token function maybe-class-name" style="color:rgb(80, 250, 123)">Checkout</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isCartOpen</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsCartOpen</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isCheckingOut</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsCheckingOut</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isProcessing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsProcessing</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">isComplete</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setIsComplete</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">hasError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> setHasError</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">useState</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)">// 32 possible combinations, most nonsensical</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>The same flow in .orb:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"cartOpen"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"checkoutForm"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"processing"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"complete"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"cartOpen"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"VIEW_CART"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"cartOpen"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"checkoutForm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CHECKOUT"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"checkoutForm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"processing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SUBMIT"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"processing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"complete"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SUCCESS"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"processing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"FAILURE"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"checkoutForm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"RETRY"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"cartOpen"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CLOSE"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Six explicit states instead of 32 boolean combinations. Every transition is intentional. The compiler validates that no state is unreachable, no overlay lacks an exit, and no event goes unhandled.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-to-reach-for-a-state-machine">When to Reach for a State Machine<a href="https://orb.almadar.io/blog/fsm-underused-pattern#when-to-reach-for-a-state-machine" class="hash-link" aria-label="Direct link to When to Reach for a State Machine" title="Direct link to When to Reach for a State Machine" translate="no">​</a></h2>
<p>Two or three booleans that never interact are manageable. Once you have four or more, or any async operations, or a multi-step flow, the interaction matrix becomes unmanageable. In .orb, state machines are not an optimization you reach for later. They are the default.</p>
<p>The result: your application can only be in states you explicitly defined, and it can only move between them through transitions you explicitly allowed.</p>]]></content:encoded>
            <category>Architecture</category>
            <category>State Machines</category>
        </item>
        <item>
            <title><![CDATA[Guard Clauses in .orb State Machines]]></title>
            <link>https://orb.almadar.io/blog/guard-clauses-state-machines</link>
            <guid>https://orb.almadar.io/blog/guard-clauses-state-machines</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Authorization logic is usually scattered across components, API routes, and middleware. In .orb, guards are part of the state machine definition. One declaration, enforced everywhere.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBTdGF0ZSBBIC0tPgogICAgPHJlY3QgeD0iODAiIHk9IjI2MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI1MCIgcng9IjEwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSI5NSIgeT0iMjc4IiB3aWR0aD0iNTAiIGhlaWdodD0iNyIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNiIvPgogICAgPCEtLSBBcnJvdyB0byBHdWFyZCAxIC0tPgogICAgPGxpbmUgeDE9IjIwMCIgeTE9IjI4NSIgeDI9IjI3MCIgeTI9IjI4NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMjY2LDI3OSAyNzYsMjg1IDI2NiwyOTEiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDwhLS0gR3VhcmQgMSAoZGlhbW9uZCkgLS0+CiAgICA8cG9seWdvbiBwb2ludHM9IjMxMCwyNTUgMzQwLDI4NSAzMTAsMzE1IDI4MCwyODUiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDwhLS0gUGFzcyBwYXRoIC0tPgogICAgPGxpbmUgeDE9IjM0MCIgeTE9IjI4NSIgeDI9IjQxMCIgeTI9IjI4NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDA2LDI3OSA0MTYsMjg1IDQwNiwyOTEiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDwhLS0gU3RhdGUgQiAtLT4KICAgIDxyZWN0IHg9IjQyMCIgeT0iMjYwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjUwIiByeD0iMTAiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxyZWN0IHg9IjQzNSIgeT0iMjc4IiB3aWR0aD0iNTUiIGhlaWdodD0iNyIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNiIvPgogICAgPCEtLSBBcnJvdyB0byBHdWFyZCAyIC0tPgogICAgPGxpbmUgeDE9IjU0MCIgeTE9IjI4NSIgeDI9IjYxMCIgeTI9IjI4NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNjA2LDI3OSA2MTYsMjg1IDYwNiwyOTEiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDwhLS0gR3VhcmQgMiAoZGlhbW9uZCkgLS0+CiAgICA8cG9seWdvbiBwb2ludHM9IjY1MCwyNTUgNjgwLDI4NSA2NTAsMzE1IDYyMCwyODUiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDwhLS0gQmxvY2sgcGF0aCAoWCkgLS0+CiAgICA8bGluZSB4MT0iNjQwIiB5MT0iMjc1IiB4Mj0iNjYwIiB5Mj0iMjk1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8bGluZSB4MT0iNjYwIiB5MT0iMjc1IiB4Mj0iNjQwIiB5Mj0iMjk1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8IS0tIFJlamVjdGVkIGFycm93IGdvaW5nIGRvd24gLS0+CiAgICA8bGluZSB4MT0iNjUwIiB5MT0iMzE1IiB4Mj0iNjUwIiB5Mj0iMzgwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNSIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI2NDQsMzc1IDY1MCwzODUgNjU2LDM3NSIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICA8IS0tIFJlamVjdGVkIHN0YXRlIC0tPgogICAgPHJlY3QgeD0iNjAwIiB5PSIzOTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iNDAiIHJ4PSI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9IjYxNSIgeT0iNDA0IiB3aWR0aD0iNDAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBHdWFyZCAxIGNoZWNrIG1hcmsgLS0+CiAgICA8cGF0aCBkPSJNMzAyIDI4NSBMMzA4IDI5MiBMMzIwIDI3OCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPCEtLSBUb3AgZ3VhcmQgZXhwbGFuYXRpb24gcm93IC0tPgogICAgPHJlY3QgeD0iMjYwIiB5PSIxOTUiIHdpZHRoPSI2MCIgaGVpZ2h0PSIyMCIgcng9IjQiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMTUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgICA8cmVjdCB4PSI2MDAiIHk9IjE5NSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjIwIiByeD0iNCIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4xNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEiLz4KICAKPC9nPgogIDxnIGNsYXNzPSJkYXJrLXZhcmlhbnQiPgogIDxkZWZzPgogICAgPGZpbHRlciBpZD0iZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjgiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyIGlkPSJzb2Z0LWdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICAKICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSI4MDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjMTExMTE3Ii8+CiAgICA8IS0tIFN0YXRlIEEgLS0+CiAgICA8cmVjdCB4PSI4MCIgeT0iMjYwIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjUwIiByeD0iMTAiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxyZWN0IHg9Ijk1IiB5PSIyNzgiIHdpZHRoPSI1MCIgaGVpZ2h0PSI3IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+CiAgICA8IS0tIEFycm93IHRvIEd1YXJkIDEgLS0+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMjg1IiB4Mj0iMjcwIiB5Mj0iMjg1IiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHBvbHlnb24gcG9pbnRzPSIyNjYsMjc5IDI3NiwyODUgMjY2LDI5MSIgZmlsbD0iI2Y1ZjVmNSIvPgogICAgPCEtLSBHdWFyZCAxIChkaWFtb25kKSAtLT4KICAgIDxwb2x5Z29uIHBvaW50cz0iMzEwLDI1NSAzNDAsMjg1IDMxMCwzMTUgMjgwLDI4NSIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPCEtLSBQYXNzIHBhdGggLS0+CiAgICA8bGluZSB4MT0iMzQwIiB5MT0iMjg1IiB4Mj0iNDEwIiB5Mj0iMjg1IiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI0MDYsMjc5IDQxNiwyODUgNDA2LDI5MSIgZmlsbD0iI2Y1ZjVmNSIvPgogICAgPCEtLSBTdGF0ZSBCIC0tPgogICAgPHJlY3QgeD0iNDIwIiB5PSIyNjAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNTAiIHJ4PSIxMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNDM1IiB5PSIyNzgiIHdpZHRoPSI1NSIgaGVpZ2h0PSI3IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+CiAgICA8IS0tIEFycm93IHRvIEd1YXJkIDIgLS0+CiAgICA8bGluZSB4MT0iNTQwIiB5MT0iMjg1IiB4Mj0iNjEwIiB5Mj0iMjg1IiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI2MDYsMjc5IDYxNiwyODUgNjA2LDI5MSIgZmlsbD0iI2Y1ZjVmNSIvPgogICAgPCEtLSBHdWFyZCAyIChkaWFtb25kKSAtLT4KICAgIDxwb2x5Z29uIHBvaW50cz0iNjUwLDI1NSA2ODAsMjg1IDY1MCwzMTUgNjIwLDI4NSIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPCEtLSBCbG9jayBwYXRoIChYKSAtLT4KICAgIDxsaW5lIHgxPSI2NDAiIHkxPSIyNzUiIHgyPSI2NjAiIHkyPSIyOTUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxsaW5lIHgxPSI2NjAiIHkxPSIyNzUiIHgyPSI2NDAiIHkyPSIyOTUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDwhLS0gUmVqZWN0ZWQgYXJyb3cgZ29pbmcgZG93biAtLT4KICAgIDxsaW5lIHgxPSI2NTAiIHkxPSIzMTUiIHgyPSI2NTAiIHkyPSIzODAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC41Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjY0NCwzNzUgNjUwLDM4NSA2NTYsMzc1IiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAgIDwhLS0gUmVqZWN0ZWQgc3RhdGUgLS0+CiAgICA8cmVjdCB4PSI2MDAiIHk9IjM5MCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI0MCIgcng9IjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIG9wYWNpdHk9IjAuNSIvPgogICAgPHJlY3QgeD0iNjE1IiB5PSI0MDQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8IS0tIEd1YXJkIDEgY2hlY2sgbWFyayAtLT4KICAgIDxwYXRoIGQ9Ik0zMDIgMjg1IEwzMDggMjkyIEwzMjAgMjc4IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8IS0tIFRvcCBndWFyZCBleHBsYW5hdGlvbiByb3cgLS0+CiAgICA8cmVjdCB4PSIyNjAiIHk9IjE5NSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjIwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC4xNSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEiLz4KICAgIDxyZWN0IHg9IjYwMCIgeT0iMTk1IiB3aWR0aD0iNjAiIGhlaWdodD0iMjAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjE1IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIvPgogIAo8L2c+Cjwvc3ZnPg==" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>Authorization logic is usually scattered across components, API routes, and middleware. In .orb, guards are part of the state machine definition. One declaration, enforced everywhere.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="guards-on-the-state-machine">Guards on the State Machine<a href="https://orb.almadar.io/blog/guard-clauses-state-machines#guards-on-the-state-machine" class="hash-link" aria-label="Direct link to Guards on the State Machine" title="Direct link to Guards on the State Machine" translate="no">​</a></h2>
<p>A guard is a boolean s-expression attached to a transition. If it evaluates to false, the transition is blocked. The event is received, but nothing happens.</p>
<p>Here is an approval workflow with guards controlling who can approve, reject, or escalate:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-sm-3-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><linearGradient id="avl-sm-3-grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.1"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0.05"></stop></linearGradient></defs><style>
          @keyframes avl-sm-dash { from { stroke-dashoffset: 20; } to { stroke-dashoffset: 0; } }
        </style><circle cx="300" cy="200" r="180" fill="url(#avl-sm-3-grad)"></circle><g><g opacity="0.7"><defs><marker id="avl-tr-13-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M339.6418327243724,62.931275550434414 Q384.79795648013044,88.62040611368832 399.7805767424008,138.36503428415358" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-13-arrow)"></path></g><text x="369.4391609756304" y="69.38106328305122" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">SUBMIT</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-14-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M427.51664471990057,174.57069420225127 Q440.4420437388852,240.19207820224116 404.5456885457432,296.6250797325681" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-14-arrow)"></path></g><text x="439.64648819355637" y="217.36734974884527" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">APPROVE (role&gt;=5)</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-15-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M403.01664471990057,166.5787263941923 Q356.76166002944,265.9857358677949 254.71011285800128,306.0701325966378" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-15-arrow)"></path></g><text x="370.28039020718023" y="224.60648814242487" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">REJECT (role&gt;=5)</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-16-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M393.658477444273,153.6474508437579 Q302,116.98405986604868 210.34152255572695,153.6474508437579" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-16-arrow)"></path></g><text x="338.6633909777092" y="133.6474508437579" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">ESCALATE (role&gt;=5)</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-17-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M196.98335528009937,166.5787263941923 Q243.23833997056,265.9857358677949 345.2898871419988,306.0701325966378" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-17-arrow)"></path></g><text x="229.71960979281974" y="224.60648814242487" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">APPROVE (role&gt;=9)</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-18-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M226.97404488050148,300.4293057977487 Q210.1577048144997,176.24877672718608 283.6220992981278,74.727469423674" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-18-arrow)"></path></g><text x="224.9473308798863" y="226.53841499802735" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">EDIT (owner)</text></g><g opacity="1" transform="translate(255,32)"><circle cx="-16" cy="18" r="6" fill="var(--color-primary)"></circle><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">draft</text></g><g opacity="1" transform="translate(397.658477444273,135.6474508437579)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">pending</text></g><g opacity="1" transform="translate(343.167787843871,303.3525491562421)"><rect x="-4" y="-4" width="98" height="44" rx="22" ry="22" fill="none" stroke="var(--color-primary)" stroke-width="1" opacity="0.5"></rect><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">approved</text></g><g opacity="1" transform="translate(166.83221215612906,303.3525491562421)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">rejected</text></g><g opacity="1" transform="translate(112.34152255572695,135.6474508437579)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">escalated</text></g></svg></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="guard-syntax">Guard Syntax<a href="https://orb.almadar.io/blog/guard-clauses-state-machines#guard-syntax" class="hash-link" aria-label="Direct link to Guard Syntax" title="Direct link to Guard Syntax" translate="no">​</a></h2>
<p>Guards use s-expression syntax with binding roots like <code>@entity</code>, <code>@user</code>, <code>@payload</code>, and <code>@now</code>:</p>
<p><strong>Simple comparison</strong> (only the owner can submit):</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"draft"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SUBMIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.authorId"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p><strong>Role-based</strong> (admin level required):</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"APPROVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p><strong>Multi-condition</strong> (tiered approval limits):</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"APPROVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.isFlagged"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"or"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.amount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">7</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.amount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>This encodes: level 5+ can approve up to $5K, level 7+ up to $50K. Flagged orders cannot be approved at any level.</p>
<p><strong>Time-based</strong> (action allowed only within 24 hours):</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"-"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@now"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.createdAt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token number">86400000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-complete-approval-workflow">A Complete Approval Workflow<a href="https://orb.almadar.io/blog/guard-clauses-state-machines#a-complete-approval-workflow" class="hash-link" aria-label="Direct link to A Complete Approval Workflow" title="Direct link to A Complete Approval Workflow" translate="no">​</a></h2>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OrderApproval"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Order"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"draft"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rejected"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"escalated"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"draft"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SUBMIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.amount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"is-empty"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.description"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"APPROVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.isFlagged"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.amount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.approvedAt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@now"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"update"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Order"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"escalated"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ESCALATE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"escalated"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"APPROVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">9</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rejected"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"REJECT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"rejected"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"draft"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EDIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.authorId"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>The guard expressions encode the entire authorization matrix: who can do what, under which conditions, at each stage of the workflow. All in one place.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-guards-beat-scattered-auth-logic">Why Guards Beat Scattered Auth Logic<a href="https://orb.almadar.io/blog/guard-clauses-state-machines#why-guards-beat-scattered-auth-logic" class="hash-link" aria-label="Direct link to Why Guards Beat Scattered Auth Logic" title="Direct link to Why Guards Beat Scattered Auth Logic" translate="no">​</a></h2>
<p>In a traditional application, the approval check lives in the component (<code>canApprove</code> computed property), the API route (middleware check), and possibly a database trigger. Three locations, three chances for them to drift out of sync.</p>
<p>In .orb, the guard is declared once on the transition. The compiler generates both the frontend check (button disabled when guard fails) and the backend check (request rejected when guard fails) from the same source. The guard is the single source of truth.</p>
<p>The compiler also validates guard expressions at compile time. It catches unknown operators (<code>"equals"</code> instead of <code>"="</code>), wrong argument counts (<code>"and"</code> with a single argument), type mismatches (comparing a string to a number), and unknown field references (<code>@entity.staus</code> when the field is <code>status</code>).</p>
<p>Guards are composable boolean expressions evaluated at transition time. They turn authorization from scattered imperative code into a declarative property of the state machine.</p>]]></content:encoded>
            <category>Architecture</category>
            <category>State Machines</category>
        </item>
        <item>
            <title><![CDATA[JSON That Thinks: How We Built a Turing-Complete Language Inside JSON]]></title>
            <link>https://orb.almadar.io/blog/json-that-thinks</link>
            <guid>https://orb.almadar.io/blog/json-that-thinks</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Every configuration language eventually hits the same wall S-expressions encoded as JSON arrays, giving you a Turing-complete language that every JSON tool already understands.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBMZWZ0IGJyYWNlIC0tPgogICAgPHBhdGggZD0iTTI2MCAxMjAgQyAyMzAgMTIwLCAyMjAgMTQwLCAyMjAgMTcwIEwyMjAgMjYwIEMgMjIwIDI4MCwgMjAwIDMwMCwgMjAwIDMwMCBDIDIwMCAzMDAsIDIyMCAzMjAsIDIyMCAzNDAgTDIyMCA0MzAgQyAyMjAgNDYwLCAyMzAgNDgwLCAyNjAgNDgwIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iNSIvPgogICAgPCEtLSBSaWdodCBicmFjZSAtLT4KICAgIDxwYXRoIGQ9Ik01NDAgMTIwIEMgNTcwIDEyMCwgNTgwIDE0MCwgNTgwIDE3MCBMNTgwIDI2MCBDIDU4MCAyODAsIDYwMCAzMDAsIDYwMCAzMDAgQyA2MDAgMzAwLCA1ODAgMzIwLCA1ODAgMzQwIEw1ODAgNDMwIEMgNTgwIDQ2MCwgNTcwIDQ4MCwgNTQwIDQ4MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjUiLz4KICAgIDwhLS0gR2Vhci9jb2cgaWNvbiBpbnNpZGUgYnJhY2VzIChjZW50ZXIpIC0tPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSI1MCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMzAwIiByPSIzMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjMwMCIgcj0iMTIiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDwhLS0gR2VhciB0ZWV0aCAtLT4KICAgIDxyZWN0IHg9IjM5MiIgeT0iMjQyIiB3aWR0aD0iMTYiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iMzkyIiB5PSIzNDQiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNCIgcng9IjMiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cmVjdCB4PSIzNDIiIHk9IjI5MiIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE2IiByeD0iMyIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjQ0NCIgeT0iMjkyIiB3aWR0aD0iMTQiIGhlaWdodD0iMTYiIHJ4PSIzIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iMzU4IiB5PSIyNTYiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgcng9IjMiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHRyYW5zZm9ybT0icm90YXRlKC00NSAzNjUgMjYzKSIvPgogICAgPHJlY3QgeD0iNDI4IiB5PSIyNTYiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgcng9IjMiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDQzNSAyNjMpIi8+CiAgICA8cmVjdCB4PSIzNTgiIHk9IjMzMCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiByeD0iMyIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgMzY1IDMzNykiLz4KICAgIDxyZWN0IHg9IjQyOCIgeT0iMzMwIiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgtNDUgNDM1IDMzNykiLz4KICAgIDwhLS0gSlNPTiBrZXktdmFsdWUgaGludHMgLS0+CiAgICA8cmVjdCB4PSIyODAiIHk9IjE3MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjMzMCIgeT0iMTcwIiB3aWR0aD0iNjAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMyIvPgogICAgPHJlY3QgeD0iMjgwIiB5PSIxOTAiIHdpZHRoPSI1MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzNDAiIHk9IjE5MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjI4MCIgeT0iNDAwIiB3aWR0aD0iNDUiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzM1IiB5PSI0MDAiIHdpZHRoPSI3MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cmVjdCB4PSIyODAiIHk9IjQyMCIgd2lkdGg9IjU1IiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjM0NSIgeT0iNDIwIiB3aWR0aD0iNTAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMyIvPgogIAo8L2c+CiAgPGcgY2xhc3M9ImRhcmstdmFyaWFudCI+CiAgPGRlZnM+CiAgICA8ZmlsdGVyIGlkPSJnbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iOCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9InNvZnQtZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgPC9kZWZzPgogIAogICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiMxMTExMTciLz4KICAgIDwhLS0gTGVmdCBicmFjZSAtLT4KICAgIDxwYXRoIGQ9Ik0yNjAgMTIwIEMgMjMwIDEyMCwgMjIwIDE0MCwgMjIwIDE3MCBMMjIwIDI2MCBDIDIyMCAyODAsIDIwMCAzMDAsIDIwMCAzMDAgQyAyMDAgMzAwLCAyMjAgMzIwLCAyMjAgMzQwIEwyMjAgNDMwIEMgMjIwIDQ2MCwgMjMwIDQ4MCwgMjYwIDQ4MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjUiLz4KICAgIDwhLS0gUmlnaHQgYnJhY2UgLS0+CiAgICA8cGF0aCBkPSJNNTQwIDEyMCBDIDU3MCAxMjAsIDU4MCAxNDAsIDU4MCAxNzAgTDU4MCAyNjAgQyA1ODAgMjgwLCA2MDAgMzAwLCA2MDAgMzAwIEMgNjAwIDMwMCwgNTgwIDMyMCwgNTgwIDM0MCBMNTgwIDQzMCBDIDU4MCA0NjAsIDU3MCA0ODAsIDU0MCA0ODAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI1Ii8+CiAgICA8IS0tIEdlYXIvY29nIGljb24gaW5zaWRlIGJyYWNlcyAoY2VudGVyKSAtLT4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjMwMCIgcj0iNTAiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjMwMCIgcj0iMzAiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSIzMDAiIHI9IjEyIiBmaWxsPSIjZmZmZmZmIi8+CiAgICA8IS0tIEdlYXIgdGVldGggLS0+CiAgICA8cmVjdCB4PSIzOTIiIHk9IjI0MiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE0IiByeD0iMyIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjM5MiIgeT0iMzQ0IiB3aWR0aD0iMTYiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iMzQyIiB5PSIyOTIiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNiIgcng9IjMiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cmVjdCB4PSI0NDQiIHk9IjI5MiIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE2IiByeD0iMyIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjM1OCIgeT0iMjU2IiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSgtNDUgMzY1IDI2MykiLz4KICAgIDxyZWN0IHg9IjQyOCIgeT0iMjU2IiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMS41IiB0cmFuc2Zvcm09InJvdGF0ZSg0NSA0MzUgMjYzKSIvPgogICAgPHJlY3QgeD0iMzU4IiB5PSIzMzAiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgcng9IjMiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHRyYW5zZm9ybT0icm90YXRlKDQ1IDM2NSAzMzcpIi8+CiAgICA8cmVjdCB4PSI0MjgiIHk9IjMzMCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE0IiByeD0iMyIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTQ1IDQzNSAzMzcpIi8+CiAgICA8IS0tIEpTT04ga2V5LXZhbHVlIGhpbnRzIC0tPgogICAgPHJlY3QgeD0iMjgwIiB5PSIxNzAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzMzAiIHk9IjE3MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjI4MCIgeT0iMTkwIiB3aWR0aD0iNTAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzQwIiB5PSIxOTAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cmVjdCB4PSIyODAiIHk9IjQwMCIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjMzNSIgeT0iNDAwIiB3aWR0aD0iNzAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuMyIvPgogICAgPHJlY3QgeD0iMjgwIiB5PSI0MjAiIHdpZHRoPSI1NSIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzNDUiIHk9IjQyMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjMiLz4KICAKPC9nPgo8L3N2Zz4=" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>Every configuration language eventually hits the same wall: you need logic, but your format only holds data. YAML leads to Helm chart nightmares. HCL and Dhall invent new syntax with new parsers. Jsonnet gets close but breaks JSON compatibility. Almadar took a different route: S-expressions encoded as JSON arrays, giving you a Turing-complete language that every JSON tool already understands.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="s-expressions-are-already-json">S-Expressions Are Already JSON<a href="https://orb.almadar.io/blog/json-that-thinks#s-expressions-are-already-json" class="hash-link" aria-label="Direct link to S-Expressions Are Already JSON" title="Direct link to S-Expressions Are Already JSON" translate="no">​</a></h2>
<p>In 1958, John McCarthy built Lisp on S-expressions: <code>(+ 1 2)</code>. An S-expression is a nested list with an operator in the first position. JSON arrays are nested lists. The mapping is direct:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"+"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"if"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"x"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"big"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"small"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p>No new syntax. No custom parser. Just a convention for interpreting what JSON already provides.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="guards-logic-that-controls-transitions">Guards: Logic That Controls Transitions<a href="https://orb.almadar.io/blog/json-that-thinks#guards-logic-that-controls-transitions" class="hash-link" aria-label="Direct link to Guards: Logic That Controls Transitions" title="Direct link to Guards: Logic That Controls Transitions" translate="no">​</a></h2>
<p>In .orb, S-expressions appear as guards on state machine transitions. A guard must evaluate to <code>true</code> for the transition to fire:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"APPROVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.amount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>The evaluator resolves bindings (<code>@user.roleLevel</code> becomes <code>5</code>, <code>@entity.amount</code> becomes <code>7500</code>), evaluates inner expressions, then evaluates the outer <code>and</code>. If the result is <code>false</code>, the transition does not exist. There is no "skip" button, no override path.</p>
<div style="margin:2rem 0"><svg viewBox="0 0 800 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-et-1-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="2" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter></defs><line x1="400" y1="74" x2="260" y2="146" stroke="var(--color-primary)" stroke-width="1" opacity="0.3"></line><line x1="400" y1="74" x2="540" y2="146" stroke="var(--color-primary)" stroke-width="1" opacity="0.3"></line><rect x="380" y="48" width="40" height="24" rx="4" ry="4" fill="var(--color-primary)" fill-opacity="0.15" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="400" y="61" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">and</text><line x1="260" y1="174" x2="141" y2="201.5" stroke="var(--color-primary)" stroke-width="1" opacity="0.3"></line><line x1="260" y1="174" x2="379" y2="244" stroke="var(--color-primary)" stroke-width="1" opacity="0.3"></line><rect x="240" y="148" width="40" height="24" rx="4" ry="4" fill="var(--color-primary)" fill-opacity="0.15" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="260" y="161" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">gte</text><circle cx="141" cy="260" r="58.5" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="3 2"></circle><text x="141" y="261" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="10" font-family="inherit" font-weight="normal">@user.roleLevel</text><circle cx="379" cy="260" r="16" fill="none" stroke="var(--color-primary)" stroke-width="1" opacity="0.5"></circle><text x="379" y="261" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="10" font-family="inherit" font-weight="normal">3</text><line x1="540" y1="174" x2="421" y2="205" stroke="var(--color-primary)" stroke-width="1" opacity="0.3"></line><line x1="540" y1="174" x2="659" y2="236.5" stroke="var(--color-primary)" stroke-width="1" opacity="0.3"></line><rect x="520" y="148" width="40" height="24" rx="4" ry="4" fill="var(--color-primary)" fill-opacity="0.15" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="540" y="161" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">lt</text><circle cx="421" cy="260" r="55" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="3 2"></circle><text x="421" y="261" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="10" font-family="inherit" font-weight="normal">@entity.amount</text><circle cx="659" cy="260" r="23.5" fill="none" stroke="var(--color-primary)" stroke-width="1" opacity="0.5"></circle><text x="659" y="261" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="10" font-family="inherit" font-weight="normal">10000</text></svg></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="effects-actions-that-follow-transitions">Effects: Actions That Follow Transitions<a href="https://orb.almadar.io/blog/json-that-thinks#effects-actions-that-follow-transitions" class="hash-link" aria-label="Direct link to Effects: Actions That Follow Transitions" title="Direct link to Effects: Actions That Follow Transitions" translate="no">​</a></h2>
<p>Effects are also S-expressions. They run after a guard passes:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.approvedAt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@now"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"REQUEST_APPROVED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p><code>set</code> writes to entity fields. <code>emit</code> sends cross-orbital events. <code>persist</code> saves to the database. <code>render-ui</code> renders a component. Each effect is a single array with an operator and operands.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="arithmetic-branching-recursion">Arithmetic, Branching, Recursion<a href="https://orb.almadar.io/blog/json-that-thinks#arithmetic-branching-recursion" class="hash-link" aria-label="Direct link to Arithmetic, Branching, Recursion" title="Direct link to Arithmetic, Branching, Recursion" translate="no">​</a></h2>
<p>S-expressions handle computed values inside effects:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.total"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"+"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.subtotal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.subtotal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.15</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p>Conditional logic works with <code>if</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"if"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.score"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ACHIEVEMENT_UNLOCKED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"KEEP_GOING"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p>Self-transitions with guards give you loops. This transition computes a running sum:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Computing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Computing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TICK"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.counter"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.counter"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"-"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.counter"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.result"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"+"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.result"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.counter"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TICK"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>State machine as loop. Entity fields as memory. Guard as termination condition. That combination makes .orb Turing-complete.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-binding-context">The Binding Context<a href="https://orb.almadar.io/blog/json-that-thinks#the-binding-context" class="hash-link" aria-label="Direct link to The Binding Context" title="Direct link to The Binding Context" translate="no">​</a></h2>
<p>S-expressions reference runtime data through prefixed bindings:</p>
<table><thead><tr><th>Prefix</th><th>Resolves To</th></tr></thead><tbody><tr><td><code>@entity.field</code></td><td>Current entity field value</td></tr><tr><td><code>@payload.field</code></td><td>Event payload data</td></tr><tr><td><code>@state</code></td><td>Current state name</td></tr><tr><td><code>@now</code></td><td>Current timestamp</td></tr><tr><td><code>@config.field</code></td><td>Application config</td></tr></tbody></table>
<p>These bindings are validated at compile time. Reference a field that does not exist on the entity, and <code>orbital validate</code> catches it before any code runs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-tradeoff-verbosity-for-universality">The Tradeoff: Verbosity for Universality<a href="https://orb.almadar.io/blog/json-that-thinks#the-tradeoff-verbosity-for-universality" class="hash-link" aria-label="Direct link to The Tradeoff: Verbosity for Universality" title="Direct link to The Tradeoff: Verbosity for Universality" translate="no">​</a></h2>
<p>A hypothetical custom syntax: <code>guard: user.roleLevel &gt;= 3 and entity.amount &lt; 10000</code> (50 characters).</p>
<p>The .orb version: <code>["and", ["&gt;=", "@user.roleLevel", 3], ["&lt;", "@entity.amount", 10000]]</code> (75 characters).</p>
<p>About 50% more characters. In exchange: no custom parser, no custom LSP, no new syntax to learn, every JSON tool works, and LLMs generate it correctly on the first try. Verbosity is a one-time cost. Tooling compatibility compounds forever.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="extending-without-breaking">Extending Without Breaking<a href="https://orb.almadar.io/blog/json-that-thinks#extending-without-breaking" class="hash-link" aria-label="Direct link to Extending Without Breaking" title="Direct link to Extending Without Breaking" translate="no">​</a></h2>
<p>New operators are additive. Adding <code>geo-distance</code> to the evaluator does not require a schema version bump:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"geo-distance"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.location"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.target"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p>If the evaluator knows the operator, it runs. If not, it returns a clear error. This extensibility model kept Lisp alive for 65 years.</p>
<p>Explore the full operator list in the <a href="https://orb.almadar.io/docs/stdlib" target="_blank" rel="noopener noreferrer" class="">S-expression standard library</a>.</p>]]></content:encoded>
            <category>Language Design</category>
            <category>Architecture</category>
        </item>
        <item>
            <title><![CDATA[One Schema, Five Apps: How We Built a Government Tool, an AI Platform, and Two Games with the Same Language]]></title>
            <link>https://orb.almadar.io/blog/one-schema-six-apps</link>
            <guid>https://orb.almadar.io/blog/one-schema-six-apps</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A government inspection system. A personal fitness tracker. A tactical strategy game. Three completely different domains, all built with the same .orb language. The vocabulary changes across domains. The structure does not.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBBcnJvd3MgLS0+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMzAwIiB4Mj0iMTYwIiB5Mj0iMTQwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNiA0IiBvcGFjaXR5PSIwLjQiLz4KICAgIDxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSI0MDAiIHkyPSI4MCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjYgNCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMzAwIiB4Mj0iNjQwIiB5Mj0iMTQwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNiA0IiBvcGFjaXR5PSIwLjQiLz4KICAgIDxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSIxNjAiIHkyPSI0NjAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI2IDQiIG9wYWNpdHk9IjAuNCIvPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjMwMCIgeDI9IjQwMCIgeTI9IjUyMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjYgNCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMzAwIiB4Mj0iNjQwIiB5Mj0iNDYwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNiA0IiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gQ2VudHJhbCBzY2hlbWEgZG9jIC0tPgogICAgPHJlY3QgeD0iMzQwIiB5PSIyNDAiIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiByeD0iMTAiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSI0IiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxyZWN0IHg9IjM1OCIgeT0iMjYyIiB3aWR0aD0iNDAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuOCIvPgogICAgPHJlY3QgeD0iMzU4IiB5PSIyNzYiIHdpZHRoPSI3MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzNTgiIHk9IjI4OSIgd2lkdGg9IjU1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjM1OCIgeT0iMzAyIiB3aWR0aD0iODAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzU4IiB5PSIzMTUiIHdpZHRoPSI0NSIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzNTgiIHk9IjMyOCIgd2lkdGg9IjY1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gUGxhdGZvcm0gaWNvbnMgLS0+CiAgICA8cmVjdCB4PSIxMzAiIHk9IjExNSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUwIiByeD0iOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iMTQ1IiB5PSIxMzAiIHdpZHRoPSIzMCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSI4MCIgcj0iMjgiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjgwIiByPSIxMCIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjY0MCwxMTIgNjY0LDE1NCA2MTYsMTU0IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSIxMzAiIHk9IjQzNSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUwIiByeD0iOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iMTQ1IiB5PSI0NTAiIHdpZHRoPSIzMCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSI1MjAiIHI9IjI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSI1MjAiIHI9IjEwIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNjQwLDQzMiA2NjQsNDc0IDYxNiw0NzQiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAKPC9nPgogIDxnIGNsYXNzPSJkYXJrLXZhcmlhbnQiPgogIDxkZWZzPgogICAgPGZpbHRlciBpZD0iZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjgiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyIGlkPSJzb2Z0LWdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICAKICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSI4MDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjMTExMTE3Ii8+CiAgICA8IS0tIEFycm93cyAtLT4KICAgIDxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSIxNjAiIHkyPSIxNDAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI2IDQiIG9wYWNpdHk9IjAuNCIvPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjMwMCIgeDI9IjQwMCIgeTI9IjgwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNiA0IiBvcGFjaXR5PSIwLjQiLz4KICAgIDxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSI2NDAiIHkyPSIxNDAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI2IDQiIG9wYWNpdHk9IjAuNCIvPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjMwMCIgeDI9IjE2MCIgeTI9IjQ2MCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjYgNCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMzAwIiB4Mj0iNDAwIiB5Mj0iNTIwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNiA0IiBvcGFjaXR5PSIwLjQiLz4KICAgIDxsaW5lIHgxPSI0MDAiIHkxPSIzMDAiIHgyPSI2NDAiIHkyPSI0NjAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI2IDQiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBDZW50cmFsIHNjaGVtYSBkb2MgLS0+CiAgICA8cmVjdCB4PSIzNDAiIHk9IjI0MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxMjAiIHJ4PSIxMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjQiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPHJlY3QgeD0iMzU4IiB5PSIyNjIiIHdpZHRoPSI0MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC44Ii8+CiAgICA8cmVjdCB4PSIzNTgiIHk9IjI3NiIgd2lkdGg9IjcwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjM1OCIgeT0iMjg5IiB3aWR0aD0iNTUiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzU4IiB5PSIzMDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzNTgiIHk9IjMxNSIgd2lkdGg9IjQ1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjM1OCIgeT0iMzI4IiB3aWR0aD0iNjUiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBQbGF0Zm9ybSBpY29ucyAtLT4KICAgIDxyZWN0IHg9IjEzMCIgeT0iMTE1IiB3aWR0aD0iNjAiIGhlaWdodD0iNTAiIHJ4PSI4IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSIxNDUiIHk9IjEzMCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjgwIiByPSIyOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iODAiIHI9IjEwIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNjQwLDExMiA2NjQsMTU0IDYxNiwxNTQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxyZWN0IHg9IjEzMCIgeT0iNDM1IiB3aWR0aD0iNjAiIGhlaWdodD0iNTAiIHJ4PSI4IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSIxNDUiIHk9IjQ1MCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjUyMCIgcj0iMjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjUyMCIgcj0iMTAiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI2NDAsNDMyIDY2NCw0NzQgNjE2LDQ3NCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogIAo8L2c+Cjwvc3ZnPg==" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>A government inspection system. A personal fitness tracker. A tactical strategy game. Three completely different domains, all built with the same .orb language. The vocabulary changes across domains. The structure does not.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-formula">The Formula<a href="https://orb.almadar.io/blog/one-schema-six-apps#the-formula" class="hash-link" aria-label="Direct link to The Formula" title="Direct link to The Formula" translate="no">​</a></h2>
<p>Every .orb application follows one formula: Entity + Traits + Pages. An entity defines the data shape. Traits define behavior through state machines. Pages bind traits to URL routes. This formula works for any domain because it models behavior, not technology.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-government-inspection-system">1. Government Inspection System<a href="https://orb.almadar.io/blog/one-schema-six-apps#1-government-inspection-system" class="hash-link" aria-label="Direct link to 1. Government Inspection System" title="Direct link to 1. Government Inspection System" translate="no">​</a></h2>
<p>An inspector walks through five mandatory phases: Introduction, Content, Preparation, Record, Closing. Legal requirements are enforced by guards. You cannot close an inspection without findings, measures, and both signatures.</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-3-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-3-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-3-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">Inspection</text></g><g opacity="0.7" transform="rotate(0,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(0,239,200)">InspectionWorkflow</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="315.2824165596043" y1="178.96555814625137" x2="319.9846985779441" y2="172.4934221912518" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="324.727469423674" y1="191.96555814625137" x2="332.3359215540352" y2="189.4934221912518" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="324.727469423674" y1="208.03444185374863" x2="332.3359215540352" y2="210.5065778087482" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="315.2824165596043" y1="221.03444185374863" x2="319.9846985779441" y2="227.5065778087482" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="300" y1="226" x2="300" y2="234" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="284.7175834403957" y1="221.03444185374863" x2="280.0153014220559" y2="227.5065778087482" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="275.272530576326" y1="208.03444185374863" x2="267.6640784459648" y2="210.5065778087482" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="275.272530576326" y1="191.96555814625137" x2="267.6640784459648" y2="189.4934221912518" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="284.7175834403957" y1="178.96555814625137" x2="280.0153014220559" y2="172.4934221912518" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/inspection/:id</text></g><g opacity="1"><rect x="308.58870022479493" y="324.28784639787557" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="313.58870022479493" y="346.28784639787557" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/inspections</text></g></svg></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Inspection"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"legalBasis"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"findings"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"array"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"measures"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"array"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"inspectorSignature"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"boolean"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"subjectSignature"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"boolean"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"values"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"draft"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"in_progress"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"completed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>The closing guard enforces all five conditions:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Record"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Closing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CLOSE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not-empty"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.legalBasis"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not-empty"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.findings"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not-empty"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.measures"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.inspectorSignature"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.subjectSignature"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"completed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"update"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Inspection"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>If any condition is missing, the CLOSE event simply does not fire. No skip button. No override. The state machine has no transition.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-fitness-tracker">2. Fitness Tracker<a href="https://orb.almadar.io/blog/one-schema-six-apps#2-fitness-tracker" class="hash-link" aria-label="Direct link to 2. Fitness Tracker" title="Direct link to 2. Fitness Tracker" translate="no">​</a></h2>
<p>A personal trainer manages clients with a credit-based booking system. Credits must be positive and not expired to book a session. Cancellation automatically refunds the credit.</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-4-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-4-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-4-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">Session</text></g><g opacity="0.7" transform="rotate(-60,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(60,239,200)">SessionBooking</text></g><g opacity="0.7" transform="rotate(60,300,200)"><ellipse cx="300" cy="200" rx="75" ry="32" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="219" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(-60,219,200)">WorkoutLog</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="320.3276185441688" y1="183.78926515167294" x2="326.582270403913" y2="178.80134673680305" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="325.3481257167274" y1="205.78554428286418" x2="333.147549014182" y2="207.5657117545147" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="311.2809772170565" y1="223.4251905654629" x2="314.752047129997" y2="230.63294150868225" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="288.7190227829435" y1="223.4251905654629" x2="285.247952870003" y2="230.63294150868225" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="274.6518742832726" y1="205.78554428286418" x2="266.852450985818" y2="207.5657117545147" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="279.6723814558312" y1="183.78926515167294" x2="273.417729596087" y2="178.80134673680305" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/trainee/:id</text></g><g opacity="1"><rect x="308.58870022479493" y="324.28784639787557" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="313.58870022479493" y="346.28784639787557" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/schedule</text></g></svg></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Session"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"traineeId"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"required"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"scheduledAt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"timestamp"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"remainingCredits"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"number"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"creditsExpireAt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"timestamp"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"values"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"individual"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"group"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"online"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>The booking transition uses the same guard and effect primitives as the inspection system:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"available"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"booked"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"BOOK"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.remainingCredits"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@now"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.creditsExpireAt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.remainingCredits"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"-"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.remainingCredits"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"update"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Session"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"notify"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"success"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Session booked"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>The business rule (deduct one credit on booking, refund on cancel) lives in the schema, not hidden in a service layer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tactical-strategy-game">3. Tactical Strategy Game<a href="https://orb.almadar.io/blog/one-schema-six-apps#3-tactical-strategy-game" class="hash-link" aria-label="Direct link to 3. Tactical Strategy Game" title="Direct link to 3. Tactical Strategy Game" translate="no">​</a></h2>
<p>Trait Wars is a turn-based strategy game where units equip behavioral traits. The turn controller moves through five phases: Observation, Selection, Movement, Action, Resolution.</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-5-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-5-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-5-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">Unit</text></g><g opacity="0.7" transform="rotate(-60,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(60,239,200)">TurnPhaseController</text></g><g opacity="0.7" transform="rotate(60,300,200)"><ellipse cx="300" cy="200" rx="75" ry="32" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="219" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(-60,219,200)">UnitCombat</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="318.3847763108502" y1="181.61522368914976" x2="324.04163056034264" y2="175.9583694396574" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="326" y1="200" x2="334" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="318.3847763108502" y1="218.38477631085024" x2="324.04163056034264" y2="224.0416305603426" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="300" y1="226" x2="300" y2="234" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="281.6152236891498" y1="218.38477631085024" x2="275.95836943965736" y2="224.0416305603426" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="274" y1="200" x2="266" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="281.6152236891498" y1="181.61522368914976" x2="275.95836943965736" y2="175.9583694396574" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/battle/:matchId</text></g><g opacity="1"><rect x="308.58870022479493" y="324.28784639787557" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="313.58870022479493" y="346.28784639787557" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/army</text></g></svg></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"persistence"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"runtime"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"hp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"number"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">100</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"attack"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"number"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">10</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"defense"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"number"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">5</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"values"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"alive"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stunned"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dead"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Combat guards enforce game rules with the same operators:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"attacking"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ATTACK"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.hp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"!="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"stunned"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"DAMAGE_DEALT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"attackerId"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"damage"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.attack"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>A dead or stunned unit cannot attack. The guard makes it structurally impossible.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-pattern">The Pattern<a href="https://orb.almadar.io/blog/one-schema-six-apps#the-pattern" class="hash-link" aria-label="Direct link to The Pattern" title="Direct link to The Pattern" translate="no">​</a></h2>
<table><thead><tr><th>Concept</th><th>Government</th><th>Fitness</th><th>Game</th></tr></thead><tbody><tr><td>Entity</td><td>Inspection</td><td>Session</td><td>Unit</td></tr><tr><td>States</td><td>Intro...Closing</td><td>Available...Done</td><td>Idle...Dead</td></tr><tr><td>Guards</td><td>Fields filled, signed</td><td>Credits &gt; 0</td><td>HP &gt; 0, not stunned</td></tr><tr><td>Effects</td><td>Save findings</td><td>Deduct credit</td><td>Deal damage</td></tr><tr><td>Pages</td><td><code>/inspection/:id</code></td><td><code>/trainee/:id</code></td><td><code>/battle/:matchId</code></td></tr></tbody></table>
<p>Three domains. The same five elements: entity, states, guards, effects, pages. You learn .orb once, then apply it to government compliance, fitness tracking, game development, or anything else that has behavior.</p>
<p>Explore all projects at <a href="https://orb.almadar.io/docs/getting-started/introduction" target="_blank" rel="noopener noreferrer" class="">almadar.io</a>.</p>]]></content:encoded>
            <category>Case Study</category>
            <category>Architecture</category>
        </item>
        <item>
            <title><![CDATA[From 10,000 Lines to 200: The Real Cost of Boilerplate]]></title>
            <link>https://orb.almadar.io/blog/real-cost-of-boilerplate</link>
            <guid>https://orb.almadar.io/blog/real-cost-of-boilerplate</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[You want to build a task manager. Simple CRUD 120 lines in one file. This is not a theoretical estimate. Let's count both sides.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBMRUZUOiBCb2lsZXJwbGF0ZSBzdGFjayAtLT4KICAgIDxyZWN0IHg9IjgwIiB5PSIxMzAiIHdpZHRoPSIyNDAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9Ijk1IiB5PSIxNDIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cmVjdCB4PSI4MCIgeT0iMTgwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjQwIiByeD0iNiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgb3BhY2l0eT0iMC40NSIvPgogICAgPHJlY3QgeD0iOTUiIHk9IjE5MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjgwIiB5PSIyMzAiIHdpZHRoPSIyNDAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9Ijk1IiB5PSIyNDIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cmVjdCB4PSI4MCIgeT0iMjgwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjQwIiByeD0iNiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgb3BhY2l0eT0iMC41NSIvPgogICAgPHJlY3QgeD0iOTUiIHk9IjI5MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjgwIiB5PSIzMzAiIHdpZHRoPSIyNDAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjYiLz4KICAgIDxyZWN0IHg9Ijk1IiB5PSIzNDIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cmVjdCB4PSI4MCIgeT0iMzgwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjQwIiByeD0iNiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgb3BhY2l0eT0iMC42NSIvPgogICAgPHJlY3QgeD0iOTUiIHk9IjM5MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjgwIiB5PSI0MzAiIHdpZHRoPSIyNDAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9Ijk1IiB5PSI0NDIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIFZTIGRpdmlkZXIgLS0+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMTQwIiB4Mj0iNDAwIiB5Mj0iNDYwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWRhc2hhcnJheT0iOCA2IiBvcGFjaXR5PSIwLjMiLz4KICAgIDwhLS0gUklHSFQ6IFNpbmdsZSBjbGVhbiBzY2hlbWEgLS0+CiAgICA8cmVjdCB4PSI0ODAiIHk9IjIyMCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSIxNjAiIHJ4PSIxMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPHJlY3QgeD0iNTAwIiB5PSIyNDUiIHdpZHRoPSI2MCIgaGVpZ2h0PSI3IiByeD0iMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC44Ii8+CiAgICA8cmVjdCB4PSI1MTAiIHk9IjI2MiIgd2lkdGg9IjE0MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICA8cmVjdCB4PSI1MTAiIHk9IjI3NSIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSI1MDAiIHk9IjI5NSIgd2lkdGg9IjUwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjgiLz4KICAgIDxyZWN0IHg9IjUxMCIgeT0iMzEyIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9IjUxMCIgeT0iMzI1IiB3aWR0aD0iODAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iNTEwIiB5PSIzMzgiIHdpZHRoPSIxMzAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMyIvPgogICAgPCEtLSBBY2NlbnQgbWFya2VyIC0tPgogICAgPGNpcmNsZSBjeD0iNjAwIiBjeT0iNDIwIiByPSIxMCIgZmlsbD0iIzAwMDAwMCIgZmlsdGVyPSJ1cmwoI3NvZnQtZ2xvdykiLz4KICAKPC9nPgogIDxnIGNsYXNzPSJkYXJrLXZhcmlhbnQiPgogIDxkZWZzPgogICAgPGZpbHRlciBpZD0iZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjgiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyIGlkPSJzb2Z0LWdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICAKICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSI4MDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjMTExMTE3Ii8+CiAgICA8IS0tIExFRlQ6IEJvaWxlcnBsYXRlIHN0YWNrIC0tPgogICAgPHJlY3QgeD0iODAiIHk9IjEzMCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI0MCIgcng9IjYiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iOTUiIHk9IjE0MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjgwIiB5PSIxODAiIHdpZHRoPSIyNDAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjQ1Ii8+CiAgICA8cmVjdCB4PSI5NSIgeT0iMTkyIiB3aWR0aD0iNjAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuMyIvPgogICAgPHJlY3QgeD0iODAiIHk9IjIzMCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI0MCIgcng9IjYiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG9wYWNpdHk9IjAuNSIvPgogICAgPHJlY3QgeD0iOTUiIHk9IjI0MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjgwIiB5PSIyODAiIHdpZHRoPSIyNDAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjU1Ii8+CiAgICA8cmVjdCB4PSI5NSIgeT0iMjkyIiB3aWR0aD0iNjAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuMyIvPgogICAgPHJlY3QgeD0iODAiIHk9IjMzMCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI0MCIgcng9IjYiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG9wYWNpdHk9IjAuNiIvPgogICAgPHJlY3QgeD0iOTUiIHk9IjM0MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjgwIiB5PSIzODAiIHdpZHRoPSIyNDAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjY1Ii8+CiAgICA8cmVjdCB4PSI5NSIgeT0iMzkyIiB3aWR0aD0iNjAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuMyIvPgogICAgPHJlY3QgeD0iODAiIHk9IjQzMCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI0MCIgcng9IjYiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iOTUiIHk9IjQ0MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjMiLz4KICAgIDwhLS0gVlMgZGl2aWRlciAtLT4KICAgIDxsaW5lIHgxPSI0MDAiIHkxPSIxNDAiIHgyPSI0MDAiIHkyPSI0NjAiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtZGFzaGFycmF5PSI4IDYiIG9wYWNpdHk9IjAuMyIvPgogICAgPCEtLSBSSUdIVDogU2luZ2xlIGNsZWFuIHNjaGVtYSAtLT4KICAgIDxyZWN0IHg9IjQ4MCIgeT0iMjIwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjE2MCIgcng9IjEwIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIgZmlsdGVyPSJ1cmwoI2dsb3cpIi8+CiAgICA8cmVjdCB4PSI1MDAiIHk9IjI0NSIgd2lkdGg9IjYwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjgiLz4KICAgIDxyZWN0IHg9IjUxMCIgeT0iMjYyIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9IjUxMCIgeT0iMjc1IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjUwMCIgeT0iMjk1IiB3aWR0aD0iNTAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuOCIvPgogICAgPHJlY3QgeD0iNTEwIiB5PSIzMTIiIHdpZHRoPSIxMjAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNSIvPgogICAgPHJlY3QgeD0iNTEwIiB5PSIzMjUiIHdpZHRoPSI4MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSI1MTAiIHk9IjMzOCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIEFjY2VudCBtYXJrZXIgLS0+CiAgICA8Y2lyY2xlIGN4PSI2MDAiIGN5PSI0MjAiIHI9IjEwIiBmaWxsPSIjZmZmZmZmIiBmaWx0ZXI9InVybCgjc29mdC1nbG93KSIvPgogIAo8L2c+Cjwvc3ZnPg==" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>You want to build a task manager. Simple CRUD: create, read, update, delete. The traditional way costs you roughly 5,000 lines across 40+ files. The .orb way: 120 lines in one file. This is not a theoretical estimate. Let's count both sides.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-traditional-stack">The Traditional Stack<a href="https://orb.almadar.io/blog/real-cost-of-boilerplate#the-traditional-stack" class="hash-link" aria-label="Direct link to The Traditional Stack" title="Direct link to The Traditional Stack" translate="no">​</a></h2>
<p>A task manager built with React, Express, and PostgreSQL breaks down like this:</p>
<p><strong>Frontend</strong> (roughly 2,600 lines): TypeScript interfaces, API client functions, React Query hooks for each mutation, list/form/detail/modal components, a Redux or Zustand store, route setup, CSS, and tests.</p>
<p><strong>Backend</strong> (roughly 1,600 lines): Prisma model, Express routes, controller logic, auth middleware, validation middleware, service layer, migration files, API tests, and config.</p>
<p><strong>Infrastructure</strong> (roughly 800 lines): Docker Compose, CI workflow, README, shared types, error utilities, logger.</p>
<p>Grand total: around 5,000 lines for what users see as "a simple task manager." And this version has no pagination, no search filters, no optimistic updates.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-orb-version-120-lines">The .orb Version: 120 Lines<a href="https://orb.almadar.io/blog/real-cost-of-boilerplate#the-orb-version-120-lines" class="hash-link" aria-label="Direct link to The .orb Version: 120 Lines" title="Direct link to The .orb Version: 120 Lines" translate="no">​</a></h2>
<p>One file defines the entity, the state machine, the UI patterns, and the routes:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-6-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-6-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-6-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">Task</text></g><g opacity="0.7" transform="rotate(0,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(0,239,200)">TaskInteraction</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="322.5166604983954" y1="187" x2="329.4448637286709" y2="183" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="322.5166604983954" y1="213" x2="329.4448637286709" y2="217" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="300" y1="226" x2="300" y2="234" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="277.4833395016046" y1="213" x2="270.5551362713291" y2="217" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="277.4833395016046" y1="187" x2="270.5551362713291" y2="183" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/tasks</text></g></svg></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Taskly"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"orbitals"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"collection"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"tasks"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"title"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"required"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"description"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"values"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"todo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"in-progress"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"done"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"priority"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"values"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"low"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"medium"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"high"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"assignee"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dueDate"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"date"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TaskInteraction"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Editing"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Deleting"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"entity-table"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token property">"columns"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"title"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"priority"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"assignee"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"dueDate"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CREATE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"form-section"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"title"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"description"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"priority"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token property">"submitEvent"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"cancelEvent"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CANCEL"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"create"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.data"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CANCEL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"pages"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TasksPage"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"path"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/tasks"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Compile and run:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile taskly.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> typescript </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> taskly-app/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> taskly-app </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> run dev</span><br></span></code></pre></div></div>
<p>This generates React components with table, forms, and delete confirmation. Express backend with CRUD endpoints. Database models. TypeScript types shared across frontend and backend. State management via event bus. Route handling.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-maintenance-multiplier">The Maintenance Multiplier<a href="https://orb.almadar.io/blog/real-cost-of-boilerplate#the-maintenance-multiplier" class="hash-link" aria-label="Direct link to The Maintenance Multiplier" title="Direct link to The Maintenance Multiplier" translate="no">​</a></h2>
<p>Lines of code are not just a development cost. They are a maintenance tax that compounds over time.</p>
<table><thead><tr><th>Metric</th><th>Traditional (5,000 lines)</th><th>.orb (120 lines)</th></tr></thead><tbody><tr><td>Bug surface area</td><td>5,000 potential locations</td><td>120 potential locations</td></tr><tr><td>Onboarding time</td><td>Days to weeks</td><td>Hours</td></tr><tr><td>Change propagation</td><td>Touch 7+ files per rename</td><td>Edit one field, recompile</td></tr><tr><td>Test coverage needed</td><td>1,000+ test lines</td><td>Schema validation + smoke tests</td></tr></tbody></table>
<p>When you rename a field in the traditional version, you update the database model, the Prisma schema, the TypeScript interface, the API endpoint, the form component, the table component, the detail component, and the tests. Seven places for one rename.</p>
<p>In .orb, you change it in the entity definition. One place. Run <code>orbital compile</code>. Done.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-trade">What You Trade<a href="https://orb.almadar.io/blog/real-cost-of-boilerplate#what-you-trade" class="hash-link" aria-label="Direct link to What You Trade" title="Direct link to What You Trade" translate="no">​</a></h2>
<p>.orb is not magic. You give up pixel-perfect custom UI (generated components follow patterns, though custom design systems are supported). You give up unusual data access patterns that fall outside standard CRUD. You give up direct control over generated code (you fix the schema, the compiler, or the shell template, never the output).</p>
<p>For most business applications with forms, tables, modals, and CRUD workflows, those tradeoffs pay for themselves many times over.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-bottom-line">The Bottom Line<a href="https://orb.almadar.io/blog/real-cost-of-boilerplate#the-bottom-line" class="hash-link" aria-label="Direct link to The Bottom Line" title="Direct link to The Bottom Line" translate="no">​</a></h2>
<p>A 120-line .orb program that generates a 5,000-line application means 40x less code to maintain, 40x smaller bug surface, 40x faster onboarding, and one place to change instead of seven.</p>
<p>The real question is not "can I write 5,000 lines?" It is "do I want to maintain them for the next 5 years?"</p>
<p>Start with the <a href="https://orb.almadar.io/docs/getting-started/introduction" target="_blank" rel="noopener noreferrer" class="">Getting Started guide</a>.</p>]]></content:encoded>
            <category>Startups</category>
            <category>Productivity</category>
            <category>Tutorial</category>
        </item>
        <item>
            <title><![CDATA[S-Expressions: The JSON of Functional Programming (That Actually Makes Sense)]]></title>
            <link>https://orb.almadar.io/blog/s-expressions-json-functional</link>
            <guid>https://orb.almadar.io/blog/s-expressions-json-functional</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[JSON holds data beautifully but has no answer for logic. String templates are error-prone and injectable. Custom DSLs are verbose and hard to validate. JavaScript functions are not serializable. S-expressions solve all three problems: they are structured, serializable, and executable, encoded as plain JSON arrays.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBSb290IG5vZGUgLS0+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSIxMDAiIHI9IjI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMyIgZmlsdGVyPSJ1cmwoI2dsb3cpIi8+CiAgICA8Y2lyY2xlIGN4PSI0MDAiIGN5PSIxMDAiIHI9IjEwIiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8IS0tIExldmVsIDEgYnJhbmNoZXMgLS0+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMTI4IiB4Mj0iMjUwIiB5Mj0iMjEwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjEyOCIgeDI9IjU1MCIgeTI9IjIxMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDwhLS0gTGV2ZWwgMSBub2RlcyAtLT4KICAgIDxjaXJjbGUgY3g9IjI1MCIgY3k9IjIyMCIgcj0iMjIiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxjaXJjbGUgY3g9IjI1MCIgY3k9IjIyMCIgcj0iOCIgZmlsbD0iIzAwMDAwMCIvPgogICAgPGNpcmNsZSBjeD0iNTUwIiBjeT0iMjIwIiByPSIyMiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPGNpcmNsZSBjeD0iNTUwIiBjeT0iMjIwIiByPSI4IiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8IS0tIExldmVsIDIgYnJhbmNoZXMgZnJvbSBsZWZ0IC0tPgogICAgPGxpbmUgeDE9IjI1MCIgeTE9IjI0MiIgeDI9IjE1MCIgeTI9IjMzMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGxpbmUgeDE9IjI1MCIgeTE9IjI0MiIgeDI9IjMwMCIgeTI9IjMzMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPCEtLSBMZXZlbCAyIGJyYW5jaGVzIGZyb20gcmlnaHQgLS0+CiAgICA8bGluZSB4MT0iNTUwIiB5MT0iMjQyIiB4Mj0iNDcwIiB5Mj0iMzMwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41Ii8+CiAgICA8bGluZSB4MT0iNTUwIiB5MT0iMjQyIiB4Mj0iNjIwIiB5Mj0iMzMwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41Ii8+CiAgICA8IS0tIExldmVsIDIgbGVhZiBub2RlcyAtLT4KICAgIDxyZWN0IHg9IjEzMCIgeT0iMzM1IiB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHJ4PSI2IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iMjgwIiB5PSIzMzUiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyNCIgcng9IjYiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cmVjdCB4PSI0NTAiIHk9IjMzNSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjYwMCIgeT0iMzM1IiB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHJ4PSI2IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPCEtLSBMZXZlbCAzIGRlZXBlciBmcm9tIHNvbWUgbGVhdmVzIC0tPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM1OSIgeDI9IjExMCIgeTI9IjQzMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTkiIHgyPSIxOTAiIHkyPSI0MzAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgICA8bGluZSB4MT0iNjIwIiB5MT0iMzU5IiB4Mj0iNTkwIiB5Mj0iNDMwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPGxpbmUgeDE9IjYyMCIgeTE9IjM1OSIgeDI9IjY2MCIgeTI9IjQzMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEiLz4KICAgIDwhLS0gTGV2ZWwgMyBsZWFmIG5vZGVzIC0tPgogICAgPGNpcmNsZSBjeD0iMTEwIiBjeT0iNDQwIiByPSIxNCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGNpcmNsZSBjeD0iMTkwIiBjeT0iNDQwIiByPSIxNCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGNpcmNsZSBjeD0iNTkwIiBjeT0iNDQwIiByPSIxNCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGNpcmNsZSBjeD0iNjYwIiBjeT0iNDQwIiByPSIxNCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPCEtLSBQYXJlbnRoZXNpcyBkZWNvcmF0aW9ucyAtLT4KICAgIDxwYXRoIGQ9Ik0zNzAgNzAgUSAzNjAgMTAwLCAzNzAgMTMwIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cGF0aCBkPSJNNDMwIDcwIFEgNDQwIDEwMCwgNDMwIDEzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuMyIvPgogIAo8L2c+CiAgPGcgY2xhc3M9ImRhcmstdmFyaWFudCI+CiAgPGRlZnM+CiAgICA8ZmlsdGVyIGlkPSJnbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iOCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9InNvZnQtZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgPC9kZWZzPgogIAogICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiMxMTExMTciLz4KICAgIDwhLS0gUm9vdCBub2RlIC0tPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMTAwIiByPSIyOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjMiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMTAwIiByPSIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBMZXZlbCAxIGJyYW5jaGVzIC0tPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjEyOCIgeDI9IjI1MCIgeTI9IjIxMCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxsaW5lIHgxPSI0MDAiIHkxPSIxMjgiIHgyPSI1NTAiIHkyPSIyMTAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8IS0tIExldmVsIDEgbm9kZXMgLS0+CiAgICA8Y2lyY2xlIGN4PSIyNTAiIGN5PSIyMjAiIHI9IjIyIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8Y2lyY2xlIGN4PSIyNTAiIGN5PSIyMjAiIHI9IjgiIGZpbGw9IiNmZmZmZmYiLz4KICAgIDxjaXJjbGUgY3g9IjU1MCIgY3k9IjIyMCIgcj0iMjIiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxjaXJjbGUgY3g9IjU1MCIgY3k9IjIyMCIgcj0iOCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBMZXZlbCAyIGJyYW5jaGVzIGZyb20gbGVmdCAtLT4KICAgIDxsaW5lIHgxPSIyNTAiIHkxPSIyNDIiIHgyPSIxNTAiIHkyPSIzMzAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxsaW5lIHgxPSIyNTAiIHkxPSIyNDIiIHgyPSIzMDAiIHkyPSIzMzAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDwhLS0gTGV2ZWwgMiBicmFuY2hlcyBmcm9tIHJpZ2h0IC0tPgogICAgPGxpbmUgeDE9IjU1MCIgeTE9IjI0MiIgeDI9IjQ3MCIgeTI9IjMzMCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPGxpbmUgeDE9IjU1MCIgeTE9IjI0MiIgeDI9IjYyMCIgeTI9IjMzMCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogICAgPCEtLSBMZXZlbCAyIGxlYWYgbm9kZXMgLS0+CiAgICA8cmVjdCB4PSIxMzAiIHk9IjMzNSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNiIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjI4MCIgeT0iMzM1IiB3aWR0aD0iNDAiIGhlaWdodD0iMjQiIHJ4PSI2IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iNDUwIiB5PSIzMzUiIHdpZHRoPSI0MCIgaGVpZ2h0PSIyNCIgcng9IjYiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cmVjdCB4PSI2MDAiIHk9IjMzNSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjI0IiByeD0iNiIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDwhLS0gTGV2ZWwgMyBkZWVwZXIgZnJvbSBzb21lIGxlYXZlcyAtLT4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTkiIHgyPSIxMTAiIHkyPSI0MzAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMzU5IiB4Mj0iMTkwIiB5Mj0iNDMwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPGxpbmUgeDE9IjYyMCIgeTE9IjM1OSIgeDI9IjU5MCIgeTI9IjQzMCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEiLz4KICAgIDxsaW5lIHgxPSI2MjAiIHkxPSIzNTkiIHgyPSI2NjAiIHkyPSI0MzAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgICA8IS0tIExldmVsIDMgbGVhZiBub2RlcyAtLT4KICAgIDxjaXJjbGUgY3g9IjExMCIgY3k9IjQ0MCIgcj0iMTQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxjaXJjbGUgY3g9IjE5MCIgY3k9IjQ0MCIgcj0iMTQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxjaXJjbGUgY3g9IjU5MCIgY3k9IjQ0MCIgcj0iMTQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDxjaXJjbGUgY3g9IjY2MCIgY3k9IjQ0MCIgcj0iMTQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICAgIDwhLS0gUGFyZW50aGVzaXMgZGVjb3JhdGlvbnMgLS0+CiAgICA8cGF0aCBkPSJNMzcwIDcwIFEgMzYwIDEwMCwgMzcwIDEzMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIG9wYWNpdHk9IjAuMyIvPgogICAgPHBhdGggZD0iTTQzMCA3MCBRIDQ0MCAxMDAsIDQzMCAxMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBvcGFjaXR5PSIwLjMiLz4KICAKPC9nPgo8L3N2Zz4=" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>JSON holds data beautifully but has no answer for logic. String templates are error-prone and injectable. Custom DSLs are verbose and hard to validate. JavaScript functions are not serializable. S-expressions solve all three problems: they are structured, serializable, and executable, encoded as plain JSON arrays.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem">The Problem<a href="https://orb.almadar.io/blog/s-expressions-json-functional#the-problem" class="hash-link" aria-label="Direct link to The Problem" title="Direct link to The Problem" translate="no">​</a></h2>
<p>When you need conditional logic inside JSON, the options are all flawed:</p>
<p><strong>String templates</strong> like <code>"user.age &gt;= 18 &amp;&amp; user.verified"</code> invite typos, injection, and zero validation.</p>
<p><strong>Custom DSL objects</strong> like nested <code>"and"/"gte"/"eq"</code> structures work but are verbose and idiosyncratic.</p>
<p><strong>JavaScript functions</strong> are readable but not serializable, not cross-platform, and not safe.</p>
<p>S-expressions give you the expressiveness of code with the safety of data.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="s-expressions-in-orb">S-Expressions in .orb<a href="https://orb.almadar.io/blog/s-expressions-json-functional#s-expressions-in-orb" class="hash-link" aria-label="Direct link to S-Expressions in .orb" title="Direct link to S-Expressions in .orb" translate="no">​</a></h2>
<p>The format is simple: <code>["operator", operand1, operand2, ...]</code>. In .orb, S-expressions appear in two places: guards (conditional logic) and effects (actions).</p>
<div style="margin:2rem 0"><svg viewBox="0 0 800 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-et-2-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="2" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter></defs><line x1="400" y1="74" x2="260" y2="108.5" stroke="var(--color-primary)" stroke-width="1" opacity="0.3"></line><line x1="400" y1="74" x2="540" y2="144" stroke="var(--color-primary)" stroke-width="1" opacity="0.3"></line><rect x="380" y="48" width="40" height="24" rx="4" ry="4" fill="var(--color-primary)" fill-opacity="0.15" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="400" y="61" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">gt</text><circle cx="260" cy="160" r="51.5" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="3 2"></circle><text x="260" y="161" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="10" font-family="inherit" font-weight="normal">@entity.count</text><circle cx="540" cy="160" r="16" fill="none" stroke="var(--color-primary)" stroke-width="1" opacity="0.5"></circle><text x="540" y="161" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="10" font-family="inherit" font-weight="normal">5</text></svg></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="guards">Guards<a href="https://orb.almadar.io/blog/s-expressions-json-functional#guards" class="hash-link" aria-label="Direct link to Guards" title="Direct link to Guards" translate="no">​</a></h3>
<p>A guard is an S-expression that must evaluate to <code>true</code> for a transition to fire:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"pending"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"APPROVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.isFlagged"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.amount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Equivalent JavaScript: <code>if (user.roleLevel &gt;= 5 &amp;&amp; !entity.isFlagged &amp;&amp; entity.amount &gt; 0)</code>. But the S-expression version is serializable, validatable, secure (no eval), and cross-platform.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="effects">Effects<a href="https://orb.almadar.io/blog/s-expressions-json-functional#effects" class="hash-link" aria-label="Direct link to Effects" title="Direct link to Effects" translate="no">​</a></h3>
<p>Effects are S-expressions that run after a guard passes:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approved"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.approvedAt"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@now"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"update"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Order"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p><code>set</code> writes a field. <code>persist</code> saves to the database. <code>emit</code> sends cross-orbital events. <code>render-ui</code> renders a component. <code>notify</code> shows a message. Each is a single array.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="composability">Composability<a href="https://orb.almadar.io/blog/s-expressions-json-functional#composability" class="hash-link" aria-label="Direct link to Composability" title="Direct link to Composability" translate="no">​</a></h2>
<p>S-expressions nest to any depth:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"if"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.score"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"active"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ACHIEVEMENT_UNLOCKED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"KEEP_GOING"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p>The <code>if</code> operator takes a condition, a then-branch, and an else-branch. Each branch can be another S-expression. There is no nesting limit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-binding-context">The Binding Context<a href="https://orb.almadar.io/blog/s-expressions-json-functional#the-binding-context" class="hash-link" aria-label="Direct link to The Binding Context" title="Direct link to The Binding Context" translate="no">​</a></h2>
<p>S-expressions reference runtime data through prefixed bindings:</p>
<table><thead><tr><th>Prefix</th><th>Meaning</th><th>Example</th></tr></thead><tbody><tr><td><code>@entity.field</code></td><td>Current entity field</td><td><code>@entity.status</code></td></tr><tr><td><code>@payload.field</code></td><td>Event payload</td><td><code>@payload.userId</code></td></tr><tr><td><code>@state</code></td><td>Current state name</td><td><code>@state</code></td></tr><tr><td><code>@now</code></td><td>Current timestamp</td><td><code>@now</code></td></tr><tr><td><code>@config.field</code></td><td>App configuration</td><td><code>@config.maxRetries</code></td></tr></tbody></table>
<p>Bindings are validated at compile time. Reference a nonexistent field and <code>orbital validate</code> catches it before any code runs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="standard-operators">Standard Operators<a href="https://orb.almadar.io/blog/s-expressions-json-functional#standard-operators" class="hash-link" aria-label="Direct link to Standard Operators" title="Direct link to Standard Operators" translate="no">​</a></h2>
<p>.orb includes a standard library of operators:</p>
<p><strong>Comparison</strong>: <code>=</code>, <code>!=</code>, <code>&gt;</code>, <code>&gt;=</code>, <code>&lt;</code>, <code>&lt;=</code></p>
<p><strong>Logic</strong>: <code>and</code>, <code>or</code>, <code>not</code></p>
<p><strong>Math</strong>: <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code></p>
<p><strong>Array</strong>: <code>count</code>, <code>contains</code>, <code>filter</code></p>
<p><strong>String</strong>: <code>concat</code>, <code>length</code>, <code>matches</code></p>
<p><strong>Existence</strong>: <code>not-empty</code>, <code>is-null</code></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-real-world-guard">A Real-World Guard<a href="https://orb.almadar.io/blog/s-expressions-json-functional#a-real-world-guard" class="hash-link" aria-label="Direct link to A Real-World Guard" title="Direct link to A Real-World Guard" translate="no">​</a></h2>
<p>Here is a guard for an approval workflow with role-based access, lock checking, and amount limits:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"or"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.roleLevel"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@user.id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.ownerId"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.isLocked"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.amount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.amount"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>This translates to: the user must be either a manager (role level 5+) or the owner. The entity must not be locked. The amount must be between 0 and 10,000. All four conditions enforced declaratively, serializable for audit logs, and validated at compile time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-excel-analogy">The Excel Analogy<a href="https://orb.almadar.io/blog/s-expressions-json-functional#the-excel-analogy" class="hash-link" aria-label="Direct link to The Excel Analogy" title="Direct link to The Excel Analogy" translate="no">​</a></h2>
<p>If you have used Excel formulas, you have used S-expressions:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">=IF(AND(A1&gt;100, B1="active"), "Gold", "Silver")</span><br></span></code></pre></div></div>
<p>In .orb:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"if"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&gt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.score"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"active"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"Gold"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token string" style="color:rgb(255, 121, 198)">"Silver"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><br></span></code></pre></div></div>
<p>Declarative, composable, safe. No arbitrary code execution, no injection risk, no eval.</p>
<p>S-expressions are not a Lisp curiosity. They are a practical, 65-year-old solution to "how do you put logic in data?" that actually works. Explore the full operator list in the <a href="https://orb.almadar.io/docs/stdlib" target="_blank" rel="noopener noreferrer" class="">standard library</a>.</p>]]></content:encoded>
            <category>Architecture</category>
        </item>
        <item>
            <title><![CDATA[Schema-First Development: Why We Write JSON Before TypeScript]]></title>
            <link>https://orb.almadar.io/blog/schema-first-development</link>
            <guid>https://orb.almadar.io/blog/schema-first-development</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[What if you defined your entire application in a single file before writing any component code? Not just the database model, but the state machines, the UI structure, the routes, and the business rules. That is how .orb works: write the schema, validate it, compile it, run it.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBTY2hlbWEgZG9jdW1lbnQgKGxlZnQpIC0tPgogICAgPHJlY3QgeD0iODAiIHk9IjEyMCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSIzNjAiIHJ4PSIxMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgIDwhLS0gU2NoZW1hIGNvbnRlbnQgbGluZXMgLS0+CiAgICA8cmVjdCB4PSIxMDAiIHk9IjE1MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgiIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjgiLz4KICAgIDxyZWN0IHg9IjExMCIgeT0iMTcwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjExMCIgeT0iMTg1IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9IjExMCIgeT0iMjAwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMjI1IiB3aWR0aD0iNzAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuOCIvPgogICAgPHJlY3QgeD0iMTEwIiB5PSIyNDUiIHdpZHRoPSIxMjAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMTEwIiB5PSIyNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI3IiByeD0iMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICA8cmVjdCB4PSIxMDAiIHk9IjI4NSIgd2lkdGg9IjkwIiBoZWlnaHQ9IjgiIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjgiLz4KICAgIDxyZWN0IHg9IjExMCIgeT0iMzA1IiB3aWR0aD0iMTUwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjExMCIgeT0iMzIwIiB3aWR0aD0iMTEwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjExMCIgeT0iMzM1IiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjUiLz4KICAgIDwhLS0gRmxvdyBhcnJvd3MgLS0+CiAgICA8cGF0aCBkPSJNMzIwIDIyMCBDIDM4MCAyMjAsIDM4MCAxODAsIDQ0MCAxODAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDM2LDE3NCA0NDYsMTgwIDQzNiwxODYiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDxwYXRoIGQ9Ik0zMjAgMzAwIEMgMzgwIDMwMCwgMzgwIDMwMCwgNDQwIDMwMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI0MzYsMjk0IDQ0NiwzMDAgNDM2LDMwNiIgZmlsbD0iIzAwMDAwMCIvPgogICAgPHBhdGggZD0iTTMyMCAzODAgQyAzODAgMzgwLCAzODAgNDIwLCA0NDAgNDIwIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjQzNiw0MTQgNDQ2LDQyMCA0MzYsNDI2IiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8IS0tIEdlbmVyYXRlZCBjb2RlIGJsb2NrIDEgKHRvcCByaWdodCkgLS0+CiAgICA8cmVjdCB4PSI0NTAiIHk9IjEzMCIgd2lkdGg9IjI2MCIgaGVpZ2h0PSIxMDAiIHJ4PSI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iNDY1IiB5PSIxNDgiIHdpZHRoPSI2MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC43Ii8+CiAgICA8cmVjdCB4PSI0NzUiIHk9IjE2MiIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSI0NzUiIHk9IjE3NSIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjQ3NSIgeT0iMTg4IiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gR2VuZXJhdGVkIGNvZGUgYmxvY2sgMiAobWlkZGxlIHJpZ2h0KSAtLT4KICAgIDxyZWN0IHg9IjQ1MCIgeT0iMjU1IiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjkwIiByeD0iOCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjQ2NSIgeT0iMjczIiB3aWR0aD0iNzAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iNDc1IiB5PSIyODciIHdpZHRoPSIxMTAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iNDc1IiB5PSIzMDAiIHdpZHRoPSI5MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8IS0tIEdlbmVyYXRlZCBjb2RlIGJsb2NrIDMgKGJvdHRvbSByaWdodCkgLS0+CiAgICA8cmVjdCB4PSI0NTAiIHk9IjM3MCIgd2lkdGg9IjI2MCIgaGVpZ2h0PSIxMDAiIHJ4PSI4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iNDY1IiB5PSIzODgiIHdpZHRoPSI1NSIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC43Ii8+CiAgICA8cmVjdCB4PSI0NzUiIHk9IjQwMiIgd2lkdGg9IjEzMCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSI0NzUiIHk9IjQxNSIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSI0NzUiIHk9IjQyOCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gR2xvdyBvbiBzY2hlbWEgZG9jIC0tPgogICAgPHJlY3QgeD0iODAiIHk9IjEyMCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSIzNjAiIHJ4PSIxMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEiIGZpbHRlcj0idXJsKCNzb2Z0LWdsb3cpIiBvcGFjaXR5PSIwLjMiLz4KICAKPC9nPgogIDxnIGNsYXNzPSJkYXJrLXZhcmlhbnQiPgogIDxkZWZzPgogICAgPGZpbHRlciBpZD0iZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjgiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgICA8ZmlsdGVyIGlkPSJzb2Z0LWdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI0IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogIDwvZGVmcz4KICAKICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSI4MDAiIGhlaWdodD0iNjAwIiBmaWxsPSIjMTExMTE3Ii8+CiAgICA8IS0tIFNjaGVtYSBkb2N1bWVudCAobGVmdCkgLS0+CiAgICA8cmVjdCB4PSI4MCIgeT0iMTIwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjM2MCIgcng9IjEwIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMyIvPgogICAgPCEtLSBTY2hlbWEgY29udGVudCBsaW5lcyAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTUwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuOCIvPgogICAgPHJlY3QgeD0iMTEwIiB5PSIxNzAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMTEwIiB5PSIxODUiIHdpZHRoPSIxMDAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNSIvPgogICAgPHJlY3QgeD0iMTEwIiB5PSIyMDAiIHdpZHRoPSIxNjAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMTAwIiB5PSIyMjUiIHdpZHRoPSI3MCIgaGVpZ2h0PSI4IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC44Ii8+CiAgICA8cmVjdCB4PSIxMTAiIHk9IjI0NSIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI3IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIxMTAiIHk9IjI2MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMjg1IiB3aWR0aD0iOTAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuOCIvPgogICAgPHJlY3QgeD0iMTEwIiB5PSIzMDUiIHdpZHRoPSIxNTAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMTEwIiB5PSIzMjAiIHdpZHRoPSIxMTAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMTEwIiB5PSIzMzUiIHdpZHRoPSIxMzAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNSIvPgogICAgPCEtLSBGbG93IGFycm93cyAtLT4KICAgIDxwYXRoIGQ9Ik0zMjAgMjIwIEMgMzgwIDIyMCwgMzgwIDE4MCwgNDQwIDE4MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI0MzYsMTc0IDQ0NiwxODAgNDM2LDE4NiIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPHBhdGggZD0iTTMyMCAzMDAgQyAzODAgMzAwLCAzODAgMzAwLCA0NDAgMzAwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjQzNiwyOTQgNDQ2LDMwMCA0MzYsMzA2IiBmaWxsPSIjZmZmZmZmIi8+CiAgICA8cGF0aCBkPSJNMzIwIDM4MCBDIDM4MCAzODAsIDM4MCA0MjAsIDQ0MCA0MjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDM2LDQxNCA0NDYsNDIwIDQzNiw0MjYiIGZpbGw9IiNmZmZmZmYiLz4KICAgIDwhLS0gR2VuZXJhdGVkIGNvZGUgYmxvY2sgMSAodG9wIHJpZ2h0KSAtLT4KICAgIDxyZWN0IHg9IjQ1MCIgeT0iMTMwIiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjEwMCIgcng9IjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cmVjdCB4PSI0NjUiIHk9IjE0OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9IjQ3NSIgeT0iMTYyIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjQ3NSIgeT0iMTc1IiB3aWR0aD0iODAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iNDc1IiB5PSIxODgiIHdpZHRoPSIxMjAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBHZW5lcmF0ZWQgY29kZSBibG9jayAyIChtaWRkbGUgcmlnaHQpIC0tPgogICAgPHJlY3QgeD0iNDUwIiB5PSIyNTUiIHdpZHRoPSIyNjAiIGhlaWdodD0iOTAiIHJ4PSI4IiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iNDY1IiB5PSIyNzMiIHdpZHRoPSI3MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC43Ii8+CiAgICA8cmVjdCB4PSI0NzUiIHk9IjI4NyIgd2lkdGg9IjExMCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSI0NzUiIHk9IjMwMCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gR2VuZXJhdGVkIGNvZGUgYmxvY2sgMyAoYm90dG9tIHJpZ2h0KSAtLT4KICAgIDxyZWN0IHg9IjQ1MCIgeT0iMzcwIiB3aWR0aD0iMjYwIiBoZWlnaHQ9IjEwMCIgcng9IjgiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cmVjdCB4PSI0NjUiIHk9IjM4OCIgd2lkdGg9IjU1IiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9IjQ3NSIgeT0iNDAyIiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjQ3NSIgeT0iNDE1IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjQ3NSIgeT0iNDI4IiB3aWR0aD0iODAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBHbG93IG9uIHNjaGVtYSBkb2MgLS0+CiAgICA8cmVjdCB4PSI4MCIgeT0iMTIwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjM2MCIgcng9IjEwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIgZmlsdGVyPSJ1cmwoI3NvZnQtZ2xvdykiIG9wYWNpdHk9IjAuMyIvPgogIAo8L2c+Cjwvc3ZnPg==" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>What if you defined your entire application in a single file before writing any component code? Not just the database model, but the state machines, the UI structure, the routes, and the business rules. That is how .orb works: write the schema, validate it, compile it, run it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-traditional-flow-vs-schema-first">The Traditional Flow vs. Schema-First<a href="https://orb.almadar.io/blog/schema-first-development#the-traditional-flow-vs-schema-first" class="hash-link" aria-label="Direct link to The Traditional Flow vs. Schema-First" title="Direct link to The Traditional Flow vs. Schema-First" translate="no">​</a></h2>
<p>Most frontend development follows this path: design mockups, create components, define TypeScript interfaces, add state management, connect to the backend, discover that the API does not match your types, refactor everything. It is iterative, exploratory, and full of mismatches.</p>
<p>Schema-first inverts it:</p>
<ol>
<li class=""><strong>Define</strong> the .orb program (entities, traits, pages)</li>
<li class=""><strong>Validate</strong> it (<code>orbital validate</code>)</li>
<li class=""><strong>Compile</strong> it (<code>orbital compile</code>)</li>
<li class=""><strong>Run</strong> it immediately</li>
</ol>
<p>The .orb file becomes the single source of truth for your entire application.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-goes-in-a-orb-program">What Goes in a .orb Program<a href="https://orb.almadar.io/blog/schema-first-development#what-goes-in-a-orb-program" class="hash-link" aria-label="Direct link to What Goes in a .orb Program" title="Direct link to What Goes in a .orb Program" translate="no">​</a></h2>
<p>A single .orb file contains the data model, business logic, UI structure, and routes:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-7-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-7-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-7-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">Task</text></g><g opacity="0.7" transform="rotate(0,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(0,239,200)">TaskBrowser</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="326" y1="200" x2="334" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="300" y1="226" x2="300" y2="234" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="274" y1="200" x2="266" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/tasks</text></g></svg></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TaskApp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"orbitals"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"title"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"required"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"values"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"todo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"in-progress"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"done"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"assigneeId"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"relation"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"relation"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"User"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TaskBrowser"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"entity-table"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"columns"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"title"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CREATE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">              </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"form-section"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"title"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"submitEvent"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"cancelEvent"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CANCEL"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"create"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.data"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Creating"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CANCEL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"pages"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TaskListPage"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"path"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/tasks"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>That one file specifies the data model (entity with fields), business logic (state machine with transitions), UI structure (<code>render-ui</code> effects referencing patterns), and routes (pages with paths).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-validation-safety-net">The Validation Safety Net<a href="https://orb.almadar.io/blog/schema-first-development#the-validation-safety-net" class="hash-link" aria-label="Direct link to The Validation Safety Net" title="Direct link to The Validation Safety Net" translate="no">​</a></h2>
<p>Before generating any code, <code>orbital validate</code> checks your program:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ orbital validate task-app.orb</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✓ Schema structure valid</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✓ Entity fields valid</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✓ State machine complete</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✓ All transitions have handlers</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✓ Pattern props match registry</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✓ Closed circuit verified</span><br></span></code></pre></div></div>
<p>If a state renders to a modal but has no exit transition, the validator catches it:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">✗ Error: CIRCUIT_NO_OVERLAY_EXIT</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  State 'Creating' renders to 'modal' slot but has no exit transition.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  Fix: Add a transition from 'Creating' with event 'CANCEL' or 'CLOSE'</span><br></span></code></pre></div></div>
<p>This catches bugs before any code exists. The validator enforces closed circuits (every modal has an exit), emission contracts (every emitted event has a listener), binding validity (every <code>@entity.field</code> reference exists on the entity), and unreachable state detection.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compile-to-any-target">Compile to Any Target<a href="https://orb.almadar.io/blog/schema-first-development#compile-to-any-target" class="hash-link" aria-label="Direct link to Compile to Any Target" title="Direct link to Compile to Any Target" translate="no">​</a></h2>
<p>Once validated, compile to your target language:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile task-app.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> typescript </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> output/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile task-app.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> python </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> output/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile task-app.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> rust </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> output/</span><br></span></code></pre></div></div>
<p>Each target generates frontend components, backend API routes, shared types, state management, and database models. Same .orb program, different output.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-never-edit-generated-code-rule">The "Never Edit Generated Code" Rule<a href="https://orb.almadar.io/blog/schema-first-development#the-never-edit-generated-code-rule" class="hash-link" aria-label="Direct link to The &quot;Never Edit Generated Code&quot; Rule" title="Direct link to The &quot;Never Edit Generated Code&quot; Rule" translate="no">​</a></h2>
<p>You do not edit the generated files. If you need changes, edit the .orb program and recompile. This guarantees consistency (schema and code always match), reproducibility (same schema produces identical output), and portability (compile to different targets from one source).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-schema-first-works-best">When Schema-First Works Best<a href="https://orb.almadar.io/blog/schema-first-development#when-schema-first-works-best" class="hash-link" aria-label="Direct link to When Schema-First Works Best" title="Direct link to When Schema-First Works Best" translate="no">​</a></h2>
<p>Schema-first development excels for new products (start with structure, iterate quickly), scaling teams (the .orb file is readable by PMs, designers, and developers), multi-platform targets (one program generates web, mobile, desktop), regulated industries (the schema is an auditable specification), and AI-assisted development (LLMs are excellent at generating structured JSON).</p>
<p>Ready to write your first .orb program? Check out the <a href="https://orb.almadar.io/docs/getting-started/introduction" target="_blank" rel="noopener noreferrer" class="">Getting Started guide</a>.</p>]]></content:encoded>
            <category>Architecture</category>
            <category>Tutorial</category>
        </item>
        <item>
            <title><![CDATA[Three Execution Models, One Truth: How We Solved the 'Write Once, Run Anywhere' Problem]]></title>
            <link>https://orb.almadar.io/blog/three-execution-models</link>
            <guid>https://orb.almadar.io/blog/three-execution-models</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The same .orb file runs in the browser via an interpreter, compiles to a native Rust binary, and generates production TypeScript or Python code. Three execution models from one source of truth, each optimized for its environment.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBTb3VyY2UgLm9yYiBhdCB0b3AgY2VudGVyIC0tPgogICAgPHBvbHlnb24gcG9pbnRzPSI0MDAsNjAgNDQwLDg1IDQ0MCwxMzUgNDAwLDE2MCAzNjAsMTM1IDM2MCw4NSIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPGNpcmNsZSBjeD0iNDAwIiBjeT0iMTEwIiByPSIxMiIgZmlsbD0iIzAwMDAwMCIvPgogICAgPCEtLSBUaHJlZSBicmFuY2hpbmcgbGluZXMgZG93biAtLT4KICAgIDxsaW5lIHgxPSIzNzAiIHkxPSIxNTUiIHgyPSIxODAiIHkyPSIyNDAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8bGluZSB4MT0iNDAwIiB5MT0iMTYwIiB4Mj0iNDAwIiB5Mj0iMjQwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPGxpbmUgeDE9IjQzMCIgeTE9IjE1NSIgeDI9IjYyMCIgeTI9IjI0MCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDwhLS0gUGF0aCAxOiBJbnRlcnByZXRlZCAobGVmdCkgLS0+CiAgICA8cmVjdCB4PSIxMDAiIHk9IjI1MCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIyNDAiIHJ4PSIxMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iMTIwIiB5PSIyNzAiIHdpZHRoPSI2MCIgaGVpZ2h0PSI4IiByeD0iMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC43Ii8+CiAgICA8IS0tIEJyb3dzZXItbGlrZSBjb250ZW50IC0tPgogICAgPHJlY3QgeD0iMTE1IiB5PSIyOTUiIHdpZHRoPSIxMzAiIGhlaWdodD0iODAiIHJ4PSI2IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPHJlY3QgeD0iMTI1IiB5PSIzMTAiIHdpZHRoPSI1MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIxMjUiIHk9IjMyMiIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjEyNSIgeT0iMzM0IiB3aWR0aD0iNjAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMyIvPgogICAgPHJlY3QgeD0iMTI1IiB5PSIzNDYiIHdpZHRoPSI5MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8Y2lyY2xlIGN4PSIxODAiIGN5PSI0MzAiIHI9IjE4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHBhdGggZD0iTTE3MiA0MzAgTDE4OCA0MzAgTTE4MCA0MjIgTDE4MCA0MzgiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CgogICAgPCEtLSBQYXRoIDI6IENvbXBpbGVkIChjZW50ZXIpIC0tPgogICAgPHJlY3QgeD0iMzIwIiB5PSIyNTAiIHdpZHRoPSIxNjAiIGhlaWdodD0iMjQwIiByeD0iMTAiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxyZWN0IHg9IjM0MCIgeT0iMjcwIiB3aWR0aD0iNjAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNyIvPgogICAgPCEtLSBCaW5hcnktbGlrZSBjb250ZW50IC0tPgogICAgPHJlY3QgeD0iMzM1IiB5PSIyOTUiIHdpZHRoPSIxMzAiIGhlaWdodD0iODAiIHJ4PSI2IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPHJlY3QgeD0iMzQ1IiB5PSIzMTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICA8cmVjdCB4PSIzNDUiIHk9IjMyMiIgd2lkdGg9IjcwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjM0NSIgeT0iMzM0IiB3aWR0aD0iNTUiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzQ1IiB5PSIzNDYiIHdpZHRoPSI4MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cmVjdCB4PSIzNzAiIHk9IjQyMCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjI1IiByeD0iNCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjM4MCIgeT0iNDI4IiB3aWR0aD0iNDAiIGhlaWdodD0iNCIgcng9IjEiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNiIvPgoKICAgIDwhLS0gUGF0aCAzOiBTZXJ2ZXIgKHJpZ2h0KSAtLT4KICAgIDxyZWN0IHg9IjU0MCIgeT0iMjUwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjI0MCIgcng9IjEwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSI1NjAiIHk9IjI3MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjgiIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjciLz4KICAgIDwhLS0gU2VydmVyIHJhY2sgLS0+CiAgICA8cmVjdCB4PSI1NTUiIHk9IjI5NSIgd2lkdGg9IjEzMCIgaGVpZ2h0PSI4MCIgcng9IjYiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgICA8cmVjdCB4PSI1NjUiIHk9IjMwNSIgd2lkdGg9IjExMCIgaGVpZ2h0PSIxNSIgcng9IjMiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgICA8cmVjdCB4PSI1NjUiIHk9IjMyNSIgd2lkdGg9IjExMCIgaGVpZ2h0PSIxNSIgcng9IjMiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgICA8cmVjdCB4PSI1NjUiIHk9IjM0NSIgd2lkdGg9IjExMCIgaGVpZ2h0PSIxNSIgcng9IjMiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIi8+CiAgICA8Y2lyY2xlIGN4PSI1NzUiIGN5PSIzMTIiIHI9IjMiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDxjaXJjbGUgY3g9IjU3NSIgY3k9IjMzMiIgcj0iMyIgZmlsbD0iIzAwMDAwMCIvPgogICAgPGNpcmNsZSBjeD0iNTc1IiBjeT0iMzUyIiByPSIzIiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8Y2lyY2xlIGN4PSI2MjAiIGN5PSI0NDAiIHI9IjE4IiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHJlY3QgeD0iNjEyIiB5PSI0MzUiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxMCIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNSIvPgogIAo8L2c+CiAgPGcgY2xhc3M9ImRhcmstdmFyaWFudCI+CiAgPGRlZnM+CiAgICA8ZmlsdGVyIGlkPSJnbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iOCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9InNvZnQtZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgPC9kZWZzPgogIAogICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiMxMTExMTciLz4KICAgIDwhLS0gU291cmNlIC5vcmIgYXQgdG9wIGNlbnRlciAtLT4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDAwLDYwIDQ0MCw4NSA0NDAsMTM1IDQwMCwxNjAgMzYwLDEzNSAzNjAsODUiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxjaXJjbGUgY3g9IjQwMCIgY3k9IjExMCIgcj0iMTIiIGZpbGw9IiNmZmZmZmYiLz4KICAgIDwhLS0gVGhyZWUgYnJhbmNoaW5nIGxpbmVzIGRvd24gLS0+CiAgICA8bGluZSB4MT0iMzcwIiB5MT0iMTU1IiB4Mj0iMTgwIiB5Mj0iMjQwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjE2MCIgeDI9IjQwMCIgeTI9IjI0MCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxsaW5lIHgxPSI0MzAiIHkxPSIxNTUiIHgyPSI2MjAiIHkyPSIyNDAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8IS0tIFBhdGggMTogSW50ZXJwcmV0ZWQgKGxlZnQpIC0tPgogICAgPHJlY3QgeD0iMTAwIiB5PSIyNTAiIHdpZHRoPSIxNjAiIGhlaWdodD0iMjQwIiByeD0iMTAiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxyZWN0IHg9IjEyMCIgeT0iMjcwIiB3aWR0aD0iNjAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNyIvPgogICAgPCEtLSBCcm93c2VyLWxpa2UgY29udGVudCAtLT4KICAgIDxyZWN0IHg9IjExNSIgeT0iMjk1IiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjgwIiByeD0iNiIgZmlsbD0iIzExMTExNyIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEiLz4KICAgIDxyZWN0IHg9IjEyNSIgeT0iMzEwIiB3aWR0aD0iNTAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMTI1IiB5PSIzMjIiIHdpZHRoPSI4MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC4zIi8+CiAgICA8cmVjdCB4PSIxMjUiIHk9IjMzNCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjMiLz4KICAgIDxyZWN0IHg9IjEyNSIgeT0iMzQ2IiB3aWR0aD0iOTAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuMyIvPgogICAgPGNpcmNsZSBjeD0iMTgwIiBjeT0iNDMwIiByPSIxOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwYXRoIGQ9Ik0xNzIgNDMwIEwxODggNDMwIE0xODAgNDIyIEwxODAgNDM4IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIvPgoKICAgIDwhLS0gUGF0aCAyOiBDb21waWxlZCAoY2VudGVyKSAtLT4KICAgIDxyZWN0IHg9IjMyMCIgeT0iMjUwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjI0MCIgcng9IjEwIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSIzNDAiIHk9IjI3MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjgiIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjciLz4KICAgIDwhLS0gQmluYXJ5LWxpa2UgY29udGVudCAtLT4KICAgIDxyZWN0IHg9IjMzNSIgeT0iMjk1IiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjgwIiByeD0iNiIgZmlsbD0iIzExMTExNyIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEiLz4KICAgIDxyZWN0IHg9IjM0NSIgeT0iMzEwIiB3aWR0aD0iNDAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNSIvPgogICAgPHJlY3QgeD0iMzQ1IiB5PSIzMjIiIHdpZHRoPSI3MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cmVjdCB4PSIzNDUiIHk9IjMzNCIgd2lkdGg9IjU1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjM0NSIgeT0iMzQ2IiB3aWR0aD0iODAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuMyIvPgogICAgPHJlY3QgeD0iMzcwIiB5PSI0MjAiIHdpZHRoPSI2MCIgaGVpZ2h0PSIyNSIgcng9IjQiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cmVjdCB4PSIzODAiIHk9IjQyOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQiIHJ4PSIxIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjYiLz4KCiAgICA8IS0tIFBhdGggMzogU2VydmVyIChyaWdodCkgLS0+CiAgICA8cmVjdCB4PSI1NDAiIHk9IjI1MCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIyNDAiIHJ4PSIxMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNTYwIiB5PSIyNzAiIHdpZHRoPSI2MCIgaGVpZ2h0PSI4IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC43Ii8+CiAgICA8IS0tIFNlcnZlciByYWNrIC0tPgogICAgPHJlY3QgeD0iNTU1IiB5PSIyOTUiIHdpZHRoPSIxMzAiIGhlaWdodD0iODAiIHJ4PSI2IiBmaWxsPSIjMTExMTE3IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPHJlY3QgeD0iNTY1IiB5PSIzMDUiIHdpZHRoPSIxMTAiIGhlaWdodD0iMTUiIHJ4PSIzIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPHJlY3QgeD0iNTY1IiB5PSIzMjUiIHdpZHRoPSIxMTAiIGhlaWdodD0iMTUiIHJ4PSIzIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPHJlY3QgeD0iNTY1IiB5PSIzNDUiIHdpZHRoPSIxMTAiIGhlaWdodD0iMTUiIHJ4PSIzIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMSIvPgogICAgPGNpcmNsZSBjeD0iNTc1IiBjeT0iMzEyIiByPSIzIiBmaWxsPSIjZmZmZmZmIi8+CiAgICA8Y2lyY2xlIGN4PSI1NzUiIGN5PSIzMzIiIHI9IjMiIGZpbGw9IiNmZmZmZmYiLz4KICAgIDxjaXJjbGUgY3g9IjU3NSIgY3k9IjM1MiIgcj0iMyIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPGNpcmNsZSBjeD0iNjIwIiBjeT0iNDQwIiByPSIxOCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjYxMiIgeT0iNDM1IiB3aWR0aD0iMTYiIGhlaWdodD0iMTAiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAKPC9nPgo8L3N2Zz4=" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>The same <code>.orb</code> file runs in the browser via an interpreter, compiles to a native Rust binary, and generates production TypeScript or Python code. Three execution models from one source of truth, each optimized for its environment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-three-models">Why Three Models<a href="https://orb.almadar.io/blog/three-execution-models#why-three-models" class="hash-link" aria-label="Direct link to Why Three Models" title="Direct link to Why Three Models" translate="no">​</a></h2>
<p>Java promised "write once, run anywhere" and delivered "write once, debug everywhere." The problem: different environments need different tradeoffs. Development needs fast iteration. Production needs optimized bundles. Desktop needs native performance. One execution model cannot serve all three well.</p>
<p>.orb solves this with three distinct targets from a single source:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-8-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-8-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-8-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">Task</text></g><g opacity="0.7" transform="rotate(0,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(0,239,200)">TaskBrowser</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="322.5166604983954" y1="213" x2="329.4448637286709" y2="217" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="277.4833395016046" y1="213" x2="270.5551362713291" y2="217" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/tasks</text></g></svg></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-1-typescript-runtime-development">Model 1: TypeScript Runtime (Development)<a href="https://orb.almadar.io/blog/three-execution-models#model-1-typescript-runtime-development" class="hash-link" aria-label="Direct link to Model 1: TypeScript Runtime (Development)" title="Direct link to Model 1: TypeScript Runtime (Development)" translate="no">​</a></h2>
<p>The interpreter reads your .orb file directly and runs it in the browser with hot reload:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital dev task-app.orb</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Opens browser at localhost:3000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Schema changes auto-reload</span><br></span></code></pre></div></div>
<p>Best for: development, IDE preview, testing, educational demos. The state machine runs in memory, UI renders via React components, and events flow through the EventBus. Fast startup, instant feedback.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-2-rust-runtime-native">Model 2: Rust Runtime (Native)<a href="https://orb.almadar.io/blog/three-execution-models#model-2-rust-runtime-native" class="hash-link" aria-label="Direct link to Model 2: Rust Runtime (Native)" title="Direct link to Model 2: Rust Runtime (Native)" translate="no">​</a></h2>
<p>The compiler generates a complete Rust project with Axum for the backend:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile task-app.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> rust </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> native/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> native </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">cargo</span><span class="token plain"> build </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--release</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">./target/release/task-app</span><br></span></code></pre></div></div>
<p>Best for: desktop applications, CLI tools, game clients, embedded systems. The resulting binary is standalone with no runtime dependencies and no Node.js required.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="model-3-generated-code-production">Model 3: Generated Code (Production)<a href="https://orb.almadar.io/blog/three-execution-models#model-3-generated-code-production" class="hash-link" aria-label="Direct link to Model 3: Generated Code (Production)" title="Direct link to Model 3: Generated Code (Production)" translate="no">​</a></h2>
<p>The compiler generates a full project in your target language:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile task-app.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> typescript </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> prod/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile task-app.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> python </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> api/</span><br></span></code></pre></div></div>
<p>Each generates frontend components, backend API routes, shared types, and state management. The output is readable, production-ready code you can deploy directly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-schema-three-targets">One Schema, Three Targets<a href="https://orb.almadar.io/blog/three-execution-models#one-schema-three-targets" class="hash-link" aria-label="Direct link to One Schema, Three Targets" title="Direct link to One Schema, Three Targets" translate="no">​</a></h2>
<p>Here is a minimal .orb program and what each model does with it:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TaskApp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"orbitals"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"title"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"values"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"todo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"done"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TaskBrowser"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"entity-table"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"pages"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TasksPage"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"path"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/tasks"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Run it three ways:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital dev task-app.orb                              </span><span class="token comment" style="color:rgb(98, 114, 164)"># Interpreted (development)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile task-app.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> rust </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> native/   </span><span class="token comment" style="color:rgb(98, 114, 164)"># Native binary</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">orbital compile task-app.orb </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--shell</span><span class="token plain"> typescript </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> web/ </span><span class="token comment" style="color:rgb(98, 114, 164)"># Generated TypeScript</span><br></span></code></pre></div></div>
<p>Same states. Same transitions. Same effects. Different execution targets, each optimized for its environment.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-oir-how-it-works">The OIR: How It Works<a href="https://orb.almadar.io/blog/three-execution-models#the-oir-how-it-works" class="hash-link" aria-label="Direct link to The OIR: How It Works" title="Direct link to The OIR: How It Works" translate="no">​</a></h2>
<p>The compiler parses your .orb file into an Orbital Intermediate Representation (OIR), similar to how LLVM uses IR to decouple source languages from target architectures. The OIR contains resolved entities, normalized traits, flattened pages, and validated state machines. Each target (TypeScript runtime, Rust runtime, code generator) reads from this common format.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="choosing-the-right-model">Choosing the Right Model<a href="https://orb.almadar.io/blog/three-execution-models#choosing-the-right-model" class="hash-link" aria-label="Direct link to Choosing the Right Model" title="Direct link to Choosing the Right Model" translate="no">​</a></h2>
<table><thead><tr><th>Scenario</th><th>Model</th><th>Reason</th></tr></thead><tbody><tr><td>Development</td><td>TypeScript Runtime</td><td>Hot reload, fast feedback</td></tr><tr><td>Desktop app</td><td>Rust Runtime</td><td>Native performance, no dependencies</td></tr><tr><td>Web production</td><td>Generated TypeScript</td><td>Optimized bundle</td></tr><tr><td>API backend</td><td>Generated Python</td><td>FastAPI integration</td></tr><tr><td>CLI tool</td><td>Rust Runtime</td><td>Small, fast binary</td></tr></tbody></table>
<p>The goal is not to run everywhere identically. It is to run well everywhere, with the right tradeoffs for each environment.</p>
<p>Learn more in the <a href="https://orb.almadar.io/docs/getting-started/introduction" target="_blank" rel="noopener noreferrer" class="">Getting Started guide</a>.</p>]]></content:encoded>
            <category>Architecture</category>
        </item>
        <item>
            <title><![CDATA[Game AI in .orb]]></title>
            <link>https://orb.almadar.io/blog/visible-ai-game-design</link>
            <guid>https://orb.almadar.io/blog/visible-ai-game-design</guid>
            <pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In most games, enemy AI is a black box of nested conditionals and random weights. The player reacts to opaque decisions they cannot predict or outthink. In .orb, enemy behavior is a state machine the player can read, reason about, and exploit.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBHYW1lIGNvbnRyb2xsZXIgKGxlZnQpIC0tPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTgwLCAzMDApIj4KICAgICAgPHJlY3QgeD0iLTgwIiB5PSItNDAiIHdpZHRoPSIxNjAiIGhlaWdodD0iODAiIHJ4PSIzMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgICAgPCEtLSBELXBhZCAtLT4KICAgICAgPHJlY3QgeD0iLTUwIiB5PSItOCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjE2IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICAgIDxyZWN0IHg9Ii00MiIgeT0iLTE2IiB3aWR0aD0iMTQiIGhlaWdodD0iMzIiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjUiLz4KICAgICAgPCEtLSBCdXR0b25zIC0tPgogICAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9Ii0xMCIgcj0iNyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC42Ii8+CiAgICAgIDxjaXJjbGUgY3g9IjU1IiBjeT0iMCIgcj0iNyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICAgIDxjaXJjbGUgY3g9IjI1IiBjeT0iMCIgcj0iNyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC41Ii8+CiAgICAgIDxjaXJjbGUgY3g9IjQwIiBjeT0iMTAiIHI9IjciIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPC9nPgogICAgPCEtLSBDb25uZWN0aW9uIGZyb20gY29udHJvbGxlciB0byBzdGF0ZSBtYWNoaW5lIC0tPgogICAgPHBhdGggZD0iTTI2MCAzMDAgQyAzMTAgMzAwLCAzMzAgMjgwLCAzNzAgMjYwIiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtZGFzaGFycmF5PSI4IDQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMzY2LDI1NCAzNzYsMjYwIDM2NiwyNjYiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDwhLS0gU3RhdGUgbWFjaGluZSBub2RlcyAocmlnaHQpIC0tPgogICAgPHJlY3QgeD0iMzgwIiB5PSIxNTAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNTAiIHJ4PSIxMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNDAwIiB5PSIxNjgiIHdpZHRoPSI1MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC42Ii8+CiAgICA8cmVjdCB4PSIzODAiIHk9IjI4MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI1MCIgcng9IjEwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41IiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxyZWN0IHg9IjQwMCIgeT0iMjk4IiB3aWR0aD0iNjAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNiIvPgogICAgPHJlY3QgeD0iMzgwIiB5PSI0MTAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNTAiIHJ4PSIxMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNDAwIiB5PSI0MjgiIHdpZHRoPSI0NSIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC42Ii8+CiAgICA8IS0tIFRyYW5zaXRpb25zIC0tPgogICAgPGxpbmUgeDE9IjQ0MCIgeTE9IjIwMCIgeDI9IjQ0MCIgeTI9IjI3NSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDM0LDI3MSA0NDAsMjgxIDQ0NiwyNzEiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDxsaW5lIHgxPSI0NDAiIHkxPSIzMzAiIHgyPSI0NDAiIHkyPSI0MDUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjQzNCw0MDEgNDQwLDQxMSA0NDYsNDAxIiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8IS0tIFNpZGUgbm9kZSAoZW5lbXkgQUkpIC0tPgogICAgPHJlY3QgeD0iNTgwIiB5PSIyMjUiIHdpZHRoPSIxMzAiIGhlaWdodD0iNTAiIHJ4PSIxMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjYwMCIgeT0iMjQzIiB3aWR0aD0iNTUiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNSIvPgogICAgPGxpbmUgeDE9IjUwMCIgeTE9IjE3NSIgeDI9IjU4MCIgeTI9IjI0MCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxsaW5lIHgxPSI1MDAiIHkxPSIzMDUiIHgyPSI1ODAiIHkyPSIyNjAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIgb3BhY2l0eT0iMC41Ii8+CiAgCjwvZz4KICA8ZyBjbGFzcz0iZGFyay12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iIzExMTExNyIvPgogICAgPCEtLSBHYW1lIGNvbnRyb2xsZXIgKGxlZnQpIC0tPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTgwLCAzMDApIj4KICAgICAgPHJlY3QgeD0iLTgwIiB5PSItNDAiIHdpZHRoPSIxNjAiIGhlaWdodD0iODAiIHJ4PSIzMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgICAgPCEtLSBELXBhZCAtLT4KICAgICAgPHJlY3QgeD0iLTUwIiB5PSItOCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjE2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgICAgIDxyZWN0IHg9Ii00MiIgeT0iLTE2IiB3aWR0aD0iMTQiIGhlaWdodD0iMzIiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjUiLz4KICAgICAgPCEtLSBCdXR0b25zIC0tPgogICAgICA8Y2lyY2xlIGN4PSI0MCIgY3k9Ii0xMCIgcj0iNyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+CiAgICAgIDxjaXJjbGUgY3g9IjU1IiBjeT0iMCIgcj0iNyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgICAgIDxjaXJjbGUgY3g9IjI1IiBjeT0iMCIgcj0iNyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgICAgIDxjaXJjbGUgY3g9IjQwIiBjeT0iMTAiIHI9IjciIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPC9nPgogICAgPCEtLSBDb25uZWN0aW9uIGZyb20gY29udHJvbGxlciB0byBzdGF0ZSBtYWNoaW5lIC0tPgogICAgPHBhdGggZD0iTTI2MCAzMDAgQyAzMTAgMzAwLCAzMzAgMjgwLCAzNzAgMjYwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41IiBzdHJva2UtZGFzaGFycmF5PSI4IDQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMzY2LDI1NCAzNzYsMjYwIDM2NiwyNjYiIGZpbGw9IiNmZmZmZmYiLz4KICAgIDwhLS0gU3RhdGUgbWFjaGluZSBub2RlcyAocmlnaHQpIC0tPgogICAgPHJlY3QgeD0iMzgwIiB5PSIxNTAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNTAiIHJ4PSIxMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNDAwIiB5PSIxNjgiIHdpZHRoPSI1MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+CiAgICA8cmVjdCB4PSIzODAiIHk9IjI4MCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI1MCIgcng9IjEwIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41IiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxyZWN0IHg9IjQwMCIgeT0iMjk4IiB3aWR0aD0iNjAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNiIvPgogICAgPHJlY3QgeD0iMzgwIiB5PSI0MTAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNTAiIHJ4PSIxMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNDAwIiB5PSI0MjgiIHdpZHRoPSI0NSIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+CiAgICA8IS0tIFRyYW5zaXRpb25zIC0tPgogICAgPGxpbmUgeDE9IjQ0MCIgeTE9IjIwMCIgeDI9IjQ0MCIgeTI9IjI3NSIgc3Ryb2tlPSIjZjVmNWY1IiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNDM0LDI3MSA0NDAsMjgxIDQ0NiwyNzEiIGZpbGw9IiNmNWY1ZjUiLz4KICAgIDxsaW5lIHgxPSI0NDAiIHkxPSIzMzAiIHgyPSI0NDAiIHkyPSI0MDUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjQzNCw0MDEgNDQwLDQxMSA0NDYsNDAxIiBmaWxsPSIjZjVmNWY1Ii8+CiAgICA8IS0tIFNpZGUgbm9kZSAoZW5lbXkgQUkpIC0tPgogICAgPHJlY3QgeD0iNTgwIiB5PSIyMjUiIHdpZHRoPSIxMzAiIGhlaWdodD0iNTAiIHJ4PSIxMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxyZWN0IHg9IjYwMCIgeT0iMjQzIiB3aWR0aD0iNTUiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNSIvPgogICAgPGxpbmUgeDE9IjUwMCIgeTE9IjE3NSIgeDI9IjU4MCIgeTI9IjI0MCIgc3Ryb2tlPSIjZjVmNWY1IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxsaW5lIHgxPSI1MDAiIHkxPSIzMDUiIHgyPSI1ODAiIHkyPSIyNjAiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIgb3BhY2l0eT0iMC41Ii8+CiAgCjwvZz4KPC9zdmc+" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>In most games, enemy AI is a black box of nested conditionals and random weights. The player reacts to opaque decisions they cannot predict or outthink. In .orb, enemy behavior is a state machine the player can read, reason about, and exploit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-black-box-problem">The Black Box Problem<a href="https://orb.almadar.io/blog/visible-ai-game-design#the-black-box-problem" class="hash-link" aria-label="Direct link to The Black Box Problem" title="Direct link to The Black Box Problem" translate="no">​</a></h2>
<p>Traditional game AI looks like this under the hood:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">decide_action</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">enemy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> player</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> enemy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">hp </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">30</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> random</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">0.6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"flee"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"desperate_attack"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">elif</span><span class="token plain"> distance</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">enemy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> player</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">&lt;</span><span class="token plain"> </span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"melee_attack"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"approach"</span><br></span></code></pre></div></div>
<p>Random weights, invisible conditions, no way for the player to engage strategically. Wins feel lucky, losses feel unfair.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="enemy-behavior-as-a-state-machine">Enemy Behavior as a State Machine<a href="https://orb.almadar.io/blog/visible-ai-game-design#enemy-behavior-as-a-state-machine" class="hash-link" aria-label="Direct link to Enemy Behavior as a State Machine" title="Direct link to Enemy Behavior as a State Machine" translate="no">​</a></h2>
<p>In .orb, an enemy's AI is a trait with explicit states and transitions. Here is a Berserker enemy:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-sm-5-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><linearGradient id="avl-sm-5-grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.1"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0.05"></stop></linearGradient></defs><style>
          @keyframes avl-sm-dash { from { stroke-dashoffset: 20; } to { stroke-dashoffset: 0; } }
        </style><circle cx="300" cy="200" r="180" fill="url(#avl-sm-5-grad)"></circle><g><g opacity="0.7"><defs><marker id="avl-tr-25-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M343.1335136523794,57.071067811865476 Q405.28284271247463,99.5254833995939 421.00862197135154,173.12994231491118" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-25-arrow)"></path></g><text x="389.12346314604054" y="69.26131316480966" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">SPOT_PLAYER</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-26-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M423.83704909609776,224.04163056034264 Q408.11126983722085,297.64608947565995 345.9619407771256,340.10050506338837" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-26-arrow)"></path></g><text x="423.10193359837564" y="281.48670990922585" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">IN_RANGE</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-27-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M343.1335136523794,342.9289321881345 Q405.28284271247463,300.4745166004061 421.00862197135154,226.87005768508882" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-27-arrow)"></path></g><text x="389.12346314604054" y="330.7386868351903" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">OUT_OF_RANGE</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-28-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M265.3517677218592,334.44365081389594 Q203.20243866176398,291.9892352261675 187.47665940288704,218.38477631085027" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-28-arrow)"></path></g><text x="227.84709960243657" y="313.7681240867132" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">LOW_HP</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-29-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M423.83704909609776,175.95836943965736 Q408.11126983722085,102.3539105243401 345.9619407771256,59.899494936611674" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-29-arrow)"></path></g><text x="423.10193359837564" y="118.51329009077415" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">LOST_SIGHT</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-30-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M184.64823227814082,184.44365081389597 Q200.37401153701774,110.83919189857868 262.52334059711296,68.38477631085024" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-30-arrow)"></path></g><text x="193.86862915010153" y="135.4838528392513" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">SAFE_DISTANCE</text></g><g opacity="1" transform="translate(255,32)"><circle cx="-16" cy="18" r="6" fill="var(--color-primary)"></circle><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">Patrol</text></g><g opacity="1" transform="translate(405,182)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">Chase</text></g><g opacity="1" transform="translate(255,332)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">Attack</text></g><g opacity="1" transform="translate(105,182.00000000000003)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">Flee</text></g></svg></div>
<p>The corresponding .orb trait definition:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"BerserkerAI"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Patrol"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Chase"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Attack"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Flee"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"events"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SPOT_PLAYER"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Spot Player"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"IN_RANGE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"In Range"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OUT_OF_RANGE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Out of Range"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LOW_HP"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Low HP"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LOST_SIGHT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Lost Sight"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAFE_DISTANCE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Safe Distance"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Patrol"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Chase"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SPOT_PLAYER"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.baseSpeed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1.5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Chase"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Attack"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"IN_RANGE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.attackMultiplier"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1.5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.defenseMultiplier"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.8</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Attack"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Flee"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LOW_HP"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.hp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.maxHp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.25</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.baseSpeed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">2.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.defenseMultiplier"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.4</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Attack"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Chase"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"OUT_OF_RANGE"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Chase"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Patrol"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LOST_SIGHT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.baseSpeed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.attackMultiplier"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Flee"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Patrol"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAFE_DISTANCE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.hp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"+"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.hp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.maxHp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.defenseMultiplier"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">1.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-player-sees">What the Player Sees<a href="https://orb.almadar.io/blog/visible-ai-game-design#what-the-player-sees" class="hash-link" aria-label="Direct link to What the Player Sees" title="Direct link to What the Player Sees" translate="no">​</a></h2>
<p>The state machine is visible in-game. The player knows:</p>
<ul>
<li class=""><strong>Patrol</strong>: Normal stats, predictable path. Safe to approach.</li>
<li class=""><strong>Chase</strong>: 1.5x speed. The enemy is coming.</li>
<li class=""><strong>Attack</strong>: 1.5x attack, 0.8x defense. Dangerous but fragile.</li>
<li class=""><strong>Flee</strong>: Triggers below 25% HP. 2x speed, 0.4x defense. A glass cannon running away. Chase and finish, or let it escape and heal 10%.</li>
</ul>
<p>Every transition has a trigger the player can see and a consequence they can plan around. Combat becomes strategy: manipulate the enemy into Attack, exploit the 0.8x defense window, keep pressure to prevent the Flee-to-heal loop.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="guards-make-it-deterministic">Guards Make It Deterministic<a href="https://orb.almadar.io/blog/visible-ai-game-design#guards-make-it-deterministic" class="hash-link" aria-label="Direct link to Guards Make It Deterministic" title="Direct link to Guards Make It Deterministic" translate="no">​</a></h2>
<p>The <code>LOW_HP</code> transition has a guard: <code>["&lt;", "@entity.hp", ["*", "@entity.maxHp", 0.25]]</code>. The enemy flees only when HP drops below 25% of max. No randomness. The player can calculate exactly when the transition fires and plan their burst damage to finish the enemy before it flees.</p>
<p>Guards also enable tiered behavior. A stronger variant of the Berserker could have:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Attack"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Flee"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"LOW_HP"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.hp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"*"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.maxHp"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0.10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Same state machine structure, different threshold. The player reads the trait and adjusts strategy accordingly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="trait-composition-creates-depth">Trait Composition Creates Depth<a href="https://orb.almadar.io/blog/visible-ai-game-design#trait-composition-creates-depth" class="hash-link" aria-label="Direct link to Trait Composition Creates Depth" title="Direct link to Trait Composition Creates Depth" translate="no">​</a></h2>
<p>A single trait is simple: 4 states, 6 transitions. But units equip multiple traits. A Berserker with a <code>VampireTrait</code> (heals on damage dealt) creates a different tactical problem than one with a <code>ShieldTrait</code> (absorbs a burst of damage before breaking).</p>
<p>The traits compose through events. <code>VampireTrait</code> listens for <code>DEAL_DAMAGE</code> and heals. <code>ShieldTrait</code> listens for <code>INCOMING_ATTACK</code> and absorbs. Neither trait references the other. The player reads both state machines on the unit and plans against the combination.</p>
<p>This is the core advantage of modeling game AI in .orb: behavior is explicit, composable, and readable. The .orb compiler validates that every state is reachable, every event has a handler, and every emit has a listener. The game designer gets correctness guarantees. The player gets a system they can understand and master.</p>
<p>No black boxes. No random weights. Just state machines.</p>]]></content:encoded>
            <category>Gaming</category>
            <category>State Machines</category>
            <category>Game Design</category>
        </item>
        <item>
            <title><![CDATA[Machines with Traits: How Almadar Will Transform Robotics]]></title>
            <link>https://orb.almadar.io/blog/machines-with-traits-part-1</link>
            <guid>https://orb.almadar.io/blog/machines-with-traits-part-1</guid>
            <pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Programming a robot today means writing thousands of lines of tangled imperative code where every new condition doubles the complexity, hidden state transitions breed bugs, and documentation drifts from reality within weeks. .orb takes a different approach: declare machine behavior as composable traits with explicit states, guarded transitions, and structured effects.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBDZW50cmFsIEVudGl0eSAtLT4KICAgIDxyZWN0IHg9IjMwMCIgeT0iMjMwIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjEwMCIgcng9IjYiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSI0IiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxyZWN0IHg9IjMyMCIgeT0iMjUyIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuOCIvPgogICAgPHJlY3QgeD0iMzIwIiB5PSIyNjgiIHdpZHRoPSIxNDAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzIwIiB5PSIyODIiIHdpZHRoPSIxMDAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzIwIiB5PSIyOTYiIHdpZHRoPSIxMjAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBDb25uZWN0aW9uIGxpbmVzIHRvIHRyYWl0cyAtLT4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSIyNjAiIHgyPSIxNjAiIHkyPSIxNjAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNSIvPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjIzMCIgeDI9IjQwMCIgeTI9IjEzMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC41Ii8+CiAgICA8bGluZSB4MT0iNTAwIiB5MT0iMjYwIiB4Mj0iNjQwIiB5Mj0iMTYwIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNSAzIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSIzMTAiIHgyPSIxNjAiIHkyPSI0MjAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNSIvPgogICAgPGxpbmUgeDE9IjUwMCIgeTE9IjMxMCIgeDI9IjY0MCIgeTI9IjQyMCIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC41Ii8+CiAgICA8IS0tIFRyYWl0IDEgKHRvcC1sZWZ0KSAtLT4KICAgIDxyZWN0IHg9IjYwIiB5PSIxMjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNTUiIHJ4PSIyMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iODUiIHk9IjE0MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9Ijg1IiB5PSIxNTMiIHdpZHRoPSI5MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIFRyYWl0IDIgKHRvcC1jZW50ZXIpIC0tPgogICAgPHJlY3QgeD0iMzMwIiB5PSI4MCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSI1NSIgcng9IjIwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSIzNTUiIHk9IjEwMCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9IjM1NSIgeT0iMTEzIiB3aWR0aD0iODAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuMyIvPgogICAgPCEtLSBUcmFpdCAzICh0b3AtcmlnaHQpIC0tPgogICAgPHJlY3QgeD0iNjAwIiB5PSIxMjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNTUiIHJ4PSIyMCIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNjI1IiB5PSIxNDAiIHdpZHRoPSI1NSIgaGVpZ2h0PSI3IiByeD0iMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC43Ii8+CiAgICA8cmVjdCB4PSI2MjUiIHk9IjE1MyIgd2lkdGg9Ijg1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDwhLS0gVHJhaXQgNCAoYm90dG9tLWxlZnQpIC0tPgogICAgPHJlY3QgeD0iNjAiIHk9IjQwMCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSI1NSIgcng9IjIwIiBmaWxsPSIjZjVmNWY1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSI4NSIgeT0iNDIwIiB3aWR0aD0iNjUiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iODUiIHk9IjQzMyIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDwhLS0gVHJhaXQgNSAoYm90dG9tLXJpZ2h0KSAtLT4KICAgIDxyZWN0IHg9IjYwMCIgeT0iNDAwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjU1IiByeD0iMjAiIGZpbGw9IiNmNWY1ZjUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxyZWN0IHg9IjYyNSIgeT0iNDIwIiB3aWR0aD0iNzUiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iNjI1IiB5PSI0MzMiIHdpZHRoPSI5MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgCjwvZz4KICA8ZyBjbGFzcz0iZGFyay12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iIzExMTExNyIvPgogICAgPCEtLSBDZW50cmFsIEVudGl0eSAtLT4KICAgIDxyZWN0IHg9IjMwMCIgeT0iMjMwIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjEwMCIgcng9IjYiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI0IiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxyZWN0IHg9IjMyMCIgeT0iMjUyIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuOCIvPgogICAgPHJlY3QgeD0iMzIwIiB5PSIyNjgiIHdpZHRoPSIxNDAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzIwIiB5PSIyODIiIHdpZHRoPSIxMDAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzIwIiB5PSIyOTYiIHdpZHRoPSIxMjAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNCIvPgogICAgPCEtLSBDb25uZWN0aW9uIGxpbmVzIHRvIHRyYWl0cyAtLT4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSIyNjAiIHgyPSIxNjAiIHkyPSIxNjAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNSIvPgogICAgPGxpbmUgeDE9IjQwMCIgeTE9IjIzMCIgeDI9IjQwMCIgeTI9IjEzMCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC41Ii8+CiAgICA8bGluZSB4MT0iNTAwIiB5MT0iMjYwIiB4Mj0iNjQwIiB5Mj0iMTYwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWRhc2hhcnJheT0iNSAzIiBvcGFjaXR5PSIwLjUiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSIzMTAiIHgyPSIxNjAiIHkyPSI0MjAiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtZGFzaGFycmF5PSI1IDMiIG9wYWNpdHk9IjAuNSIvPgogICAgPGxpbmUgeDE9IjUwMCIgeTE9IjMxMCIgeDI9IjY0MCIgeTI9IjQyMCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1kYXNoYXJyYXk9IjUgMyIgb3BhY2l0eT0iMC41Ii8+CiAgICA8IS0tIFRyYWl0IDEgKHRvcC1sZWZ0KSAtLT4KICAgIDxyZWN0IHg9IjYwIiB5PSIxMjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNTUiIHJ4PSIyMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iODUiIHk9IjE0MCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9Ijg1IiB5PSIxNTMiIHdpZHRoPSI5MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIFRyYWl0IDIgKHRvcC1jZW50ZXIpIC0tPgogICAgPHJlY3QgeD0iMzMwIiB5PSI4MCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSI1NSIgcng9IjIwIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSIzNTUiIHk9IjEwMCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9IjM1NSIgeT0iMTEzIiB3aWR0aD0iODAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuMyIvPgogICAgPCEtLSBUcmFpdCAzICh0b3AtcmlnaHQpIC0tPgogICAgPHJlY3QgeD0iNjAwIiB5PSIxMjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNTUiIHJ4PSIyMCIgZmlsbD0iIzI4MjgyZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIuNSIvPgogICAgPHJlY3QgeD0iNjI1IiB5PSIxNDAiIHdpZHRoPSI1NSIgaGVpZ2h0PSI3IiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC43Ii8+CiAgICA8cmVjdCB4PSI2MjUiIHk9IjE1MyIgd2lkdGg9Ijg1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjMiLz4KICAgIDwhLS0gVHJhaXQgNCAoYm90dG9tLWxlZnQpIC0tPgogICAgPHJlY3QgeD0iNjAiIHk9IjQwMCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSI1NSIgcng9IjIwIiBmaWxsPSIjMjgyODJlIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cmVjdCB4PSI4NSIgeT0iNDIwIiB3aWR0aD0iNjUiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iODUiIHk9IjQzMyIgd2lkdGg9IjgwIiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjMiLz4KICAgIDwhLS0gVHJhaXQgNSAoYm90dG9tLXJpZ2h0KSAtLT4KICAgIDxyZWN0IHg9IjYwMCIgeT0iNDAwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjU1IiByeD0iMjAiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxyZWN0IHg9IjYyNSIgeT0iNDIwIiB3aWR0aD0iNzUiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iNjI1IiB5PSI0MzMiIHdpZHRoPSI5MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC4zIi8+CiAgCjwvZz4KPC9zdmc+" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>Programming a robot today means writing thousands of lines of tangled imperative code where every new condition doubles the complexity, hidden state transitions breed bugs, and documentation drifts from reality within weeks. .orb takes a different approach: declare machine behavior as composable traits with explicit states, guarded transitions, and structured effects.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-with-imperative-robot-code">The Problem with Imperative Robot Code<a href="https://orb.almadar.io/blog/machines-with-traits-part-1#the-problem-with-imperative-robot-code" class="hash-link" aria-label="Direct link to The Problem with Imperative Robot Code" title="Direct link to The Problem with Imperative Robot Code" translate="no">​</a></h2>
<p>A traditional robotic arm controller looks something like this:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">RobotArm</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">move_to</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> target</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">error_state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">handle_error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Where is this defined?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">is_holding </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">and</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">weight </span><span class="token operator">&gt;</span><span class="token plain"> MAX_WEIGHT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            self</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">emergency_stop</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># What happens after?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token comment" style="color:rgb(98, 114, 164)"># ... hundreds more lines of nested conditions</span><br></span></code></pre></div></div>
<p>Every new condition adds branches. Missing a state creates a hidden bug. Testing all paths becomes combinatorially expensive. The code says one thing, the documentation says another.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-robotic-arm-in-orb">A Robotic Arm in .orb<a href="https://orb.almadar.io/blog/machines-with-traits-part-1#a-robotic-arm-in-orb" class="hash-link" aria-label="Direct link to A Robotic Arm in .orb" title="Direct link to A Robotic Arm in .orb" translate="no">​</a></h2>
<p>The same arm, modeled with .orb, declares every state and transition explicitly:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-ou-2-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><radialGradient id="avl-ou-2-grad" cx="50%" cy="50%" r="50%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.08"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0"></stop></radialGradient></defs><style>
          @keyframes avl-ou-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
        </style><circle cx="300" cy="200" r="150" fill="url(#avl-ou-2-grad)"></circle><g opacity="1"><circle cx="300" cy="200" r="130" fill="none" stroke="var(--color-primary)" stroke-width="2"></circle><circle cx="300" cy="200" r="130" fill="var(--color-primary)" opacity="0.03"></circle><text x="300" y="62" text-anchor="middle" fill="var(--color-primary)" font-size="11" font-family="inherit" font-weight="bold">Arm</text></g><g opacity="0.7" transform="rotate(0,300,200)"><ellipse cx="300" cy="200" rx="55" ry="24" fill="none" stroke="var(--color-primary)" stroke-width="1.5" stroke-dasharray="4 2"></ellipse><text x="239" y="200" text-anchor="end" dominant-baseline="central" fill="var(--color-primary)" font-size="9" font-family="inherit" opacity="0.8" transform="rotate(0,239,200)">MovementTrait</text></g><g opacity="1"><circle cx="300" cy="200" r="24" fill="var(--color-primary)" opacity="0.15"></circle><circle cx="300" cy="200" r="24" fill="none" stroke="var(--color-primary)" stroke-width="2.5"></circle><line x1="300" y1="174" x2="300" y2="166" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="326" y1="200" x2="334" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="300" y1="226" x2="300" y2="234" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line><line x1="274" y1="200" x2="266" y2="200" stroke="var(--color-primary)" stroke-width="1" opacity="0.6"></line></g><g opacity="1"><rect x="360" y="82.41669750802298" width="10" height="10" fill="var(--color-primary)" opacity="0.3" stroke="var(--color-primary)" stroke-width="1.5"></rect><text x="365" y="104.41669750802298" text-anchor="middle" fill="var(--color-primary)" font-size="8" font-family="inherit">/control</text></g></svg></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Arm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"persistence"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"runtime"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"position"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"number"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"isHolding"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"boolean"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"weight"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"number"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"default"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token number">0</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"MovementTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Arm"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"moving"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"holding"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"moving"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"MOVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"and"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"not"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.isHolding"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">100</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"MOVEMENT_STARTED"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"target"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.target"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"moving"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"STOP"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"holding"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GRAB"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"guard"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"&lt;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.weight"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">50</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.isHolding"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.weight"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.weight"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"holding"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"RELEASE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.isHolding"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.weight"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"idle"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMERGENCY"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMERGENCY_STOP"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"reason"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.reason"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"moving"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMERGENCY"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMERGENCY_STOP"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"reason"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.reason"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"holding"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"error"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMERGENCY"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"set"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.speed"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EMERGENCY_STOP"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"reason"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.reason"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Four states: idle, moving, holding, error. Every transition is defined. The MOVE guard prevents movement while holding an object and caps speed at 100. The GRAB guard prevents grabbing anything heavier than 50 units. Emergency transitions exist from every operational state to error.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="composing-traits-for-complex-machines">Composing Traits for Complex Machines<a href="https://orb.almadar.io/blog/machines-with-traits-part-1#composing-traits-for-complex-machines" class="hash-link" aria-label="Direct link to Composing Traits for Complex Machines" title="Direct link to Composing Traits for Complex Machines" translate="no">​</a></h2>
<p>A delivery robot needs navigation, package handling, and customer notification. In .orb, these are separate orbitals that communicate through events:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"DeliveryRobot"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"orbitals"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Navigation"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"NavState"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"persistence"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"runtime"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"position"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"destination"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"object"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"GPSTrait"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"NavState"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"ObstacleAvoidance"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"NavState"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Delivery"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Package"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"persistence"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"runtime"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"status"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"enum"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"values"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"loaded"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"in_transit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"delivered"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PackageHandling"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Package"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                   </span><span class="token property">"emits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"DELIVERY_COMPLETE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"scope"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"external"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Communication"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Notification"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"persistence"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"runtime"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"fields"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"message"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"string"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token property">"traits"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CustomerNotification"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Notification"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                   </span><span class="token property">"listens"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"DELIVERY_COMPLETE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"scope"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"external"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Three orbitals, each managing its own concern. When Delivery emits <code>DELIVERY_COMPLETE</code>, Communication listens and sends confirmation to the customer automatically. No orchestration code. No message bus configuration. Just <code>emits</code> and <code>listens</code> declarations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-works-for-robotics">Why This Works for Robotics<a href="https://orb.almadar.io/blog/machines-with-traits-part-1#why-this-works-for-robotics" class="hash-link" aria-label="Direct link to Why This Works for Robotics" title="Direct link to Why This Works for Robotics" translate="no">​</a></h2>
<table><thead><tr><th>Need</th><th>How .orb addresses it</th></tr></thead><tbody><tr><td>Reliability</td><td>Every state and transition is explicit, no hidden paths</td></tr><tr><td>Safety</td><td>Guards prevent impossible actions at the state machine level</td></tr><tr><td>Documentation</td><td>The .orb file is the documentation, they cannot drift apart</td></tr><tr><td>Composability</td><td>Flat trait composition, independently testable behaviors</td></tr><tr><td>Validation</td><td><code>orbital validate</code> catches unreachable states and unhandled events at compile time</td></tr></tbody></table>
<p>The .orb program is the specification, the documentation, and the runtime behavior. One artifact, not three that drift apart over time.</p>
<p>Get started with the <a href="https://orb.almadar.io/docs/getting-started/introduction" target="_blank" rel="noopener noreferrer" class="">Getting Started guide</a>.</p>]]></content:encoded>
            <category>Robotics</category>
            <category>Vision</category>
            <category>Automation</category>
            <category>State Machines</category>
        </item>
        <item>
            <title><![CDATA[Understanding State Machines in .orb]]></title>
            <link>https://orb.almadar.io/blog/understanding-state-machines</link>
            <guid>https://orb.almadar.io/blog/understanding-state-machines</guid>
            <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[State machines are the foundation of every .orb program. Every trait contains one, and the compiler enforces that they are well-formed. This post explains what a state machine is in .orb and walks through a concrete example.]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4MDAgNjAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxzdHlsZT4KICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBibG9jazsgfQogICAgICAuZGFyay12YXJpYW50IHsgZGlzcGxheTogbm9uZTsgfQogICAgICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAgICAgLmxpZ2h0LXZhcmlhbnQgeyBkaXNwbGF5OiBub25lOyB9CiAgICAgICAgLmRhcmstdmFyaWFudCB7IGRpc3BsYXk6IGJsb2NrOyB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9kZWZzPgogIDxnIGNsYXNzPSJsaWdodC12YXJpYW50Ij4KICA8ZGVmcz4KICAgIDxmaWx0ZXIgaWQ9Imdsb3ciIHg9Ii0yMCUiIHk9Ii0yMCUiIHdpZHRoPSIxNDAlIiBoZWlnaHQ9IjE0MCUiPgogICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSI4IiByZXN1bHQ9ImJsdXIiIC8+CiAgICAgIDxmZU1lcmdlPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iYmx1ciIgLz4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49IlNvdXJjZUdyYXBoaWMiIC8+CiAgICAgIDwvZmVNZXJnZT4KICAgIDwvZmlsdGVyPgogICAgPGZpbHRlciBpZD0ic29mdC1nbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iNCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICA8L2RlZnM+CiAgCiAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIvPgogICAgPCEtLSBTdGF0ZTogSWRsZSAtLT4KICAgIDxyZWN0IHg9IjgwIiB5PSIyNTAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNjAiIHJ4PSIxMiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgIDxyZWN0IHg9IjEwNSIgeT0iMjcwIiB3aWR0aD0iNTAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iMTA1IiB5PSIyODMiIHdpZHRoPSI4MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIEVudHJ5IGFycm93IC0tPgogICAgPGxpbmUgeDE9IjMwIiB5MT0iMjgwIiB4Mj0iNzUiIHkyPSIyODAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyLjUiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iNzIsMjc0IDgyLDI4MCA3MiwyODYiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDwhLS0gVHJhbnNpdGlvbjogSWRsZSAtPiBBY3RpdmUgLS0+CiAgICA8cGF0aCBkPSJNMjIwIDI2MCBRIDMxMCAxODAgMzgwIDIyMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMzc2LDIxNSAzODUsMjIyIDM3NSwyMjYiIGZpbGw9IiMwMDAwMDAiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMTkwIiB3aWR0aD0iNTAiIGhlaWdodD0iNiIgcng9IjIiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNiIvPgogICAgPCEtLSBTdGF0ZTogQWN0aXZlIC0tPgogICAgPHJlY3QgeD0iMzMwIiB5PSIyMTAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNjAiIHJ4PSIxMiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiIGZpbHRlcj0idXJsKCNnbG93KSIvPgogICAgPHJlY3QgeD0iMzU1IiB5PSIyMzAiIHdpZHRoPSI2MCIgaGVpZ2h0PSI3IiByeD0iMyIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC43Ii8+CiAgICA8cmVjdCB4PSIzNTUiIHk9IjI0MyIgd2lkdGg9Ijg1IiBoZWlnaHQ9IjUiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjMiLz4KICAgIDwhLS0gVHJhbnNpdGlvbjogQWN0aXZlIC0+IENvbXBsZXRlIC0tPgogICAgPHBhdGggZD0iTTQ3MCAyNTAgUSA1NTAgMjAwIDU5MCAyNTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjU4NiwyNDUgNTk1LDI1MiA1ODYsMjU2IiBmaWxsPSIjMDAwMDAwIi8+CiAgICA8cmVjdCB4PSI1MTAiIHk9IjIxMCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjMDAwMDAwIiBvcGFjaXR5PSIwLjYiLz4KICAgIDwhLS0gU3RhdGU6IENvbXBsZXRlIC0tPgogICAgPHJlY3QgeD0iNTgwIiB5PSIyNTAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNjAiIHJ4PSIxMiIgZmlsbD0iI2Y1ZjVmNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjMiLz4KICAgIDxyZWN0IHg9IjYwNSIgeT0iMjcwIiB3aWR0aD0iNzAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iNjA1IiB5PSIyODMiIHdpZHRoPSI1MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIFRlcm1pbmFsIGRvdWJsZS1ib3JkZXIgLS0+CiAgICA8cmVjdCB4PSI1NzYiIHk9IjI0NiIgd2lkdGg9IjE0OCIgaGVpZ2h0PSI2OCIgcng9IjE1IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMS41IiBvcGFjaXR5PSIwLjQiLz4KICAgIDwhLS0gUmVzZXQ6IENvbXBsZXRlIC0+IElkbGUgLS0+CiAgICA8cGF0aCBkPSJNNTgwIDMwNSBRIDQwMCA0MjAgMjIwIDMwNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWRhc2hhcnJheT0iNiA0IiBvcGFjaXR5PSIwLjQiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMjI0LDMwMCAyMTgsMzEwIDIyOCwzMDgiIGZpbGw9IiMwMDAwMDAiIG9wYWNpdHk9IjAuNCIvPgogICAgPHJlY3QgeD0iMzgwIiB5PSIzOTUiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iIzAwMDAwMCIgb3BhY2l0eT0iMC4yNSIvPgogIAo8L2c+CiAgPGcgY2xhc3M9ImRhcmstdmFyaWFudCI+CiAgPGRlZnM+CiAgICA8ZmlsdGVyIGlkPSJnbG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTQwJSIgaGVpZ2h0PSIxNDAlIj4KICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iOCIgcmVzdWx0PSJibHVyIiAvPgogICAgICA8ZmVNZXJnZT4KICAgICAgICA8ZmVNZXJnZU5vZGUgaW49ImJsdXIiIC8+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIiAvPgogICAgICA8L2ZlTWVyZ2U+CiAgICA8L2ZpbHRlcj4KICAgIDxmaWx0ZXIgaWQ9InNvZnQtZ2xvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE0MCUiIGhlaWdodD0iMTQwJSI+CiAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiIHJlc3VsdD0iYmx1ciIgLz4KICAgICAgPGZlTWVyZ2U+CiAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJibHVyIiAvPgogICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgPC9mZU1lcmdlPgogICAgPC9maWx0ZXI+CiAgPC9kZWZzPgogIAogICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjgwMCIgaGVpZ2h0PSI2MDAiIGZpbGw9IiMxMTExMTciLz4KICAgIDwhLS0gU3RhdGU6IElkbGUgLS0+CiAgICA8cmVjdCB4PSI4MCIgeT0iMjUwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjYwIiByeD0iMTIiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzIi8+CiAgICA8cmVjdCB4PSIxMDUiIHk9IjI3MCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9IjEwNSIgeT0iMjgzIiB3aWR0aD0iODAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuMyIvPgogICAgPCEtLSBFbnRyeSBhcnJvdyAtLT4KICAgIDxsaW5lIHgxPSIzMCIgeTE9IjI4MCIgeDI9Ijc1IiB5Mj0iMjgwIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMi41Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjcyLDI3NCA4MiwyODAgNzIsMjg2IiBmaWxsPSIjZmZmZmZmIi8+CiAgICA8IS0tIFRyYW5zaXRpb246IElkbGUgLT4gQWN0aXZlIC0tPgogICAgPHBhdGggZD0iTTIyMCAyNjAgUSAzMTAgMTgwIDM4MCAyMjAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgICA8cG9seWdvbiBwb2ludHM9IjM3NiwyMTUgMzg1LDIyMiAzNzUsMjI2IiBmaWxsPSIjZjVmNWY1Ii8+CiAgICA8cmVjdCB4PSIyNzAiIHk9IjE5MCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjYiIHJ4PSIyIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjYiLz4KICAgIDwhLS0gU3RhdGU6IEFjdGl2ZSAtLT4KICAgIDxyZWN0IHg9IjMzMCIgeT0iMjEwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjYwIiByeD0iMTIiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBmaWx0ZXI9InVybCgjZ2xvdykiLz4KICAgIDxyZWN0IHg9IjM1NSIgeT0iMjMwIiB3aWR0aD0iNjAiIGhlaWdodD0iNyIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuNyIvPgogICAgPHJlY3QgeD0iMzU1IiB5PSIyNDMiIHdpZHRoPSI4NSIgaGVpZ2h0PSI1IiByeD0iMiIgZmlsbD0iI2Y1ZjVmNSIgb3BhY2l0eT0iMC4zIi8+CiAgICA8IS0tIFRyYW5zaXRpb246IEFjdGl2ZSAtPiBDb21wbGV0ZSAtLT4KICAgIDxwYXRoIGQ9Ik00NzAgMjUwIFEgNTUwIDIwMCA1OTAgMjUwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmNWY1ZjUiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHBvbHlnb24gcG9pbnRzPSI1ODYsMjQ1IDU5NSwyNTIgNTg2LDI1NiIgZmlsbD0iI2Y1ZjVmNSIvPgogICAgPHJlY3QgeD0iNTEwIiB5PSIyMTAiIHdpZHRoPSI1MCIgaGVpZ2h0PSI2IiByeD0iMiIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC42Ii8+CiAgICA8IS0tIFN0YXRlOiBDb21wbGV0ZSAtLT4KICAgIDxyZWN0IHg9IjU4MCIgeT0iMjUwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjYwIiByeD0iMTIiIGZpbGw9IiMyODI4MmUiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIzIi8+CiAgICA8cmVjdCB4PSI2MDUiIHk9IjI3MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjciIHJ4PSIzIiBmaWxsPSIjZmZmZmZmIiBvcGFjaXR5PSIwLjciLz4KICAgIDxyZWN0IHg9IjYwNSIgeT0iMjgzIiB3aWR0aD0iNTAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuMyIvPgogICAgPCEtLSBUZXJtaW5hbCBkb3VibGUtYm9yZGVyIC0tPgogICAgPHJlY3QgeD0iNTc2IiB5PSIyNDYiIHdpZHRoPSIxNDgiIGhlaWdodD0iNjgiIHJ4PSIxNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgb3BhY2l0eT0iMC40Ii8+CiAgICA8IS0tIFJlc2V0OiBDb21wbGV0ZSAtPiBJZGxlIC0tPgogICAgPHBhdGggZD0iTTU4MCAzMDUgUSA0MDAgNDIwIDIyMCAzMDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2Y1ZjVmNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjYgNCIgb3BhY2l0eT0iMC40Ii8+CiAgICA8cG9seWdvbiBwb2ludHM9IjIyNCwzMDAgMjE4LDMxMCAyMjgsMzA4IiBmaWxsPSIjZjVmNWY1IiBvcGFjaXR5PSIwLjQiLz4KICAgIDxyZWN0IHg9IjM4MCIgeT0iMzk1IiB3aWR0aD0iNDAiIGhlaWdodD0iNSIgcng9IjIiIGZpbGw9IiNmNWY1ZjUiIG9wYWNpdHk9IjAuMjUiLz4KICAKPC9nPgo8L3N2Zz4=" width="800" height="600" class="img_ev3q"></p>
<!-- -->
<p>State machines are the foundation of every .orb program. Every trait contains one, and the compiler enforces that they are well-formed. This post explains what a state machine is in .orb and walks through a concrete example.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-a-state-machine">What Is a State Machine?<a href="https://orb.almadar.io/blog/understanding-state-machines#what-is-a-state-machine" class="hash-link" aria-label="Direct link to What Is a State Machine?" title="Direct link to What Is a State Machine?" translate="no">​</a></h2>
<p>A state machine defines a set of <strong>states</strong> your entity can be in, a set of <strong>events</strong> that trigger change, and a set of <strong>transitions</strong> that move the entity from one state to another. At any moment, the entity is in exactly one state. Only defined transitions are allowed. Everything else is rejected.</p>
<p>This eliminates the most common source of UI bugs: impossible state combinations. With boolean flags, 5 variables create 32 possible states, most of them invalid. A state machine with 5 named states has exactly 5 valid states.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-concrete-example-task-manager">A Concrete Example: Task Manager<a href="https://orb.almadar.io/blog/understanding-state-machines#a-concrete-example-task-manager" class="hash-link" aria-label="Direct link to A Concrete Example: Task Manager" title="Direct link to A Concrete Example: Task Manager" translate="no">​</a></h2>
<p>Consider a task management trait with three states:</p>
<div style="margin:2rem 0"><svg viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg"><defs><filter id="avl-sm-4-glow" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur in="SourceGraphic" stdDeviation="3" result="blur"></feGaussianBlur><feMerge><feMergeNode in="blur"></feMergeNode><feMergeNode in="SourceGraphic"></feMergeNode></feMerge></filter><linearGradient id="avl-sm-4-grad" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="var(--color-primary)" stop-opacity="0.1"></stop><stop offset="100%" stop-color="var(--color-primary)" stop-opacity="0.05"></stop></linearGradient></defs><style>
          @keyframes avl-sm-dash { from { stroke-dashoffset: 20; } to { stroke-dashoffset: 0; } }
        </style><circle cx="300" cy="200" r="180" fill="url(#avl-sm-4-grad)"></circle><g><g opacity="0.7"><defs><marker id="avl-tr-19-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M345.2846096908265,57.052558883257646 Q421.4226710983288,132.98718707889796 424.18842025849233,240.4833395016046" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-19-arrow)"></path></g><text x="407.0608706276416" y="90.08179306876173" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">EDIT</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-20-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M405.4038105676658,255.94744111674234 Q402.6380614075023,148.4512886940357 326.5,72.5166604983954" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-20-arrow)"></path></g><text x="399.0531754730548" y="190.91820693123825" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">SAVE</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-21-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M426.18842025849233,243.94744111674234 Q423.4226710983288,136.4512886940357 347.2846096908265,60.516660498395396" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-21-arrow)"></path></g><text x="440.62239485470786" y="166.91820693123825" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">CANCEL</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-22-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M296.2846096908265,81.05255888325766 Q220.14654828332422,156.98718707889802 217.38079912316076,264.48333950160463" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-22-arrow)"></path></g><text x="234.50834875401148" y="114.08179306876177" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">DELETE</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-23-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M194.59618943233423,255.9474411167424 Q197.3619385924977,148.45128869403575 273.5,72.51666049839541" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-23-arrow)"></path></g><text x="200.94682452694516" y="190.9182069312383" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">CONFIRM</text></g><g><g opacity="0.7"><defs><marker id="avl-tr-24-arrow" markerWidth="8" markerHeight="6" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L8,3 L0,6 Z" fill="var(--color-primary)"></path></marker></defs><path d="M215.38079912316076,267.94744111674237 Q218.14654828332425,160.45128869403575 294.2846096908265,84.51666049839541" fill="none" stroke="var(--color-primary)" stroke-width="1.5" marker-end="url(#avl-tr-24-arrow)"></path></g><text x="200.94682452694514" y="190.9182069312383" text-anchor="middle" fill="var(--color-primary)" font-size="9" font-family="inherit" font-weight="bold" opacity="0.8">CANCEL</text></g><g opacity="1" transform="translate(255,32)"><circle cx="-16" cy="18" r="6" fill="var(--color-primary)"></circle><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">browsing</text></g><g opacity="1" transform="translate(384.9038105676658,257)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">editing</text></g><g opacity="1" transform="translate(125.09618943233423,257.00000000000006)"><rect x="0" y="0" width="90" height="36" rx="18" ry="18" fill="none" stroke="var(--color-primary)" stroke-width="2"></rect><text x="45" y="18" text-anchor="middle" dominant-baseline="central" fill="var(--color-primary)" font-size="11" font-weight="400" font-family="inherit">confirming</text></g></svg></div>
<p>In .orb, this looks like:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"TaskInteraction"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"linkedEntity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token property">"stateMachine"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"states"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"isInitial"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"editing"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"confirming"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"events"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Initialize"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EDIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Edit"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Save"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"DELETE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Delete"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CONFIRM"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Confirm"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"key"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CANCEL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Cancel"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token property">"transitions"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"main"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"entity-table"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"editing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"EDIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"form-section"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"entity"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"editing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"SAVE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"update"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@payload.data"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"editing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CANCEL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"confirming"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"DELETE"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"> </span><span class="token property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"page-header"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token property">"title"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Confirm delete?"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"confirming"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CONFIRM"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"persist"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"delete"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Task"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"@entity.id"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">          </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"emit"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"INIT"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"from"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"confirming"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"to"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"browsing"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"event"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"CANCEL"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token property">"effects"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token string" style="color:rgb(255, 121, 198)">"render-ui"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"modal"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token null keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-concepts">Key Concepts<a href="https://orb.almadar.io/blog/understanding-state-machines#key-concepts" class="hash-link" aria-label="Direct link to Key Concepts" title="Direct link to Key Concepts" translate="no">​</a></h2>
<p><strong>States</strong> define the possible modes. <code>browsing</code> shows the table, <code>editing</code> shows a form in a modal, <code>confirming</code> shows a delete confirmation dialog. Exactly one state is active at a time.</p>
<p><strong>Events</strong> trigger transitions. <code>EDIT</code> moves from <code>browsing</code> to <code>editing</code>. <code>CANCEL</code> moves back. The same event can appear in multiple transitions from different states.</p>
<p><strong>Effects</strong> are the side-effects of a transition. The .orb language supports <code>set</code> (update a field), <code>render-ui</code> (display a UI pattern), <code>persist</code> (save to database), <code>emit</code> (publish an event to other traits), and <code>navigate</code> (change route).</p>
<p><strong>Guards</strong> are optional boolean expressions that gate a transition. If the guard evaluates to false, the transition is blocked. Guards use s-expression syntax: <code>["&gt;=", "@entity.priority", 3]</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-compiler-enforces">What the Compiler Enforces<a href="https://orb.almadar.io/blog/understanding-state-machines#what-the-compiler-enforces" class="hash-link" aria-label="Direct link to What the Compiler Enforces" title="Direct link to What the Compiler Enforces" translate="no">​</a></h2>
<p>When you run <code>orbital validate</code>, the compiler checks:</p>
<ul>
<li class="">Exactly one state is marked <code>isInitial</code></li>
<li class="">Every state is reachable (has at least one incoming transition)</li>
<li class="">Modal and drawer states have exit transitions (so users cannot get stuck)</li>
<li class="">Every event referenced in UI actions has a matching transition</li>
<li class="">All entity field references in effects and guards point to real fields</li>
</ul>
<p>If any of these rules are violated, compilation fails with a specific error code and a suggested fix. You cannot generate a broken application from a valid .orb program.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-this-matters">Why This Matters<a href="https://orb.almadar.io/blog/understanding-state-machines#why-this-matters" class="hash-link" aria-label="Direct link to Why This Matters" title="Direct link to Why This Matters" translate="no">​</a></h2>
<p>State machines give you predictability (you always know what state the app is in), testability (test each transition independently), and security (guards prevent unauthorized state changes). The .orb compiler adds a layer that traditional state machine libraries do not: structural validation before any code is generated.</p>
<p>The result is applications where every user interaction flows through a verified circuit of states, events, and transitions.</p>]]></content:encoded>
            <category>Architecture</category>
            <category>Tutorial</category>
        </item>
    </channel>
</rss>