<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Project MagNET</title>
    <link>https://projectmagnet-github-docs.pages.dev/</link>
    <description>Recent content on Project MagNET</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sun, 31 May 2026 01:22:33 -0700</lastBuildDate>
    <atom:link href="https://projectmagnet-github-docs.pages.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Roadmap</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/roadmap/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/roadmap/</guid>
      <description>&lt;p&gt;This roadmap groups the project&amp;rsquo;s open work into themes. It&amp;rsquo;s distilled from the &lt;a href=&#34;https://github.com/IoTone/ProjectMagNET/issues&#34; rel=&#34;external&#34; target=&#34;_blank&#34;&gt;public issue tracker&lt;svg width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 24 24&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M14 5c-.552 0-1-.448-1-1s.448-1 1-1h6c.552 0 1 .448 1 1v6c0 .552-.448 1-1 1s-1-.448-1-1v-3.586l-7.293 7.293c-.391.39-1.024.39-1.414 0-.391-.391-.391-1.024 0-1.414l7.293-7.293h-3.586zm-9 2c-.552 0-1 .448-1 1v11c0 .552.448 1 1 1h11c.552 0 1-.448 1-1v-4.563c0-.552.448-1 1-1s1 .448 1 1v4.563c0 1.657-1.343 3-3 3h-11c-1.657 0-3-1.343-3-3v-11c0-1.657 1.343-3 3-3h4.563c.552 0 1 .448 1 1s-.448 1-1 1h-4.563z&#34;/&gt;&lt;/svg&gt;&lt;/a&gt; — issue numbers link to the canonical discussion, which is always the source of truth.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Concepts &amp; Vocabulary</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/concepts/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/concepts/</guid>
      <description>&lt;p&gt;The Hive AI design borrows its structure from social insects: a colony with a ruler, members that take on specialized roles, and a kind of shared awareness across the group. Every metaphor maps cleanly onto an engineering construct. This page defines both sides so the rest of the documentation can use the shorthand.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-metaphor--the-machinery&#34;&gt;The metaphor → the machinery &lt;a href=&#34;#the-metaphor--the-machinery&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Biology&lt;/th&gt;&#xA;          &lt;th&gt;In the hive&lt;/th&gt;&#xA;          &lt;th&gt;Engineering reality&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Hive / colony&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;One MagNET deployment on a LAN&lt;/td&gt;&#xA;          &lt;td&gt;A set of nodes sharing a &lt;code&gt;hive_id&lt;/code&gt; and a pre-shared secret&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Ruler / queen&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;The coordinator&lt;/td&gt;&#xA;          &lt;td&gt;A device running the &lt;strong&gt;ruler&lt;/strong&gt; firmware: advertises itself, accepts joins, holds the peer table and shared-memory store&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Biologic&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;A hive member&lt;/td&gt;&#xA;          &lt;td&gt;A node running updatable Forth code over ESP-IDF&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Spawn&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;A newborn with no job&lt;/td&gt;&#xA;          &lt;td&gt;A freshly joined node holding the default &lt;code&gt;spawn&lt;/code&gt; role until promoted&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;A member&amp;rsquo;s specialization&lt;/td&gt;&#xA;          &lt;td&gt;A named behavior (worker, scribe, spy, …), delivered as a signed Forth &lt;strong&gt;role bundle&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;strong&gt;DNA&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;What proves family&lt;/td&gt;&#xA;          &lt;td&gt;A per-lineage secret key baked into firmware, used by the &lt;a data-bs-delay=&#34;{&amp;#34;hide&amp;#34;:300,&amp;#34;show&amp;#34;:550}&#34; data-bs-html=&#34;true&#34; data-bs-title=&#34;&lt;a href=&#39;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/generations-lineage/&#39;&gt;&lt;p&gt;HIVE AI&lt;/p&gt;</description>
    </item>
    <item>
      <title>Architecture &amp; Topology</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/architecture/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/architecture/</guid>
      <description>&lt;p&gt;A MagNET hive is a &lt;strong&gt;star&lt;/strong&gt; at the protocol level: one ruler, many nodes, each node talking to one ruler at a time. The richness comes from what flows over those links — authenticated joins, role grants, and shared-memory queries.&lt;/p&gt;&#xA;&lt;h2 id=&#34;topology-at-the-current-checkpoint&#34;&gt;Topology at the current checkpoint &lt;a href=&#34;#topology-at-the-current-checkpoint&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;graph TD&#xA;    R[&amp;#34;M5Dial (ESP32-S3)&amp;lt;br/&amp;gt;role = ruler&amp;lt;br/&amp;gt;mDNS advert · peer table · KV store&amp;#34;]&#xA;    R -- &amp;#34;mDNS _magnet-ruler._tcp&amp;lt;br/&amp;gt;&amp;#43; HMAC-SHA256 over TCP&amp;#34; --- E[&amp;#34;Atom Echo (ESP32)&amp;lt;br/&amp;gt;role = spawn&amp;lt;br/&amp;gt;hex LEDs &amp;#43; chirps&amp;#34;]&#xA;    R --- C[&amp;#34;ESP32-CAM / Unit CamS3&amp;lt;br/&amp;gt;role = spy&amp;lt;br/&amp;gt;/stream MJPEG&amp;#34;]&#xA;    R --- P[&amp;#34;M5Capsule (ESP32-S3)&amp;lt;br/&amp;gt;role = scribe&amp;lt;br/&amp;gt;KV in NVS (&amp;#43; Redis sidecar)&amp;#34;]&#xA;    R --- B[&amp;#34;ReSpeaker (XIAO S3)&amp;lt;br/&amp;gt;role = boombox&amp;lt;br/&amp;gt;audio notifications&amp;#34;]&#xA;    R --- F[&amp;#34;scripts/fake_ruler.py&amp;lt;br/&amp;gt;(laptop dev harness)&amp;#34;]&#xA;&lt;/pre&gt;&#xA;&lt;p&gt;A node discovers the ruler via mDNS, opens a TCP connection, and authenticates with a shared-secret HMAC. The ruler keeps a small table of live peers and serves a hive-wide key-value store. The same &lt;code&gt;fake_ruler.py&lt;/code&gt; laptop script can stand in for either side, which makes the text-based wire format easy to debug with &lt;code&gt;nc&lt;/code&gt;, Wireshark, or Python. See the full &lt;a data-bs-delay=&#34;{&amp;#34;hide&amp;#34;:300,&amp;#34;show&amp;#34;:550}&#34; data-bs-html=&#34;true&#34; data-bs-title=&#34;&lt;a href=&#39;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/hive-protocol/&#39;&gt;&lt;p&gt;HIVE AI&lt;/p&gt;</description>
    </item>
    <item>
      <title>The 12 Roles</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/roles/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/roles/</guid>
      <description>&lt;p&gt;A &lt;strong&gt;role&lt;/strong&gt; is the runtime function a node performs. Roles model the division of labor in a colony — most are general behaviors that any capable node can take on, a few are tied to specific hardware. A node starts as a &lt;code&gt;spawn&lt;/code&gt; and can be promoted to another role at runtime via a &lt;a data-bs-delay=&#34;{&amp;#34;hide&amp;#34;:300,&amp;#34;show&amp;#34;:550}&#34; data-bs-html=&#34;true&#34; data-bs-title=&#34;&lt;a href=&#39;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/hive-protocol/&#39;&gt;&lt;p&gt;HIVE AI&lt;/p&gt;&lt;strong&gt;Hive Protocol v1&lt;/strong&gt;&lt;br&gt;Ruler discovery, length-prefixed JSON transport, HMAC-SHA256 authentication, the message types, and the node state machine.&lt;/a&gt;&#34; data-bs-toggle=&#34;tooltip&#34; href=&#34;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/hive-protocol/#role_grant-ruler--node&#34;&gt;&lt;code&gt;ROLE_GRANT&lt;/code&gt;&lt;/a&gt;, which delivers the role&amp;rsquo;s behavior as a &lt;a data-bs-delay=&#34;{&amp;#34;hide&amp;#34;:300,&amp;#34;show&amp;#34;:550}&#34; data-bs-html=&#34;true&#34; data-bs-title=&#34;&lt;a href=&#39;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/role-bundles/&#39;&gt;&lt;p&gt;HIVE AI&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hive Protocol v1</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/hive-protocol/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/hive-protocol/</guid>
      <description>&lt;p&gt;The hive protocol is the wire language nodes and rulers speak. It is deliberately &lt;strong&gt;text-based and inspectable&lt;/strong&gt; — you can play either side with &lt;code&gt;nc&lt;/code&gt;, a Python script, or Wireshark. This page is the implementer-facing reference; both sides live in the &lt;code&gt;craw_hive&lt;/code&gt; component.&lt;/p&gt;&#xA;&lt;h2 id=&#34;goals-and-non-goals&#34;&gt;Goals and non-goals &lt;a href=&#34;#goals-and-non-goals&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Goals&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A node that already has WiFi can find a ruler on the same LAN with zero configuration.&lt;/li&gt;&#xA;&lt;li&gt;A join is authenticated by a pre-shared secret — a stolen MAC alone cannot impersonate a node.&lt;/li&gt;&#xA;&lt;li&gt;The wire format is readable, so any tool can participate for debugging.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Non-goals (v1)&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Generations &amp; the Lineage Gate</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/generations-lineage/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/generations-lineage/</guid>
      <description>&lt;p&gt;How does a hive decide whether a newcomer is &lt;em&gt;one of us&lt;/em&gt;? The answer combines a versioning scheme (which firmware family a node belongs to) with a cryptographic membership test (proving it descends from that family). This page covers both — Layer 1 (observational versioning) and Layer 2 (the lineage puzzle gate).&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-three-version-axes&#34;&gt;Why three version axes &lt;a href=&#34;#why-three-version-axes&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A biologic carries three orthogonal version concepts. Keeping them separate avoids grief whenever any one moves:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Signed Role Bundles</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/role-bundles/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/role-bundles/</guid>
      <description>&lt;p&gt;A &lt;strong&gt;role bundle&lt;/strong&gt; is a signed JSON envelope carrying ESPIDFORTH source that a receiving node executes via &lt;code&gt;forth_eval_n()&lt;/code&gt;. Bundles are how a hive teaches its nodes new behavior at runtime — &lt;strong&gt;without reflashing&lt;/strong&gt;. Implementation lives in the &lt;code&gt;craw_role_bundle&lt;/code&gt; component.&lt;/p&gt;&#xA;&lt;h2 id=&#34;design-goals&#34;&gt;Design goals &lt;a href=&#34;#design-goals&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Self-contained&lt;/strong&gt; — everything a node needs to install and run a role (source, version, signature).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Verifiable&lt;/strong&gt; — the signature catches tampering and lets a node refuse an unauthorized publisher.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Portable&lt;/strong&gt; — any chip running ESPIDFORTH and the matching FFI words can install any bundle whose &lt;code&gt;caps_req&lt;/code&gt; it satisfies.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Compact&lt;/strong&gt; — typical bundles are &amp;lt; 2 KB, fitting in a single hive &lt;code&gt;KV_DATA&lt;/code&gt; frame (3 KB cap).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;wire-format&#34;&gt;Wire format &lt;a href=&#34;#wire-format&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;&#xA;  &lt;div class=&#34;prism-codeblock &#34;&gt;&#xA;  &lt;pre id=&#34;379e339&#34; class=&#34;language-json &#34;&gt;&#xA;  &lt;code&gt;{&#xA;  &amp;#34;name&amp;#34;:      &amp;#34;spy&amp;#34;,&#xA;  &amp;#34;version&amp;#34;:   &amp;#34;1.0.3&amp;#34;,&#xA;  &amp;#34;min_proto&amp;#34;: 1,&#xA;  &amp;#34;author&amp;#34;:    &amp;#34;iotone-dev&amp;#34;,&#xA;  &amp;#34;caps_req&amp;#34;:  [&amp;#34;camera&amp;#34;, &amp;#34;jpeg&amp;#34;],&#xA;  &amp;#34;deps&amp;#34;:      [],&#xA;  &amp;#34;crc32&amp;#34;:     &amp;#34;a1b2c3d4&amp;#34;,&#xA;  &amp;#34;sig_alg&amp;#34;:   &amp;#34;hmac-sha256&amp;#34;,&#xA;  &amp;#34;sig&amp;#34;:       &amp;#34;f17b...&amp;#34;,&#xA;  &amp;#34;src_b64&amp;#34;:   &amp;#34;OiBzcHktbG9vcCAuLi4=&amp;#34;&#xA;}&lt;/code&gt;&#xA;  &lt;/pre&gt;&#xA;  &lt;/div&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Field&lt;/th&gt;&#xA;          &lt;th&gt;Purpose&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Role name (≤ 32 chars)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;version&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;SemVer; a node refuses a bundle older than the installed one (monotonic upgrade)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;min_proto&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Minimum hive-protocol version; future-proto bundles are refused&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;author&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Selects which trusted key the signature must validate against&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;caps_req&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Capabilities the role needs; refused if the node&amp;rsquo;s caps don&amp;rsquo;t cover them&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;deps&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Bundles expected first (not enforced in v1)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;crc32&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;CRC-32 of the &lt;em&gt;decoded&lt;/em&gt; source; defends against base64 corruption&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;sig_alg&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;hmac-sha256&lt;/code&gt; in v1; &lt;code&gt;ed25519&lt;/code&gt; planned for v2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;sig&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Signature over the canonical signing input&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;src_b64&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Base64 Forth source; decoded ≤ 4096 bytes for v1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;canonical-signing-input&#34;&gt;Canonical signing input &lt;a href=&#34;#canonical-signing-input&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;&#xA;  &lt;div class=&#34;prism-codeblock &#34;&gt;&#xA;  &lt;pre id=&#34;1232012&#34; class=&#34;language- &#34;&gt;&#xA;  &lt;code&gt;&amp;#34;&amp;lt;name&amp;gt;|&amp;lt;version&amp;gt;|&amp;lt;min_proto&amp;gt;|&amp;lt;author&amp;gt;|&amp;lt;crc32&amp;gt;|&amp;lt;src_b64&amp;gt;&amp;#34;&lt;/code&gt;&#xA;  &lt;/pre&gt;&#xA;  &lt;/div&gt;&#xA;&lt;p&gt;Pipe-delimited, that exact order, no whitespace. For &lt;code&gt;hmac-sha256&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Cast: Devices &amp; Boards</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/devices/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/devices/</guid>
      <description>&lt;p&gt;Each node type is a separate PlatformIO project assembled from the &lt;a data-bs-delay=&#34;{&amp;#34;hide&amp;#34;:300,&amp;#34;show&amp;#34;:550}&#34; data-bs-html=&#34;true&#34; data-bs-title=&#34;&lt;a href=&#39;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/architecture/&#39;&gt;&lt;p&gt;HIVE AI&lt;/p&gt;&lt;strong&gt;Architecture &amp; Topology&lt;/strong&gt;&lt;br&gt;How a ruler and its nodes fit together, the shared component stack, and the load-bearing bring-up order.&lt;/a&gt;&#34; data-bs-toggle=&#34;tooltip&#34; href=&#34;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/architecture/#the-shared-component-stack&#34;&gt;shared component stack&lt;/a&gt;. All join the hive through the same protocol; they differ in hardware and the role-specific work they do.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-ruler--m5stack-dial&#34;&gt;The ruler — M5Stack Dial &lt;a href=&#34;#the-ruler--m5stack-dial&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Project&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;M5StackDial-m5gfx-demo-ESPIDFORTH&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;MCU&lt;/td&gt;&#xA;          &lt;td&gt;ESP32-S3 (no PSRAM)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Distinguishing hardware&lt;/td&gt;&#xA;          &lt;td&gt;1.28&amp;quot; round touch LCD, rotary encoder, LEDC buzzer&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Role&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;Ruler&lt;/strong&gt; (Role 1)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;The Dial runs the ruler firmware: it advertises &lt;code&gt;_magnet-ruler._tcp&lt;/code&gt; over mDNS, maintains up to 8 peer sessions (one FreeRTOS task per client), and shows BLE / WiFi / hive status plus a live peer count as colored dots on the round display. A serial REPL exposes &lt;code&gt;ruler-status&lt;/code&gt;, &lt;code&gt;grant-role&lt;/code&gt;, &lt;code&gt;lineage-auth&lt;/code&gt;, and the KV words. It began life as the Pharkie m5gfx playground, reimplemented atop ESP-IDF + ESPIDFORTH.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Controlling the Hive from Forth</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/forth-words/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/forth-words/</guid>
      <description>&lt;p&gt;Every MagNET node runs an &lt;strong&gt;ESPIDFORTH&lt;/strong&gt; interpreter with a serial REPL. Hardware features and hive operations are exposed as Forth words — so you can drive a node live over USB serial, and bundle authors get the same vocabulary to compose new roles. Stack effects use the standard &lt;code&gt;( before -- after )&lt;/code&gt; notation.&lt;/p&gt;&#xA;&#xA;&lt;div class=&#34;alert alert-warning d-flex&#34; role=&#34;alert&#34;&gt;&#xA;  &lt;div class=&#34;flex-shrink-1 alert-icon&#34;&gt;&#xA;  &#xA;  &lt;span class=&#34;material-icons size-20 me-2&#34;&gt;&#xA;  warning&#xA;  &lt;/span&gt;&lt;/div&gt;&#xA;  &#xA;  &lt;div class=&#34;w-100&#34;&gt;ESPIDFORTH (the E4TH dialect) is &lt;strong&gt;lowercase and case-sensitive&lt;/strong&gt; — use &lt;code&gt;do&lt;/code&gt;/&lt;code&gt;loop&lt;/code&gt;/&lt;code&gt;if&lt;/code&gt;, not their uppercase forms, or words silently fail to parse. Also call &lt;code&gt;forth_init()&lt;/code&gt; before NimBLE/WiFi/httpd, or the dictionary heap starves.&lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;h2 id=&#34;display--app-words-dial&#34;&gt;Display &amp;amp; app words (Dial) &lt;a href=&#34;#display--app-words-dial&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Word&lt;/th&gt;&#xA;          &lt;th&gt;Effect&lt;/th&gt;&#xA;          &lt;th&gt;Notes&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( n -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Switch display theme (6 available)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;brightness&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( n -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Set backlight&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;ping&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Ripple animation&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;starburst&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Starburst animation&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;invert&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Invert display colors&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;mute&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Toggle the buzzer&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;appbeep&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Beep via the LEDC buzzer&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;appsleep&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Sleep display until touch/encoder&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;appshowmem&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Dump memory state to the display&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;appdevinfo&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( -- )&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Dump CPU / device info to the display&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;provisioning-words-every-node&#34;&gt;Provisioning words (every node) &lt;a href=&#34;#provisioning-words-every-node&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Word&lt;/th&gt;&#xA;          &lt;th&gt;Effect&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;prov-status&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Print BLE + WiFi + IP + hostname + hive state&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;prov-reset&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Clear stored WiFi credentials and reboot into BLE provisioning&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;&#xA;  &#xA;&#xA;  &lt;div class=&#34;prism-codeblock &#34;&gt;&#xA;  &lt;pre id=&#34;db34c7a&#34; class=&#34;language- &#34;&gt;&#xA;  &lt;code&gt;boombox&amp;gt; prov-status&#xA;ble:    MagNET-biologic-XXXX&#xA;wifi:   connected&#xA;ip:     192.168.1.42&#xA;time:   synced&#xA;host:   magnet-boombox-XXXX.local&#xA;hive:   joined&lt;/code&gt;&#xA;  &lt;/pre&gt;&#xA;  &lt;/div&gt;&#xA;&lt;h2 id=&#34;ruler-words-dial&#34;&gt;Ruler words (Dial) &lt;a href=&#34;#ruler-words-dial&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Word&lt;/th&gt;&#xA;          &lt;th&gt;Effect&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;ruler-status&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Print ruler id, hive id, gen, gate state, and the peer table&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;grant-role&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;Send a &lt;code&gt;ROLE_GRANT&lt;/code&gt; to a connected peer&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;lineage-auth&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;( n -- )&lt;/code&gt; — &lt;code&gt;1&lt;/code&gt; enables the &lt;a data-bs-delay=&#34;{&amp;#34;hide&amp;#34;:300,&amp;#34;show&amp;#34;:550}&#34; data-bs-html=&#34;true&#34; data-bs-title=&#34;&lt;a href=&#39;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/generations-lineage/&#39;&gt;&lt;p&gt;HIVE AI&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scribe &amp; the Redis Sidecar</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/scribe-redis/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/scribe-redis/</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Scribe&lt;/strong&gt; (Role 4) is the hive&amp;rsquo;s memory keeper — &lt;em&gt;&amp;ldquo;its only job is to save data to its internal memory and recall it from shared memory if asked.&amp;rdquo;&lt;/em&gt; It runs on the M5Capsule, whose 8 MB flash and oversized 64 KB NVS partition make it the natural store for hive shared memory and &lt;a data-bs-delay=&#34;{&amp;#34;hide&amp;#34;:300,&amp;#34;show&amp;#34;:550}&#34; data-bs-html=&#34;true&#34; data-bs-title=&#34;&lt;a href=&#39;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/role-bundles/&#39;&gt;&lt;p&gt;HIVE AI&lt;/p&gt;&lt;strong&gt;Signed Role Bundles&lt;/strong&gt;&lt;br&gt;How the hive teaches nodes new behavior at runtime — the envelope format, signing, install pipeline, and authoring.&lt;/a&gt;&#34; data-bs-toggle=&#34;tooltip&#34; href=&#34;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/role-bundles/&#34;&gt;role bundles&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Boombox: Audio Notifications</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/boombox-audio/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/boombox-audio/</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Boombox&lt;/strong&gt; (Role 12) is the hive&amp;rsquo;s voice — &lt;em&gt;&amp;ldquo;any speaker or audio playback device; unlike the beeper, it can play full sounds, music, or recordings.&amp;rdquo;&lt;/em&gt; It runs on a XIAO ESP32-S3 socketed onto a Seeed ReSpeaker Lite Voice Kit, and synthesizes everything in software — no PCM files.&lt;/p&gt;&#xA;&lt;h2 id=&#34;audio-architecture&#34;&gt;Audio architecture &lt;a href=&#34;#audio-architecture&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;16 kHz / 16-bit synth → 32-bit stereo I2S&lt;/strong&gt; at slave-mode frame rate. The ESP32-S3 is the I2S &lt;strong&gt;slave&lt;/strong&gt;; the on-carrier XMOS XU316 generates BCLK/WS and routes audio to the TLV320AIC3204 codec and speaker.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Software synth&lt;/strong&gt; — a 256-entry sine LUT with linear interpolation and Q16.16 phase accumulation.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Render task&lt;/strong&gt; drains a FreeRTOS queue of play requests; each request is up to 32 &lt;strong&gt;segments&lt;/strong&gt;. Segment kinds: &lt;code&gt;TONE&lt;/code&gt;, &lt;code&gt;SWEEP&lt;/code&gt;, &lt;code&gt;AM&lt;/code&gt;, &lt;code&gt;SLEEP&lt;/code&gt;. Each can carry a &lt;strong&gt;gain envelope&lt;/strong&gt; (&lt;code&gt;gain → gain_end&lt;/code&gt;) for click-free attack/release.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;No PCM on disk&lt;/strong&gt; — patterns are static arrays in flash. Adding a notification is one new array; bundle authors get the same primitives with no C at all.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34;&gt;graph LR&#xA;    A[&amp;#34;Forth REPL&amp;#34;] --&amp;gt; Q[&amp;#34;request queue (16 deep)&amp;#34;]&#xA;    K[&amp;#34;KV cmd poll&amp;#34;] --&amp;gt; Q&#xA;    Q --&amp;gt; RT[&amp;#34;render task&amp;lt;br/&amp;gt;(sine LUT)&amp;#34;]&#xA;    RT --&amp;gt; I[&amp;#34;I2S0 (slave)&amp;#34;]&#xA;    I --&amp;gt; X[&amp;#34;XU316 router&amp;#34;]&#xA;    X --&amp;gt; C[&amp;#34;codec → speaker&amp;#34;]&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;div class=&#34;alert alert-info d-flex&#34; role=&#34;alert&#34;&gt;&#xA;  &lt;div class=&#34;flex-shrink-1 alert-icon&#34;&gt;&#xA;  &#xA;  &lt;span class=&#34;material-icons size-20 me-2&#34;&gt;&#xA;  info&#xA;  &lt;/span&gt;&lt;/div&gt;&#xA;  &#xA;  &lt;div class=&#34;w-100&#34;&gt;The pin map (BCLK = GPIO8, WS = GPIO7, DOUT = GPIO43, slave mode, 32-bit stereo slots with int16→int32 sign-extension) is confirmed against Seeed&amp;rsquo;s reference example. Getting any of role/pins/format wrong produces white noise — all three must match the carrier.&lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;h2 id=&#34;primitives&#34;&gt;Primitives &lt;a href=&#34;#primitives&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These are the building blocks; the canned recipes and any bundle-authored sound compose from them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bench Bring-Up &amp; Verification</title>
      <link>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/bring-up/</link>
      <pubDate>Fri, 29 May 2026 00:00:00 -0500</pubDate>
      <guid>https://projectmagnet-github-docs.pages.dev/docs/hive-ai/bring-up/</guid>
      <description>&lt;p&gt;This is a reader-facing adaptation of the project&amp;rsquo;s bench test plan for the &lt;strong&gt;&lt;code&gt;0.5.0-spore&lt;/code&gt;&lt;/strong&gt; rev. Run it top to bottom; every step lists what to &lt;strong&gt;do&lt;/strong&gt;, what to &lt;strong&gt;expect&lt;/strong&gt;, and what a deviation means — so the first failure is itself the diagnostic.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites &lt;a href=&#34;#prerequisites&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;On the bench:&lt;/strong&gt; a Dial (ruler), at least one peer (Echo / Matrix / C3U), a Capsule (Redis variant), optionally a Camera.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;One 2.4 GHz SSID&lt;/strong&gt; for everything, with mDNS unblocked. On macOS, &lt;em&gt;System Settings → Privacy → Local Network&lt;/em&gt; must allow Terminal/Python.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Laptop tools:&lt;/strong&gt; &lt;code&gt;redis-cli&lt;/code&gt; (&lt;code&gt;brew install redis&lt;/code&gt;), &lt;code&gt;nc&lt;/code&gt;, Python 3.11+ for &lt;code&gt;scripts/fake_ruler.py&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Two terminals:&lt;/strong&gt; one &lt;code&gt;pio device monitor&lt;/code&gt; on the device under inspection, one for laptop scripts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;1-flash-everything-ruler-first&#34;&gt;1. Flash everything (ruler first) &lt;a href=&#34;#1-flash-everything-ruler-first&#34; class=&#34;anchor&#34; aria-hidden=&#34;true&#34;&gt;&lt;i class=&#34;material-icons align-middle&#34;&gt;link&lt;/i&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Flash the &lt;strong&gt;ruler first&lt;/strong&gt; so a newer ruler can recognize older nodes during a transition (see the &lt;a data-bs-delay=&#34;{&amp;#34;hide&amp;#34;:300,&amp;#34;show&amp;#34;:550}&#34; data-bs-html=&#34;true&#34; data-bs-title=&#34;&lt;a href=&#39;https://projectmagnet-github-docs.pages.dev/docs/hive-ai/generations-lineage/&#39;&gt;&lt;p&gt;HIVE AI&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
