{"id":812,"date":"2026-06-06T13:03:27","date_gmt":"2026-06-06T21:03:27","guid":{"rendered":"https:\/\/salemdata.net\/johnpress\/?p=812"},"modified":"2026-06-06T13:03:27","modified_gmt":"2026-06-06T21:03:27","slug":"creating-a-specification-after-the-fact-using-ai","status":"publish","type":"post","link":"https:\/\/salemdata.net\/johnpress\/?p=812","title":{"rendered":"Creating A Specification After the Fact Using AI"},"content":{"rendered":"<h3>Introduction<\/h3>\n<p>Protocol specifications are normally written before independent implementations are attempted. The specification is the common contract: it tells each implementer what must be sent, what must be accepted, what may be rejected, and what behavior is expected. Reticulum and LXMF present a different problem: much of the \u201cprotocol\u201d must be inferred from a working Python implementation. That is like asking a contractor to derive the building code from a finished house down the street.<\/p>\n<h3>A House Is Not a Building Code<\/h3>\n<p>Imagine you want to build a house in the year 1908.\u00a0 If you build a house, you probably should use an architect who then designs your house according to the applicable building codes where your house will be located.\u00a0 The house is designed to meet the building codes.<\/p>\n<figure id=\"attachment_816\" aria-describedby=\"caption-attachment-816\" style=\"width: 1448px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-816\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-5-2026-08_49_02-PM.png\" alt=\"Shelf of old leather bound books of building codes\" width=\"1448\" height=\"1086\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-5-2026-08_49_02-PM.png 1448w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-5-2026-08_49_02-PM-300x225.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-5-2026-08_49_02-PM-768x576.png 768w\" sizes=\"auto, (max-width: 1448px) 100vw, 1448px\" \/><figcaption id=\"caption-attachment-816\" class=\"wp-caption-text\">Good Old-Fashioned Building Codes<\/figcaption><\/figure>\n<p>Your architect and contractor normally have building codes to reference to make sure your house meets standards.\u00a0 But suppose they did not, they only have an &#8220;reference implementation&#8221;, e.g. the house down the street that you like and want to duplicate?\u00a0 They&#8217;re told they have to use the house down the street as an implementation of what the unspecified codes are.<\/p>\n<figure id=\"attachment_817\" aria-describedby=\"caption-attachment-817\" style=\"width: 520px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-817\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/Drawing_of_Herbert_H._Gustins_newly_built_house_in_Victoria_Park_Los_Angeles_California_1908.png\" alt=\"Drawing of 1908 house\" width=\"520\" height=\"378\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/Drawing_of_Herbert_H._Gustins_newly_built_house_in_Victoria_Park_Los_Angeles_California_1908.png 870w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/Drawing_of_Herbert_H._Gustins_newly_built_house_in_Victoria_Park_Los_Angeles_California_1908-300x218.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/Drawing_of_Herbert_H._Gustins_newly_built_house_in_Victoria_Park_Los_Angeles_California_1908-768x558.png 768w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><figcaption id=\"caption-attachment-817\" class=\"wp-caption-text\">A Lovely Home<\/figcaption><\/figure>\n<figure id=\"attachment_818\" aria-describedby=\"caption-attachment-818\" style=\"width: 172px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-818\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-5-2026-08_57_01-PM-e1780719310798.png\" alt=\"Cartoon of a contractor with a question mark and exclamation point above his head\" width=\"172\" height=\"224\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-5-2026-08_57_01-PM-e1780719310798.png 800w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-5-2026-08_57_01-PM-e1780719310798-230x300.png 230w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/ChatGPT-Image-Jun-5-2026-08_57_01-PM-e1780719310798-768x1000.png 768w\" sizes=\"auto, (max-width: 172px) 100vw, 172px\" \/><figcaption id=\"caption-attachment-818\" class=\"wp-caption-text\">What Are The Specifications?<\/figcaption><\/figure>\n<p>So this house &amp; building codes metaphor is where a software developer might feel when attempting to create an implementation of a &#8220;protocol&#8221; when all he has to work with is an existing code base instead of specifications.\u00a0 It&#8217;s not impossible, but the developer certainly will have his work cut out for him.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>My Current Problem: Understanding Reticulum&#8217;s LXMF Implementation Protocol<\/h3>\n<p>I&#8217;ve been focused with the Reticulum &#8220;protocol&#8221; and implementing it in C++ using Chad Attermann&#8217;s microReticulum.\u00a0 microReticulum is Reticulum written in C++ instead of using the Python scripting language where Reticulum was conceived and remains.\u00a0 Reticulum was in beta <span id='easy-footnote-1-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-1-812' title=' &amp;#8220;The Reticulum Protocol is defined entirely and authoritatively by this reference implementation, and this manual. &amp;#8221; Source: https:\/\/reticulum.network\/manual\/whatis.html#current-status\u00a0 On May 9, 2025, Reticulum moved out of &amp;#8220;beta&amp;#8221;.\u00a0 Source: https:\/\/unsigned.io\/articles\/2025_05_09_The_End_Is_Nigh_For_The_Beta_Days.html'><sup>1<\/sup><\/a><\/span> development until May, 2025.<\/p>\n<p>Using Python on a microcomputer such as a LilyGo T-Beam SUPREME would not be a wise decision; the ESP32-S processor is usually coded in C++<span id='easy-footnote-2-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-2-812' title='Running ordinary Python on a T-Beam would be challenging at best, and in the usual sense almost certainly the wrong tool for the job. A T-Beam is built around an ESP32-class microcontroller, not a Linux-style application processor. Depending on the board revision, it may have roughly hundreds of kilobytes of internal SRAM, a few megabytes of flash, and sometimes external PSRAM; one common T-Beam listing describes an ESP32 with 520 KB SRAM, 4 MB flash, and 4 MB PSRAM. That is generous for embedded firmware, but tiny compared with the memory environment expected by the normal desktop\/server Python interpreter, CPython. There is a MicroPython port for ESP32 boards with at least 4 MiB of flash, but MicroPython is a deliberately reduced embedded Python environment, not the same thing as dropping a full Python runtime and an arbitrary Python code base onto the board. In practice, a T-Beam program that speaks LoRa, handles timing, watches memory allocation, manages radio buffers, and runs from battery is normally written as firmware in C or C++, or in a carefully constrained embedded runtime. This is another reason a protocol specification matters: if the only \u201cspecification\u201d is a tree of Python scripts, then implementing the same behavior on a T-Beam requires reverse-engineering Python behavior into microcontroller-scale firmware rather than simply coding to a clear, language-neutral contract.&lt;\/p&gt;\n&lt;p&gt;Sources for footnotes: the T-Beam hardware class is ESP32-based, and one representative T-Beam listing gives &lt;strong&gt;520 KB SRAM&lt;\/strong&gt;, &lt;strong&gt;4 MB flash&lt;\/strong&gt;, and &lt;strong&gt;4 MB PSRAM&lt;\/strong&gt;. (&lt;a title=&quot;LilyGO TTGO T-Beam - LoRa 868MHz - NEO-6M GPS&quot; href=&quot;https:\/\/www.tinytronics.nl\/en\/lilygo-ttgo-t-beam-lora-868mhz-neo-6m-gps-esp32?utm_source=chatgpt.com&quot;&gt;TinyTronics&lt;\/a&gt;) MicroPython\u2019s ESP32 firmware is aimed at ESP32 boards with &lt;strong&gt;4 MiB or more of flash&lt;\/strong&gt;, including WROOM\/WROVER-style modules. (&lt;a title=&quot;esp32 \/ wroom&quot; href=&quot;https:\/\/micropython.org\/download\/esp32\/?utm_source=chatgpt.com&quot;&gt;MicroPython&lt;\/a&gt;) MicroPython\u2019s own constrained-device documentation emphasizes RAM limitations, heap fragmentation, and minimizing object creation\/destruction on microcontrollers. (&lt;a title=&quot;MicroPython on microcontrollers&quot; href=&quot;https:\/\/docs.micropython.org\/en\/latest\/reference\/constrained.html?utm_source=chatgpt.com&quot;&gt;docs.micropython.org&lt;\/a&gt;) Espressif describes the ESP32 as a Wi-Fi\/Bluetooth SoC for IoT and embedded applications, able to operate as a standalone microcontroller or as a communications subsystem for another processor. (&lt;a title=&quot;ESP32 Wi-Fi &amp;amp; Bluetooth SoC&quot; href=&quot;https:\/\/www.espressif.com\/en\/products\/socs\/esp32?utm_source=chatgpt.com&quot;&gt;espressif.com&lt;\/a&gt;)&lt;\/p&gt;\n&lt;p&gt;Contrast those resources with what an ordinary Python interpreter expects on a Gentoo Linux workstation. Even a do-nothing &lt;code dir=&quot;ltr&quot;&gt;python3 -c &#039;pass&#039;&lt;\/code&gt; process commonly occupies several to tens of megabytes of resident RAM before it performs any useful work. A real Reticulum process then adds the Reticulum code, runtime objects, buffers, routing state, interface handling, and cryptographic machinery. On a workstation, that is usually trivial; on an ESP32-class T-Beam, where RAM and flash are measured in kilobytes and a few megabytes, the gap is not merely inconvenient. It is the difference between running a general-purpose operating-system process and writing tightly constrained embedded firmware.&lt;\/p&gt;\n&lt;p&gt;Rust is also moving into the ESP32 space, offering memory-safety advantages over C and C++ in some embedded contexts, though the ESP32 ecosystem is still heavily C\/C++ centered.\u00a0 See &lt;strong&gt;&lt;a href=&quot;https:\/\/github.com\/BeechatNetworkSystemsLtd\/Reticulum-rs&quot;&gt;Reticulum-rs&lt;\/a&gt;,&lt;\/strong&gt; a Rust implementation of the &lt;a href=&quot;https:\/\/reticulum.network\/&quot; rel=&quot;nofollow&quot;&gt;Reticulum Network Stack;&lt;\/a&gt; &lt;strong&gt;&lt;a href=&quot;https:\/\/github.com\/esp-rs&quot;&gt;esp-rs&lt;\/a&gt;&lt;\/strong&gt;, Libraries, crates and examples for using Rust on Espressif SoC&amp;#8217;s, and\u00a0 YouTube video &lt;a href=&quot;https:\/\/www.youtube.com\/watch?v=l75TfMOPG1g&quot;&gt;From Zero to ESP32 Bootloader in Embedded Rust&lt;\/a&gt; by &lt;a href=&quot;https:\/\/www.youtube.com\/@therustybits&quot;&gt;The Rusty Bits&lt;\/a&gt;'><sup>2<\/sup><\/a><\/span> as housing a Python interpreter in the small memory space of the T-Beam would be challenging, at best. I never gave much thought about Reticulum being called a protocol and <em>assumed<\/em> somewhere buried in the extensive documentation there was a specification for the protocol.<\/p>\n<p>I had assumed that when something was called a protocol, there would be a specification document somewhere behind it. That assumption was wrong. <strong>There is no specification<\/strong>.\u00a0 In Reticulum\u2019s case, the term \u201cprotocol\u201d is being used in a more implementation-centered sense: the authoritative behavior is embodied in the Python code base and accompanying manual. If one wants to create a C++, Rust, Java, or other independent implementation, one must study the Python implementation and infer the required behavior in order to make the migrated code conform.<\/p>\n<p>I&#8217;ve been using microReticulum now for several weeks and testing and came to the realization I was using Reticulum&#8217;s LINK protocol to send messages back and forth among the various T-Beams.\u00a0 As I ran into problems, I realized the error of my decision to use the LINK &#8220;protocol&#8221;.\u00a0 I have since learned that the current practice for Reticulum clients is to use the LXMF (Lightweight Extensible Message Format) &#8220;protocol&#8221; <span id='easy-footnote-3-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-3-812' title=' &amp;#8220;LXMF is a simple and flexible messaging format and delivery protocol that allows a wide variety of implementations, while using as little bandwidth as possible. It is built on top of Reticulum and offers zero-conf message routing, end-to-end encryption and Forward Secrecy, and can be transported over any kind of medium that Reticulum supports.&amp;#8221; https:\/\/github.com\/markqvist\/LXMF'><sup>3<\/sup><\/a><\/span>.\u00a0 So now I really wanted to see a specification so I could understand precisely what would be needed to accomplish T-Beams talking to one another and just how they handle reaching out and communicating.\u00a0 How would they exchange messages?\u00a0 That&#8217;s when I learned about what I think of a protocol being, i.e. something with a specification such as RFC 9110 (<em>infra<\/em>), vs. &#8220;<a href=\"https:\/\/reticulum.network\/manual\/whatis.html#reference-implementation\">reference implementation<\/a>&#8221; protocol.\u00a0 I was not familiar with the term &#8220;reference implementation&#8221; as I assumed the use of the term protocol meant there was an underlying specification.\u00a0 &#8220;My bad.&#8221; <span id='easy-footnote-4-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-4-812' title='Informal idiom, see https:\/\/dictionary.cambridge.org\/dictionary\/english\/my-bad.\u00a0 Garner, B.\u00a0(2016).\u00a0my bad.\u00a0In\u00a0Garner&amp;#8217;s Modern English Usage.\u00a0: Oxford University Press. Retrieved 6 Jun. 2026, from https:\/\/www.oxfordreference.com\/view\/10.1093\/acref\/9780190491482.001.0001\/acref-9780190491482-e-5299.'><sup>4<\/sup><\/a><\/span><\/p>\n<h3>Protocols With Specifications<\/h3>\n<h4>HTTP<\/h4>\n<p>Here is an example of a protocol that has a specification: Hypertext Transfer Protocol (&#8220;HTTP&#8221;).<\/p>\n<p>HTTP is the application-level protocol that lets web clients and servers exchange requests and responses: a browser asks for a resource, and a server replies with status, headers, and content. Unlike a code base where \u201cthe implementation is the protocol,\u201d HTTP has formal specifications maintained through the IETF [<a href=\"https:\/\/www.ietf.org\/\">Internet Engineering Task Force<\/a>] RFC [<a href=\"https:\/\/en.wikipedia.org\/wiki\/Request_for_Comments\">Request for Comments<\/a>] process. <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9110.html\">RFC 9110<\/a> &#8220;HTTP Semantics&#8221; defines HTTP\u2019s common semantics: methods such as GET and POST, status codes, header fields, caching concepts, URI schemes, and the rules shared across HTTP versions. <a href=\"https:\/\/www.rfc-editor.org\/info\/rfc9112\/\">RFC 9112<\/a> then specifies the HTTP\/1.1 wire format: message syntax, parsing, connection handling, and related security concerns.<\/p>\n<p>A programmer writing an HTTP server in C, Java, Perl, Python, or C++ is not supposed to reverse-engineer Apache, nginx, curl, or Firefox and call that the protocol; the programmer codes against the specification. In that sense, the specification is the contract: it says what conforming implementations must send, must accept, may reject, and may extend. The house-building analogy is close: an as-built house can reveal many design choices, but it is a poor substitute for the building code, drawings, tolerances, and inspection criteria that tell everyone else how to build a compatible, and safe, inspectable structure that complies with current codes.<\/p>\n<h4>Other Protocols<\/h4>\n<p>See also these protocols and their specifications:<\/p>\n<ul>\n<li>File Transfer Protocol <span id='easy-footnote-5-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-5-812' title='&lt;strong&gt;FTP&lt;\/strong&gt; \u2014 RFC 959, &lt;em&gt;File Transfer Protocol&lt;\/em&gt;. (&lt;a title=&quot;RFC 959: File Transfer Protocol&quot; href=&quot;https:\/\/www.rfc-editor.org\/rfc\/rfc959.html?utm_source=chatgpt.com&quot;&gt;RFC Editor&lt;\/a&gt;)'><sup>5<\/sup><\/a><\/span>, or FTP, for transferring files between client and server systems;<\/li>\n<li>Domain Name System <span id='easy-footnote-6-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-6-812' title='&lt;strong&gt;DNS&lt;\/strong&gt; \u2014 RFC 1035, &lt;em&gt;Domain Names \u2014 Implementation and Specification&lt;\/em&gt;. (&lt;a title=&quot;RFC 1035 - Domain names - implementation and ...&quot; href=&quot;https:\/\/datatracker.ietf.org\/doc\/html\/rfc1035?utm_source=chatgpt.com&quot;&gt;IETF Datatracker&lt;\/a&gt;)'><sup>6<\/sup><\/a><\/span>, or DNS, for resolving names such as example.com into network addresses;<\/li>\n<li>Simple Mail Transfer Protocol <span id='easy-footnote-7-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-7-812' title='&lt;strong&gt;SMTP&lt;\/strong&gt; \u2014 RFC 5321, &lt;em&gt;Simple Mail Transfer Protocol&lt;\/em&gt;. (&lt;a title=&quot;RFC 5321 - Simple Mail Transfer Protocol&quot; href=&quot;https:\/\/datatracker.ietf.org\/doc\/html\/rfc5321?utm_source=chatgpt.com&quot;&gt;IETF Datatracker&lt;\/a&gt;)'><sup>7<\/sup><\/a><\/span>, or SMTP, for transporting email between mail servers;<\/li>\n<li>Internet Message Access Protocol <span id='easy-footnote-8-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-8-812' title='&lt;strong&gt;IMAP&lt;\/strong&gt; \u2014 RFC 9051, &lt;em&gt;Internet Message Access Protocol Version 4rev2&lt;\/em&gt;. (&lt;a title=&quot;RFC 9051 - Internet Message Access Protocol (IMAP)&quot; href=&quot;https:\/\/datatracker.ietf.org\/doc\/html\/rfc9051?utm_source=chatgpt.com&quot;&gt;IETF Datatracker&lt;\/a&gt;)'><sup>8<\/sup><\/a><\/span>, or IMAP , for accessing and managing email stored on a mail server;<\/li>\n<li>Secure Shell <span id='easy-footnote-9-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-9-812' title='&lt;strong&gt;SSH&lt;\/strong&gt; \u2014 RFC 4251, &lt;em&gt;The Secure Shell Protocol Architecture&lt;\/em&gt;. (&lt;a title=&quot;RFC 4251 - The Secure Shell (SSH) Protocol Architecture&quot; href=&quot;https:\/\/datatracker.ietf.org\/doc\/html\/rfc4251?utm_source=chatgpt.com&quot;&gt;IETF Datatracker&lt;\/a&gt;)'><sup>9<\/sup><\/a><\/span>, or SSH, for secure remote login and command execution; and<\/li>\n<li>Transport Layer Security <span id='easy-footnote-10-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-10-812' title='&lt;strong&gt;TLS&lt;\/strong&gt; \u2014 RFC 8446, &lt;em&gt;The Transport Layer Security Protocol Version 1.3&lt;\/em&gt;. (&lt;a title=&quot;RFC 8446 - The Transport Layer Security (TLS) Protocol ...&quot; href=&quot;https:\/\/datatracker.ietf.org\/doc\/html\/rfc8446?utm_source=chatgpt.com&quot;&gt;IETF Datatracker&lt;\/a&gt;)'><sup>10<\/sup><\/a><\/span>, or TLS, for encrypting and authenticating network communications.<\/li>\n<\/ul>\n<p>Each of these is implemented by many independent programs, but the programs are expected to interoperate because they code to published specifications rather than to one favored source tree.<\/p>\n<p>(My sensitivity to this problem probably comes from years of documentation work with structured markup when I worked at the world&#8217;s largest database company supporting the Applications Division documentation, we migrated from HTML <span id='easy-footnote-11-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-11-812' title='The &lt;a href=&quot;https:\/\/html.spec.whatwg.org\/&quot;&gt;HTML specification&lt;\/a&gt; when printed to PDF is 1,061 pages.'><sup>11<\/sup><\/a><\/span> to XML to use Arbortext XML Editor in the early 2000s with the Oracle Internet File System (iFS) rebranded as Content Management Software Development Kit (CMSDK), most other XML<span id='easy-footnote-12-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-12-812' title=' &lt;a href=&quot;https:\/\/www.w3.org\/TR\/xml-c14n2\/&quot;&gt;XML&lt;\/a&gt; is not a protocol; it is a markup language for representing structured information. More precisely, it is a meta-language: a set of rules for creating specialized markup languages or document formats. Protocols may use XML as their message format, but XML itself does not define how two machines communicate.'><sup>12<\/sup><\/a><\/span> authoring houses used Documentum built atop an Oracle database, and then in around 2020, we migrated from Arbortext to Oxygen Editor, so XML became my <em>lingua franca<\/em>.)<\/p>\n<h3>An AI Solution<\/h3>\n<p>GitHub user thatSFguy employed a very clever solution for the problem of deriving a specification from the code base implementation of the Reticulum &#8220;protocol&#8221;. thatSFguy&#8217;s project is to come up with a specification for Reticulum.\u00a0 His answer was to have Anthropic&#8217;s Claude, an artificial intelligence tool, digest the Reticulum code base and then create a specification.<\/p>\n<p>This diagram sums up what AI does:<\/p>\n<figure id=\"attachment_819\" aria-describedby=\"caption-attachment-819\" style=\"width: 2057px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-819\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/mermaid-diagram.png\" alt=\"Flow Chart \" width=\"2057\" height=\"197\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/mermaid-diagram.png 2057w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/mermaid-diagram-300x29.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/mermaid-diagram-1920x184.png 1920w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/mermaid-diagram-768x74.png 768w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/mermaid-diagram-1536x147.png 1536w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/06\/mermaid-diagram-2048x196.png 2048w\" sizes=\"auto, (max-width: 2057px) 100vw, 2057px\" \/><figcaption id=\"caption-attachment-819\" class=\"wp-caption-text\">Deriving A Specification<\/figcaption><\/figure>\n<p>So I referenced <a href=\"https:\/\/github.com\/thatSFguy\/\">thatSFguy<\/a>&#8216;s project and asked ChatGPT, could I do the same for the LXMF &#8220;protocol&#8221;.\u00a0 The answer was &#8220;yes [indeedy].&#8221;\u00a0 And ChatGPT provided me a <a href=\"https:\/\/salemdata.net\/repo\/jlpoole\/LMXF-specification\/src\/branch\/jlpoole-dev\/ChatGPT_1.md\">prompt<\/a> to provide Codex along with a sequence of three tasks to assure a stable and thoughtful progression.\u00a0 I have staged the results on my Forgejo project <a href=\"https:\/\/salemdata.net\/repo\/jlpoole\/LMXF-specification\/src\/branch\/jlpoole-dev\/SPEC.md\">LXMF-specification<\/a>.<\/p>\n<p>For example, here&#8217;s a preliminary table Codex created after the first task &#8212; this would be the heart of the specification.<\/p>\n<table>\n<thead>\n<tr>\n<th>Field<\/th>\n<th style=\"text-align: right;\">Serialized position<\/th>\n<th>Type \/ size<\/th>\n<th>Source origin<\/th>\n<th>Test vector confirmed<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>destination_hash<\/code><\/td>\n<td style=\"text-align: right;\">bytes <code>0..15<\/code><\/td>\n<td>16 bytes<\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:383\">LXMessage.py<\/a>, length from <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:40\">LXMessage.py<\/a> and RNS 128-bit truncated hashes in <a href=\"\/usr\/local\/src\/reticulum\/Reticulum\/RNS\/Reticulum.py:146\">Reticulum.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>source_hash<\/code><\/td>\n<td style=\"text-align: right;\">bytes <code>16..31<\/code><\/td>\n<td>16 bytes<\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:384\">LXMessage.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>signature<\/code><\/td>\n<td style=\"text-align: right;\">bytes <code>32..95<\/code><\/td>\n<td>64 bytes<\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:378\">LXMessage.py<\/a>, <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:385\">LXMessage.py<\/a>; RNS signature length from <a href=\"\/usr\/local\/src\/reticulum\/Reticulum\/RNS\/Identity.py:59\">Identity.py<\/a> and <a href=\"\/usr\/local\/src\/reticulum\/Reticulum\/RNS\/Identity.py:80\">Identity.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>msgpack_payload<\/code><\/td>\n<td style=\"text-align: right;\">bytes <code>96..end<\/code><\/td>\n<td>msgpack list<\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:362\">LXMessage.py<\/a>, packed at <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:381\">LXMessage.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>timestamp<\/code><\/td>\n<td style=\"text-align: right;\">payload index <code>0<\/code><\/td>\n<td>Python float, normally msgpack float64 on this RNS umsgpack<\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:357\">LXMessage.py<\/a>, <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:362\">LXMessage.py<\/a>; float64 behavior from <a href=\"\/usr\/local\/src\/reticulum\/Reticulum\/RNS\/vendor\/umsgpack.py:1177\">umsgpack.py<\/a> and <a href=\"\/usr\/local\/src\/reticulum\/Reticulum\/RNS\/vendor\/umsgpack.py:325\">umsgpack.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>title<\/code><\/td>\n<td style=\"text-align: right;\">payload index <code>1<\/code><\/td>\n<td>bytes<\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:130\">LXMessage.py<\/a>, <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:193\">LXMessage.py<\/a>, <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:362\">LXMessage.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>content<\/code><\/td>\n<td style=\"text-align: right;\">payload index <code>2<\/code><\/td>\n<td>bytes<\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:135\">LXMessage.py<\/a>, <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:202\">LXMessage.py<\/a>, <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:362\">LXMessage.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>fields<\/code><\/td>\n<td style=\"text-align: right;\">payload index <code>3<\/code><\/td>\n<td>dict, default <code>{}<\/code><\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:215\">LXMessage.py<\/a>, <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:362\">LXMessage.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td><code>stamp<\/code><\/td>\n<td style=\"text-align: right;\">payload index <code>4<\/code>, optional<\/td>\n<td>bytes, only if generated<\/td>\n<td><a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:371\">LXMessage.py<\/a>, <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:373\">LXMessage.py<\/a>; extracted on unpack at <a href=\"\/usr\/local\/src\/reticulum\/LXMF\/LXMF\/LXMessage.py:754\">LXMessage.py<\/a><\/td>\n<td>No<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Still to do is verifying &#8220;test vectors&#8221; <span id='easy-footnote-13-812' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/salemdata.net\/johnpress\/?p=812#easy-footnote-bottom-13-812' title='A &lt;strong&gt;test vector&lt;\/strong&gt; is a known input together with the exact expected output. It is used to prove that two independent implementations behave the same way.'><sup>13<\/sup><\/a><\/span> and then processing changes to the mainline Python code and updating this derived specification.<\/p>\n<h3>Conclusion<\/h3>\n<p>The goal is not to criticize an implementation that works. A finished house can be beautiful, and a Python implementation can be elegant. The problem appears when others are asked to build compatible structures from the example alone. A specification turns observed behavior into a contract. My 40 years being a lawyer makes contracts ingrained into my nature. Test vectors then make that contract executable: same input, same output, independent implementation. That is where AI may be genuinely useful\u2014not as an oracle, but as a disciplined assistant for reading code, extracting rules, identifying ambiguities, and helping turn \u201clook at the source\u201d into something other implementers can build against.<\/p>\n<hr>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Protocol specifications are normally written before independent implementations are attempted. The specification is the common contract: it tells each implementer what must be sent, what must be accepted, what may be rejected, and what behavior is expected. Reticulum and LXMF present a different problem: much of the \u201cprotocol\u201d must be inferred from a working [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":818,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37,127,126,130,121],"tags":[],"class_list":["post-812","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-chatgpt","category-codex","category-reticulum","category-t-beam"],"_links":{"self":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=812"}],"version-history":[{"count":22,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/812\/revisions"}],"predecessor-version":[{"id":849,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/812\/revisions\/849"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/media\/818"}],"wp:attachment":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}