<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Satoshi Konno</title>
    <description>The latest articles on DEV Community by Satoshi Konno (@cybergarage).</description>
    <link>https://dev.to/cybergarage</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1999005%2Fc830345a-723c-4fb1-b8f0-d7934c8e58d9.png</url>
      <title>DEV Community: Satoshi Konno</title>
      <link>https://dev.to/cybergarage</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cybergarage"/>
    <language>en</language>
    <item>
      <title>Inside a Persistent AI Agent: Reading MUSE Through Its Harness</title>
      <dc:creator>Satoshi Konno</dc:creator>
      <pubDate>Fri, 13 Nov 2026 17:50:32 +0000</pubDate>
      <link>https://dev.to/cybergarage/inside-a-persistent-ai-agent-reading-muse-through-its-harness-59bd</link>
      <guid>https://dev.to/cybergarage/inside-a-persistent-ai-agent-reading-muse-through-its-harness-59bd</guid>
      <description>&lt;p&gt;A personal AI agent needs continuity: recovering a task, remembering a correction, using a connected service and returning to work later. A model call alone does not provide these capabilities. A surrounding execution system—the harness—selects context, runs tools and retains the state needed for another turn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope and evidence.&lt;/strong&gt; This unofficial study combines Meta’s public information, a supplied MUSE interview memo, and research and follow-up interviews that Dots, an AI assistant, conducted with MUSE. MUSE answered the documented questions about its own operation; receiving an answer is not independent verification or publication permission. Dots also operated and observed the limited Spaces experiment in §5 at the user’s request. Internal descriptions remain MUSE’s account unless a cited official source or identified UI observation supports the specific claim. Dates and roles appear in Sources and scope, with terms-review limits below; the private research archive is neither reproduced nor linked.&lt;/p&gt;

&lt;h2&gt;
  
  
  At a glance
&lt;/h2&gt;

&lt;p&gt;The five sections follow the work from a model decision to retained state and a revisitable application. This map highlights what each layer contributes, with links to the mechanisms and evidence behind it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;Key takeaway&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Execution loop&lt;/td&gt;
&lt;td&gt;MUSE describes a harness that assembles context, executes permitted tools and inspects results around model decisions. Continuity comes from coordinating execution with retained state.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Tools and connections&lt;/td&gt;
&lt;td&gt;MUSE reports on-demand function schemas and document-driven connector commands, with Skills guiding both. Its 112-name catalog counts executables, not model functions; capability loading, action approval and service authorization are separate.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. State and memory&lt;/td&gt;
&lt;td&gt;MUSE reports PostgreSQL records alongside persistent files, while only selected material enters model context. Corrections must update source records and dependent summaries: useful memory requires selection and maintenance as well as storage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Background work&lt;/td&gt;
&lt;td&gt;MUSE distinguishes triggers (Cron/Hooks), retained purpose and progress (Goals), and reading or proposals (Feed/Ideas). Continuing work combines these separate responsibilities; a saved goal is not itself a trigger.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Spaces continuity&lt;/td&gt;
&lt;td&gt;Meta describes revisitable personal features. Dots observed one note and its completed state survive reopening and a heading-only rebuild in the synthetic app. This demonstrates that limited case; restart recovery and schema migration were not tested.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The central distinction is between retaining information and bringing the right information back into an execution. The Spaces experiment provides a concrete, limited example of that continuity; the preceding sections explain the surrounding responsibilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Architecture and the execution loop
&lt;/h2&gt;

&lt;p&gt;Meta’s &lt;a href="https://ai.meta.com/muse/" rel="noopener noreferrer"&gt;Muse overview&lt;/a&gt; describes a persistent VM and browser, connected applications, background work and permission controls. MUSE’s interview account assigns the surrounding loop to a harness that assembles context, runs permitted tools and checks results. The model chooses a next step; the harness connects that choice to execution and retained state.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv6r61o23tqi3c9r4m4f4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv6r61o23tqi3c9r4m4f4.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  From a request to the next decision
&lt;/h3&gt;

&lt;p&gt;In the reported loop, a request leads to context assembly, model selection of an action, tool execution and inspection of the returned result before the next decision. Delegation and JavaScript workflow execution are available in the account, without implying that every request follows a fixed graph or uses several agents. Tool selection and a successful operation are separate events.&lt;/p&gt;

&lt;h3&gt;
  
  
  Execution and retained resources
&lt;/h3&gt;

&lt;p&gt;The execution environment, durable stores and model input have different roles. The reported PostgreSQL records organize conversations and runtime state; persistent files hold memory and work products; browser state and job definitions have their own lifetimes. The harness connects these resources to inference. A checkpoint and the records it references may both be needed to resume work; the interview supplies no transaction or recovery guarantee across them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Following an execution
&lt;/h3&gt;

&lt;p&gt;The memo also describes execution identifiers, parent–child agent relationships, tool records, token counts, job history and diagnostic logs. These provide a reported basis for tracing the loop, without establishing a user-facing trace viewer, complete audit coverage or tamper resistance.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Tools and connections to external services
&lt;/h2&gt;

&lt;p&gt;MUSE describes two routes for supplying tool instructions: load a native function schema when needed, or read connector documentation and construct a CLI command. Skills guide both routes, while browser, Computer Use and private-network access reach different environments. These capabilities remain distinct from approval and service authorization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ruszee2uaod4wgukxm0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ruszee2uaod4wgukxm0.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Two routes from capability discovery to execution
&lt;/h3&gt;

&lt;p&gt;A machine-readable function schema and a connector command are different ways to make a capability usable. The table separates those routes from the Skills that guide them, the context that informs them and the results returned afterward.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Information reportedly supplied to the model&lt;/th&gt;
&lt;th&gt;When and how it is loaded&lt;/th&gt;
&lt;th&gt;What it enables, and what it does not establish&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Native function tools&lt;/td&gt;
&lt;td&gt;Function names and JSON schemas for core capabilities, such as chat, browser operations, artifacts and schedules&lt;/td&gt;
&lt;td&gt;The interview describes namespace-level lazy loading; &lt;code&gt;tool_search&lt;/code&gt; loads the relevant schema when needed&lt;/td&gt;
&lt;td&gt;The model can select a function and form its arguments. This is not the same inventory as the 112 filesystem names. Exact request encoding and complete schemas remain unavailable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service connector CLI&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;CONNECTOR.md&lt;/code&gt;: command syntax, flags, account selection, permissions, output format and operating rules&lt;/td&gt;
&lt;td&gt;The interview describes reading the relevant document for the task; the model then constructs a command for a shell-execution tool&lt;/td&gt;
&lt;td&gt;The executable calls the service and returns a tool result, often structured JSON. The memo explicitly says this is not a wholesale dump of &lt;code&gt;--help&lt;/code&gt; into context.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skills&lt;/td&gt;
&lt;td&gt;Short descriptions for discovery, followed by a Markdown procedure in &lt;code&gt;SKILL.md&lt;/code&gt;; optional references and scripts&lt;/td&gt;
&lt;td&gt;The Skill answer describes descriptions in context, choosing the most specific applicable Skill, and &lt;code&gt;skill_search&lt;/code&gt; when needed. The package comparison reports separate &lt;code&gt;skill.yaml&lt;/code&gt; metadata including &lt;code&gt;include_in_prompt&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A Skill guides decisions and tool use; its existence does not make it an executable or prove Agent Skills conformance. The separate-metadata layout is a reported difference from the specification.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Core context and retrieved detail&lt;/td&gt;
&lt;td&gt;Core identity, user and memory files plus compact indexes; relevant detailed records and documents&lt;/td&gt;
&lt;td&gt;The context answer distinguishes routinely supplied core context from on-demand retrieval&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;TOOLS.md&lt;/code&gt; is described as environment guidance, not as the full list of machine-readable tool schemas. Retained content is not necessarily included in every inference request.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Results returned to the model&lt;/td&gt;
&lt;td&gt;Tool outputs, often JSON; for large outputs, bounded pages or file paths with coverage information&lt;/td&gt;
&lt;td&gt;The service-connection answer describes interpretation of returned structured results; the context-management answer describes paging and retrieving only relevant portions&lt;/td&gt;
&lt;td&gt;A returned result supports the next decision. It does not by itself prove success, authorized side effects or complete coverage.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, the reported Gmail connector document covers connection, account choice, permission checks, reading, drafts, sending, organization and result reporting. It is operational guidance as well as syntax, rather than a full &lt;code&gt;--help&lt;/code&gt; dump in every request. The &lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills specification&lt;/a&gt; puts YAML frontmatter in &lt;code&gt;SKILL.md&lt;/code&gt;; MUSE instead reports separate &lt;code&gt;skill.yaml&lt;/code&gt; metadata, including &lt;code&gt;include_in_prompt&lt;/code&gt;. This difference prevents inferring conformance from similar names. The &lt;a href="https://modelcontextprotocol.io/docs/2026-07-28/learn/architecture" rel="noopener noreferrer"&gt;MCP architecture&lt;/a&gt; distinguishes hosts, clients and servers; a wrapper or &lt;code&gt;-mcp&lt;/code&gt; suffix alone does not identify transport or deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  An executable catalog, not a function catalog
&lt;/h3&gt;

&lt;p&gt;The reported &lt;code&gt;/opt/hatch/bin/&lt;/code&gt; inventory contains &lt;strong&gt;112 executable names, not 112 model functions&lt;/strong&gt;. The original classification and complete inventory in Appendix A are retained:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reported class&lt;/th&gt;
&lt;th&gt;Count&lt;/th&gt;
&lt;th&gt;Representative names&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;External-service connector CLI&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;hatch_gws_cli&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;, &lt;code&gt;slack&lt;/code&gt;, &lt;code&gt;gumroad-mcp&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal runtime&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;hatch-execd&lt;/code&gt;, &lt;code&gt;hatch-vault&lt;/code&gt;, &lt;code&gt;spawnd&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional tool&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;web-search&lt;/code&gt;, &lt;code&gt;browser-service&lt;/code&gt;, &lt;code&gt;media-generation&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An installed name does not establish a connected account or current support, and a runtime helper is not necessarily model-callable. Complete per-command contracts were not supplied.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud browser, paired Mac and private-network access
&lt;/h3&gt;

&lt;p&gt;The cloud browser belongs to the execution environment and retains its own browser state. Computer Use is described as a paired Mac application that obtains UI state, performs a local UI action and returns another observation, using macOS accessibility and screen-recording permissions. Background interaction, excluded apps and the absence of an arbitrary local shell are reported constraints. Tailscale is a separate, optional runtime-proxy route to private TCP services, not an established transport for Computer Use. Outbound-only operation, destination approval and restrictions on UDP, incoming traffic and exit nodes describe this integration; they are not a definition of &lt;a href="https://tailscale.com/docs/concepts/what-is-tailscale" rel="noopener noreferrer"&gt;Tailscale itself&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Approval is not service authorization
&lt;/h3&gt;

&lt;p&gt;Operation approval and service authorization are distinct. OAuth scopes can permit a service operation while leaving approval for particular content or an action unresolved; approval in the agent interface cannot supply a missing scope. MUSE reports a separate credential store and protected credential references. Meta describes permission and credential protections at product level, while these internal mechanisms remain interview claims rather than a credential-isolation audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. State, memory and context
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Saving information is different from including it in model input.&lt;/strong&gt; In MUSE’s account, PostgreSQL records and persistent files retain state while the harness selects core context, relevant detail and compacted history for inference. Memory correction also requires updating dependent summaries and checking later retrieval; storage alone does not keep every derived view current.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr5sllpsolcvdc99k3xug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr5sllpsolcvdc99k3xug.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PostgreSQL: structured conversation and runtime state
&lt;/h3&gt;

&lt;p&gt;The five reported tables divide continuity into chat identity, session identity, ordered context, summarized history and restart state. The overview below shows those responsibilities before the column-level definitions in Appendix B.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reported table&lt;/th&gt;
&lt;th&gt;Columns&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chat.chats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Chat identity and lifecycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent.sessions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Session identity, originating request and archive time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent.context_items&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;Ordered context with message/tool references and content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent.compactions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Summary and the history range it replaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent.runtime_restart_checkpoints&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Per-agent restart state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 53-column definitions in Appendix B preserve SQL types, constraints and reference distinctions. These are reported contents of a generated schema reference, not validated live DDL. Declared foreign keys enforce a different relationship from described logical or “soft” references; several targets lie outside the five-table excerpt. The chat/agent schema is not the Spaces application database.&lt;/p&gt;

&lt;h3&gt;
  
  
  Files: persistent home and replaceable system tools
&lt;/h3&gt;

&lt;p&gt;The memo describes a persistent home containing &lt;code&gt;USER.md&lt;/code&gt; for user information, &lt;code&gt;IDENTITY.md&lt;/code&gt; and &lt;code&gt;SOUL.md&lt;/code&gt; for agent attributes and tone, &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;TOOLS.md&lt;/code&gt; for working conventions and environment notes, &lt;code&gt;MEMORY.md&lt;/code&gt; for selected lasting facts, preferences and commitments, and &lt;code&gt;PROACTIVE_PREFERENCES.md&lt;/code&gt; for unsolicited-contact preferences. User-created files and supplied system tools have different update lifetimes. These are reported conventions, not instructions to edit platform internals directly. The reported filesystem tree in Appendix C preserves the selected layout and role annotations supplied in MUSE’s answer.&lt;/p&gt;

&lt;p&gt;The simplified layout below groups files by responsibility. The home directory holds user-specific state; &lt;code&gt;/opt&lt;/code&gt; holds shared programs and definitions replaced on deployment, according to MUSE. It is a reading guide to the reported layout, not a newly captured filesystem listing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/                              User-specific persistent state
├── USER.md, MEMORY.md          User context and lasting memory
├── AGENTS.md, SOUL.md, …       Working conventions and agent identity
├── memory/                    Daily notes, people and derived memory
├── dreams/                    Reflections and alignment summaries
├── docs/                      Product documentation
└── workspace/                 Work products and task resources
    ├── your_files/, goals/    Deliverables and goal-specific work
    ├── custom-skills/         Learned procedures
    └── custom-connectors/     Added integrations

/opt/                           Replaceable system programs and definitions
├── hatch/bin/                 Connector, runtime and functional executables
├── hatch/connectors/          CONNECTOR.md guidance
└── muse/skills/                System SKILL.md procedures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Memory: source records, derived summaries and corrections
&lt;/h3&gt;

&lt;p&gt;Daily notes retain events and changes; person/group pages organize relationships. Background processing produces derived memory and broader summaries, separately from the search index. A current summary expresses the latest understanding, while detailed records preserve how it changed. Correcting memory therefore requires identifying and correcting the source record, recording its replacement, refreshing dependent summaries and checking later retrieval. A scheduled task may also depend on the superseded information. MUSE describes propagation through background processing, but supplies no delay or consistency guarantee.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context: compaction and selective retrieval
&lt;/h3&gt;

&lt;p&gt;For long conversations, MUSE describes compaction: summarize older history while retaining recent material. Its accounts differ on the trigger, so no exact window, threshold or retained-tail size is adopted here. Compaction changes active conversation representation; it is separate from updating long-term memory or training weights. Lost detail can only be recovered when its source remains stored, accessible and findable.&lt;/p&gt;

&lt;p&gt;Search serves several audiences: conversation/artifact search helps the user, memory retrieval supplies agent context, and external search/browser tools obtain outside information. Their coverage and freshness differ. Reported feedback, background reflection, procedure reviews and health checks can update operating context and workflows; they do not establish model-weight changes or measured benchmark gains.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Work that continues outside a conversation
&lt;/h2&gt;

&lt;p&gt;MUSE distinguishes triggers that start a run, Goals that retain purpose and progress, and artifacts, Feed and Ideas that result from work. Cron and Hooks supply timing or state checks; a Goal is not itself a clock. This separation explains how work can continue beyond a chat without making every proposal an authorized action.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1nhe4yw3lchuie2izbng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1nhe4yw3lchuie2izbng.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Triggers, retained goals and generated outputs
&lt;/h3&gt;

&lt;p&gt;Background work is easier to understand when the mechanism that starts it is separated from the information it carries forward and what it produces. The table places the reported mechanisms in those roles, rather than treating them as interchangeable forms of automation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Reported role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cron&lt;/td&gt;
&lt;td&gt;Scheduled instructions wake an agent, rather than merely launching a shell command.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hooks&lt;/td&gt;
&lt;td&gt;Check state changes, including through polling; event-oriented behavior does not imply push delivery.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resident services&lt;/td&gt;
&lt;td&gt;Processes that keep running.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goals&lt;/td&gt;
&lt;td&gt;Persistent purpose, progress and associated work; jobs can be linked to a goal, which is not itself a clock.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feed&lt;/td&gt;
&lt;td&gt;Generated reading material based on context and research.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ideas&lt;/td&gt;
&lt;td&gt;Proposals that can lead to execution when the user selects an action.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A scheduled run can use a Goal’s saved progress and produce an artifact, reading material or a proposal. Those outputs do not themselves define the next trigger, and an Idea remains a proposal until the user selects an action.&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuing work without confusing a proposal with an action
&lt;/h3&gt;

&lt;p&gt;Saved progress supports a later run, while an artifact is a work product and a proposal is still a proposal. Editing a projected job file does not establish that the scheduler’s authoritative definition changed. Generation intervals, ranking, expiry and state names belong to the reported environment rather than a current public specification. Ownership, cancellation propagation and recovery behavior require separate tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Testing continuity through Spaces
&lt;/h2&gt;

&lt;p&gt;Meta’s &lt;a href="https://about.fb.com/news/2026/11/introducing-spaces-customize-muse-app/" rel="noopener noreferrer"&gt;Spaces announcement&lt;/a&gt; describes personal features created and refined through chat, connected information, and notes or checkmarks retained on revisit; sharing was being explored. Dots used a synthetic notes app to observe reopening and heading-only rebuild retention. The implementation descriptions below remain MUSE’s reports, separate from the official experience; the SQLite/action path is specific to that prototype.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh7gxusi1t1tkw4swwn8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh7gxusi1t1tkw4swwn8d.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Application types, files and data
&lt;/h3&gt;

&lt;p&gt;The announcement also describes arranging Spaces in the sidebar or main tabs, hiding them or making them appear at relevant times, and refreshing connected information in the background. MUSE’s account adds the application-level boundaries below: a build-time page or interactive app, its files, its actions and its separate data store.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reported boundary&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web_static&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hosted build-time page; browser JavaScript can run, but this type does not save visitor input.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web_fullstack&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Interactive application with server/storage support, saved state and live data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Files&lt;/td&gt;
&lt;td&gt;Current application area &lt;code&gt;workspace/ts-spaces&lt;/code&gt;; older documentation uses &lt;code&gt;workspace/spaces&lt;/code&gt;. File artifacts use &lt;code&gt;workspace/your_files/&amp;lt;slug&amp;gt;/&lt;/code&gt; or a goal’s &lt;code&gt;files/&lt;/code&gt; area, with a &lt;code&gt;.src&lt;/code&gt; marker for builder-created directories.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actions&lt;/td&gt;
&lt;td&gt;Dedicated build/edit/inspection interfaces and typed application actions, also normalized into HTTP APIs; the conversational agent is described as using these rather than directly reading app source, logs or database contents.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application database&lt;/td&gt;
&lt;td&gt;An app-specific &lt;code&gt;app.db&lt;/code&gt;, associated with its slug and described as retained across updates/restarts. The filename alone does not identify an engine.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MUSE describes an asynchronous builder with follow-up instructions, relayed questions and cancellation. Artifacts are reportedly hosted in the user’s environment and require online access; this does not identify a shared VM process or isolation boundary. Static HTML export is described for static artifacts, not fullstack apps. Appendix D retains file, database, snapshot and prototype inspection details.&lt;/p&gt;

&lt;p&gt;&lt;span id="application-changes-and-background-updates"&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Application lifecycle: builds are not user data
&lt;/h3&gt;

&lt;p&gt;MUSE described the builder request as its authoritative input, along with a prebuilt tutorial artifact and its management executable. These are reported interface contracts.&lt;/p&gt;

&lt;p&gt;Two lifecycle limits matter more than a generic claim of version history. &lt;strong&gt;Restoring a version reportedly restores files and the build, not application data, settings or schedules.&lt;/strong&gt; Changing between static and fullstack types requires a new artifact, without automatic data inheritance. A restored screen therefore must not be assumed to represent restored data. Neither version restoration nor type conversion was tested.&lt;/p&gt;

&lt;p&gt;Muse described no hosting-only stop operation: revoking a public snapshot is distinct from deleting the artifact. Deletion was described as &lt;strong&gt;irreversible&lt;/strong&gt;, removing the application and its data, hosting, catalog entry, managed schedules and public share. The ordinary workspace-file trash period was said not to apply, and deletion during a running build was said to be rejected. These are consequential lifecycle claims from the interview, not operations performed or validated in this research.&lt;/p&gt;

&lt;h3&gt;
  
  
  Capabilities and background refresh
&lt;/h3&gt;

&lt;p&gt;The reported capability manifest declares web-reading capability and the connector methods an app needs; the server validates those declarations against the shipped connector catalog, and undeclared connector use was described as disallowed. A read approval may be requested before a build. Muse distinguished an artifact-scoped, persistent read approval from write authorization checked at execution time. These statements describe claimed enforcement behavior. They are not an authorization audit, a guarantee about every connector, or evidence that a conversational permission automatically authorizes all future application activity.&lt;/p&gt;

&lt;p&gt;Refresh triggers are reportedly declared at creation/edit time: a natural-language frequency is translated by the builder into a schedule. Background updates reportedly reuse the scheduling infrastructure described elsewhere in this article. A &lt;code&gt;space_action&lt;/code&gt; job runs without a chat message; failures remain in its history, and the same scheduled invocation is not automatically replayed. A regular agent job can instead call an application's action and report through chat; Muse also described call identifiers for background results written through actions. Schedule changes and suspension are managed through the scheduling interface, while deleting the application removes its managed schedules. Muse reported no artifact cron jobs in the inspected account, so timing, failure handling and replay behavior were not exercised.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prototype operations and observed results
&lt;/h3&gt;

&lt;p&gt;At the user’s request, Dots asked MUSE to build a private fullstack lab-notes app using synthetic data only. MUSE built the app; Dots used Computer Use to operate its UI and observe the following results in the native Muse application:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dots’s operation&lt;/th&gt;
&lt;th&gt;Result observed by Dots&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Request creation from MUSE, then add and complete a note in the UI&lt;/td&gt;
&lt;td&gt;The app opened and displayed the note, a checked state and &lt;code&gt;1/1 done&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Close and reopen&lt;/td&gt;
&lt;td&gt;The same note and completion state remained.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request a heading-only v2 change and reopen&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;LAB NOTEBOOK V2 — SYNTHETIC DATA ONLY&lt;/code&gt; appeared; the same note, checked state, &lt;code&gt;1/1 done&lt;/code&gt; and original displayed creation time remained.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dots’s observations demonstrate reopening persistence and data retention through &lt;strong&gt;one presentation-only rebuild in one app&lt;/strong&gt;. It is not a restart-recovery or database-migration test; a browser reload was not separately tested. No external connector, share, deletion or scheduled job was exercised. The private app and synthetic record were retained; its URL and host are omitted.&lt;/p&gt;

&lt;h3&gt;
  
  
  The prototype’s reported action and database path
&lt;/h3&gt;

&lt;p&gt;MUSE’s builder and separate inspection reported TypeScript &lt;code&gt;5.6.3&lt;/code&gt;, React/React DOM &lt;code&gt;19.2.5&lt;/code&gt;, TanStack Query &lt;code&gt;5.100.10&lt;/code&gt;, Tailwind CSS &lt;code&gt;4.1.13&lt;/code&gt;, Zod &lt;code&gt;4.4.3&lt;/code&gt;, Drizzle &lt;code&gt;0.45.2&lt;/code&gt; and SQLite &lt;code&gt;app.db&lt;/code&gt; &lt;strong&gt;for this prototype&lt;/strong&gt;. SQLite was attributed to schema declarations, migration dialect and table SQL, not inferred from the filename. Bun &lt;code&gt;1.3.10&lt;/code&gt; was reported for build/install, not established as the production server. These reports were not independent source or database inspection.&lt;/p&gt;

&lt;p&gt;The reported request path connects &lt;code&gt;App.tsx&lt;/code&gt; query/mutation calls through &lt;code&gt;@hatch/space-sdk&lt;/code&gt;’s action client and &lt;code&gt;POST ./actions&lt;/code&gt; to &lt;code&gt;defineAction&lt;/code&gt;, host-injected &lt;code&gt;ctx.db&lt;/code&gt;, Drizzle and SQLite. Its actions were &lt;code&gt;listNotes&lt;/code&gt;, &lt;code&gt;addNote&lt;/code&gt; and &lt;code&gt;toggleNote&lt;/code&gt;. The database was described as outside &lt;code&gt;.space-build&lt;/code&gt;, associated with the slug. MUSE said only the heading in &lt;code&gt;App.tsx&lt;/code&gt; changed, with the same action-level record ID, values and creation time afterward. The visible retention is consistent with this separation of build output and application data; it does not verify the placement or platform-wide contract.&lt;/p&gt;

&lt;p&gt;The useful distinction is between changing an application, refreshing connected information and saving user actions within it. The initial two migrations were reported as applied during initial creation, not a demonstrated migration of deployed user data. Detailed files, versions, metadata and the four-column &lt;code&gt;notes&lt;/code&gt; table remain in the appendix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;MUSE makes the harness a useful unit of analysis: continuity depends on state storage, selective memory, executable tools and the ability to resume work with relevant context. Conversation identity, ordered history, compaction ranges, checkpoints, working files and scheduled instructions serve different responsibilities. Their presence explains an architecture for continuing work without making persistence synonymous with sending everything to the model.&lt;/p&gt;

&lt;p&gt;Spaces makes that continuity tangible as a personal application. Dots observed one synthetic note survive reopening and a heading-only rebuild, while MUSE’s reports supplied a specific account of actions and application data. Together, the product description, interview and narrow experiment show why an agent is more than answer generation: the surrounding harness connects retained state and selected context to useful execution across time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix A. Complete executable catalog
&lt;/h2&gt;

&lt;p&gt;Each row groups one reported class, with every executable name preserved as a comma-separated entry. Classification is inherited from the memo; &lt;strong&gt;per-command contracts and present-day availability remain unverified&lt;/strong&gt;. The descriptive Google note attached to &lt;code&gt;hatch_gws_cli&lt;/code&gt; in the source is retained below the table. This is a name inventory, not a tested support matrix.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reported class&lt;/th&gt;
&lt;th&gt;Executable name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;External-service connector CLI (66)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;aftership&lt;/code&gt;, &lt;code&gt;agoda&lt;/code&gt;, &lt;code&gt;asana&lt;/code&gt;, &lt;code&gt;box-cli&lt;/code&gt;, &lt;code&gt;calendly&lt;/code&gt;, &lt;code&gt;canva&lt;/code&gt;, &lt;code&gt;dropbox&lt;/code&gt;, &lt;code&gt;duffel&lt;/code&gt;, &lt;code&gt;etsy-cli&lt;/code&gt;, &lt;code&gt;evernote&lt;/code&gt;, &lt;code&gt;facebook-cli&lt;/code&gt;, &lt;code&gt;figma&lt;/code&gt;, &lt;code&gt;flightaware&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;, &lt;code&gt;granola-cli&lt;/code&gt;, &lt;code&gt;hatch_gws_cli&lt;/code&gt;, &lt;code&gt;hatch_igd_cli&lt;/code&gt;, &lt;code&gt;hatch_messenger_cli&lt;/code&gt;, &lt;code&gt;healthkit-cli&lt;/code&gt;, &lt;code&gt;imap-email&lt;/code&gt;, &lt;code&gt;instagram-cli&lt;/code&gt;, &lt;code&gt;instagram-messages-cli&lt;/code&gt;, &lt;code&gt;klaviyo&lt;/code&gt;, &lt;code&gt;linear&lt;/code&gt;, &lt;code&gt;meta-ads-cli&lt;/code&gt;, &lt;code&gt;meta-catalog-search&lt;/code&gt;, &lt;code&gt;moneyforward-me&lt;/code&gt;, &lt;code&gt;muse-mail&lt;/code&gt;, &lt;code&gt;notion-cli&lt;/code&gt;, &lt;code&gt;onepassword&lt;/code&gt;, &lt;code&gt;opentable&lt;/code&gt;, &lt;code&gt;outlook-calendar&lt;/code&gt;, &lt;code&gt;outlook-contacts&lt;/code&gt;, &lt;code&gt;outlook-mail&lt;/code&gt;, &lt;code&gt;peloton&lt;/code&gt;, &lt;code&gt;philips-hue&lt;/code&gt;, &lt;code&gt;plaid&lt;/code&gt;, &lt;code&gt;printify&lt;/code&gt;, &lt;code&gt;quickbooks&lt;/code&gt;, &lt;code&gt;shopify&lt;/code&gt;, &lt;code&gt;shopify-ucp-cli&lt;/code&gt;, &lt;code&gt;slack&lt;/code&gt;, &lt;code&gt;spotify-api&lt;/code&gt;, &lt;code&gt;save-to-spotify&lt;/code&gt;, &lt;code&gt;stripe&lt;/code&gt;, &lt;code&gt;stripe-link&lt;/code&gt;, &lt;code&gt;tailscale&lt;/code&gt;, &lt;code&gt;tessie-api&lt;/code&gt;, &lt;code&gt;threads-cli&lt;/code&gt;, &lt;code&gt;threads-messages-cli&lt;/code&gt;, &lt;code&gt;ticketmaster&lt;/code&gt;, &lt;code&gt;todoist&lt;/code&gt;, &lt;code&gt;vercel&lt;/code&gt;, &lt;code&gt;withings&lt;/code&gt;, &lt;code&gt;zapier&lt;/code&gt;, &lt;code&gt;zoom&lt;/code&gt;, &lt;code&gt;healthex&lt;/code&gt;, &lt;code&gt;function-health&lt;/code&gt;, &lt;code&gt;ghl&lt;/code&gt;, &lt;code&gt;gumroad-mcp&lt;/code&gt;, &lt;code&gt;readwise-mcp&lt;/code&gt;, &lt;code&gt;runway-mcp&lt;/code&gt;, &lt;code&gt;shopback-mcp&lt;/code&gt;, &lt;code&gt;vidiq-mcp&lt;/code&gt;, &lt;code&gt;lovable&lt;/code&gt;, &lt;code&gt;replit&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal runtime (19)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;hatch&lt;/code&gt;, &lt;code&gt;hatch-browser-lease-helper&lt;/code&gt;, &lt;code&gt;hatch-connector-output&lt;/code&gt;, &lt;code&gt;hatch-doctor&lt;/code&gt;, &lt;code&gt;hatch-execd&lt;/code&gt;, &lt;code&gt;hatch-healthd&lt;/code&gt;, &lt;code&gt;hatch-multicall&lt;/code&gt;, &lt;code&gt;hatch-rescue&lt;/code&gt;, &lt;code&gt;hatch-rescue-systemctl&lt;/code&gt;, &lt;code&gt;hatch-rescuectl&lt;/code&gt;, &lt;code&gt;hatch-slide-style&lt;/code&gt;, &lt;code&gt;hatch-vault&lt;/code&gt;, &lt;code&gt;hatch-ws-client&lt;/code&gt;, &lt;code&gt;hatch-zeitgeist&lt;/code&gt;, &lt;code&gt;hatch_gws_auth&lt;/code&gt;, &lt;code&gt;authdc&lt;/code&gt;, &lt;code&gt;spawnd&lt;/code&gt;, &lt;code&gt;ingress-rev-proxy&lt;/code&gt;, &lt;code&gt;privsep-test-fully-isolated&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Functional tool (27)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;browser-broker&lt;/code&gt;, &lt;code&gt;browser-service&lt;/code&gt;, &lt;code&gt;web-search&lt;/code&gt;, &lt;code&gt;local-search&lt;/code&gt;, &lt;code&gt;image-search&lt;/code&gt;, &lt;code&gt;places&lt;/code&gt;, &lt;code&gt;geocode&lt;/code&gt;, &lt;code&gt;media-generation&lt;/code&gt;, &lt;code&gt;avatar-media-generation&lt;/code&gt;, &lt;code&gt;media-library&lt;/code&gt;, &lt;code&gt;tts&lt;/code&gt;, &lt;code&gt;edits&lt;/code&gt;, &lt;code&gt;shopping&lt;/code&gt;, &lt;code&gt;shop-wallet-cli&lt;/code&gt;, &lt;code&gt;device-data&lt;/code&gt;, &lt;code&gt;native-comms-cli&lt;/code&gt;, &lt;code&gt;health-cli&lt;/code&gt;, &lt;code&gt;nutrition-cli&lt;/code&gt;, &lt;code&gt;wearables-display&lt;/code&gt;, &lt;code&gt;builtin-artifacts&lt;/code&gt;, &lt;code&gt;genui-display-render&lt;/code&gt;, &lt;code&gt;feature-request&lt;/code&gt;, &lt;code&gt;subscription-status&lt;/code&gt;, &lt;code&gt;remote-storage&lt;/code&gt;, &lt;code&gt;share&lt;/code&gt;, &lt;code&gt;pickup-briefing-animation&lt;/code&gt;, &lt;code&gt;zbar-lib&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The source annotates &lt;code&gt;hatch_gws_cli&lt;/code&gt; as “Gmail / Google-related.” Totals: &lt;strong&gt;66 + 19 + 27 = 112 distinct names&lt;/strong&gt;. Entries such as &lt;code&gt;gumroad-mcp&lt;/code&gt; retain their original connector classification; a name ending in &lt;code&gt;-mcp&lt;/code&gt; is not by itself a verified statement about deployment or transport.&lt;/p&gt;

&lt;p&gt;The Gmail connector document was reported as 228 lines in that environment. The interview’s illustrative syntax was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hatch_gws_cli gmail +triage --query &lt;span class="s1"&gt;'...'&lt;/span&gt; --format json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is syntax documentation, not mailbox activity or a current support contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix B. Reported persistence schema
&lt;/h2&gt;

&lt;p&gt;The five tables and all 53 columns below preserve the interview’s SQL types, order and constraints. “Nullable” follows omission of &lt;code&gt;NOT NULL&lt;/code&gt;; an unlisted constraint is unknown. The generated reference was reportedly inspected on November 3, 2026, 22:59 JST. No live records were queried.&lt;/p&gt;

&lt;p&gt;Declared foreign keys and logical references are listed separately below. No cardinality, cascade or extra external-table columns are inferred.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;chat.chats&lt;/code&gt; — chat identity and lifecycle
&lt;/h3&gt;

&lt;p&gt;This table records a chat’s identity, lifecycle and presentation metadata, alongside fields describing its source. The column list keeps those source fields distinct from the session relationship discussed below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;SQL type&lt;/th&gt;
&lt;th&gt;Nullability / reported constraint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;chat_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL; PK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;origin&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lifecycle&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;status&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;thread_title&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;source_session_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;source_prompt_seq_upper_bound&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;source_message_id_boundary&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;created_at&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updated_at&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pinned&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;NOT NULL; default false&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pinned_order&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Primary key: &lt;code&gt;chats_pkey(chat_id)&lt;/code&gt;. No declared foreign key was reported. &lt;code&gt;source_session_id&lt;/code&gt; was described as a &lt;strong&gt;soft reference&lt;/strong&gt; to &lt;code&gt;agent.sessions.session_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The SQL type of &lt;code&gt;chat_id&lt;/code&gt; is &lt;code&gt;text&lt;/code&gt;, not &lt;code&gt;uuid&lt;/code&gt;. The interview separately describes its value as a UUID shared with the root agent's session ID. That description of value format does not change the SQL type, and actual values were not inspected.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;agent.sessions&lt;/code&gt; — session identity and origin
&lt;/h3&gt;

&lt;p&gt;A session record retains its identifier, originating request and lifecycle timestamps. Its reported foreign key links the originating request to a runtime table outside this excerpt.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;SQL type&lt;/th&gt;
&lt;th&gt;Nullability / reported constraint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;session_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL; PK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;root_request_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable; FK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;created_at&lt;/td&gt;
&lt;td&gt;timestamp with time zone&lt;/td&gt;
&lt;td&gt;NOT NULL; default now()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updated_at&lt;/td&gt;
&lt;td&gt;timestamp with time zone&lt;/td&gt;
&lt;td&gt;NOT NULL; default now()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;archived_at&lt;/td&gt;
&lt;td&gt;timestamp with time zone&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Primary key: &lt;code&gt;sessions_pkey(session_id)&lt;/code&gt;. Declared foreign key: &lt;code&gt;sessions_root_request_id_fkey&lt;/code&gt;, from &lt;code&gt;root_request_id&lt;/code&gt; to &lt;code&gt;runtime.requests.request_id&lt;/code&gt;. The table retains the session identity, originating request and archive timestamp.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;agent.context_items&lt;/code&gt; — ordered context items
&lt;/h3&gt;

&lt;p&gt;Context items combine an ordered position with content and optional references to messages or tool activity. The fields below distinguish that ordering from the payload and the records to which an item refers.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;SQL type&lt;/th&gt;
&lt;th&gt;Nullability / reported constraint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;context_item_id&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;NOT NULL; PK; sequence-generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;agent_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;seq&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;item_kind&lt;/td&gt;
&lt;td&gt;agent.context_item_kind (enum)&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;message_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable; FK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tool_call_id&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;Nullable; FK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tool_output_id&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;Nullable; FK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;role&lt;/td&gt;
&lt;td&gt;runtime.message_role (enum)&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;call_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tool_name&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;success&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;message_source&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;created_at&lt;/td&gt;
&lt;td&gt;timestamp with time zone&lt;/td&gt;
&lt;td&gt;NOT NULL; default now()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data_fbids&lt;/td&gt;
&lt;td&gt;bigint[]&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data_message_ids&lt;/td&gt;
&lt;td&gt;text[]&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data_cleanup_checked_at&lt;/td&gt;
&lt;td&gt;timestamp with time zone&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data_summarized_at&lt;/td&gt;
&lt;td&gt;timestamp with time zone&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data_thread_ids&lt;/td&gt;
&lt;td&gt;text[]&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data_expires_at&lt;/td&gt;
&lt;td&gt;timestamp with time zone&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;text_content&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;item_json&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Primary key: &lt;code&gt;context_items_pkey(context_item_id)&lt;/code&gt;. Unique constraint: &lt;code&gt;context_items_agent_id_seq_key(agent_id, seq)&lt;/code&gt;, with the columns in that order.&lt;/p&gt;

&lt;p&gt;Reported declared foreign keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;message_id&lt;/code&gt; → &lt;code&gt;runtime.messages.message_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tool_call_id&lt;/code&gt; → &lt;code&gt;runtime.tool_calls.tool_call_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tool_output_id&lt;/code&gt; → &lt;code&gt;runtime.tool_outputs.tool_output_id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Described soft references, not declared foreign keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent_id&lt;/code&gt; → &lt;code&gt;agent.agents.agent_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;call_id&lt;/code&gt; → &lt;code&gt;runtime.workflow_agent_calls.call_id&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure separates an item's position in context from its role, content and links to messages or tool activity. The names of the three foreign-key constraints, enum members and JSON-string structure were not supplied.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;agent.compactions&lt;/code&gt; — summarized history ranges
&lt;/h3&gt;

&lt;p&gt;A compaction record associates a summary with a history range and an optional context checkpoint. Keeping the range boundaries alongside the text makes clear which part of history the summary is intended to replace.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;SQL type&lt;/th&gt;
&lt;th&gt;Nullability / reported constraint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;compaction_id&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;NOT NULL; PK; sequence-generated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;agent_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;checkpoint_context_item_id&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;Nullable; FK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacement_history_first_seq&lt;/td&gt;
&lt;td&gt;integer&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;replacement_history_last_seq&lt;/td&gt;
&lt;td&gt;integer&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;created_at&lt;/td&gt;
&lt;td&gt;timestamp with time zone&lt;/td&gt;
&lt;td&gt;NOT NULL; default now()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;summary_text&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Primary key: &lt;code&gt;compactions_pkey(compaction_id)&lt;/code&gt;. Declared foreign key: &lt;code&gt;compactions_checkpoint_context_item_id_fkey&lt;/code&gt;, from &lt;code&gt;checkpoint_context_item_id&lt;/code&gt; to &lt;code&gt;agent.context_items.context_item_id&lt;/code&gt;. &lt;code&gt;agent_id&lt;/code&gt; was described as a soft reference to &lt;code&gt;agent.agents.agent_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The table associates a summary with a replaced history range. The reported range columns are &lt;code&gt;integer&lt;/code&gt;, whereas &lt;code&gt;agent.context_items.seq&lt;/code&gt; is &lt;code&gt;bigint&lt;/code&gt;; their types are not normalized here. This definition does not establish how recovery reconciles partially written summaries and context items.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;agent.runtime_restart_checkpoints&lt;/code&gt; — saved restart state
&lt;/h3&gt;

&lt;p&gt;The restart-checkpoint table records mode, payload and recovery-related fields under an agent identifier. Its structure describes saved state; the limits of what can be inferred about restoration follow the definition.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;SQL type&lt;/th&gt;
&lt;th&gt;Nullability / reported constraint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;agent_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL; PK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mode&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;payload_json&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;created_at&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updated_at&lt;/td&gt;
&lt;td&gt;bigint&lt;/td&gt;
&lt;td&gt;NOT NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;recovery_class&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;recovery_owner_id&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;execution_config_json&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Nullable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Primary key: &lt;code&gt;runtime_restart_checkpoints_pkey(agent_id)&lt;/code&gt;. No declared foreign key was reported. &lt;code&gt;recovery_owner_id&lt;/code&gt; was described as a soft reference to &lt;code&gt;agent.recovery_owners.owner_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The reported primary key implies at most one row per agent in this table. That is an interpretation of the key definition, not a guarantee about checkpoint freshness, retention or successful restoration. Columns ending in &lt;code&gt;_json&lt;/code&gt; were reported as SQL &lt;code&gt;text&lt;/code&gt;, not JSON or JSONB.&lt;/p&gt;

&lt;h3&gt;
  
  
  Relationship and verification boundaries
&lt;/h3&gt;

&lt;p&gt;The five tables describe different aspects of continuity: chat identity, session identity, ordered context, summarized ranges and restart state. They do not constitute a complete schema. Several declared foreign keys point to tables outside this five-table excerpt; soft references must not be treated as database-enforced integrity.&lt;/p&gt;

&lt;p&gt;Only the reported primary-key and unique-constraint information is available for indexes. Additional indexes, index methods, partial conditions, foreign-key deletion/update actions and deferrability were not supplied. The units and epoch of &lt;code&gt;bigint&lt;/code&gt; time columns, sequence names, enum values, JSON-string layouts and additional checks remain unknown. The interview also describes restricted projections for reading records, but no row query or enforcement test was performed here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix C. Reported filesystem tree
&lt;/h2&gt;

&lt;p&gt;The following reproduces the selected filesystem view supplied in MUSE’s original answer, with its role annotations translated into English. It is &lt;strong&gt;MUSE’s account of the major parts, not a captured &lt;code&gt;tree&lt;/code&gt; invocation or raw shell output&lt;/strong&gt;. Large runtime-internal directories such as &lt;code&gt;agents/&lt;/code&gt; were omitted in that answer; the ellipsis and combined file-name line below retain its shorthand. Dates, empty-file status, missing person pages and context-inclusion notes describe the answer at that time, not the current environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~ (home: described as retained even when the VM is replaced)
├── AGENTS.md                  Operating manual
├── SOUL.md                    Personality and tone
├── IDENTITY.md                Agent profile
├── USER.md                    User profile
├── MEMORY.md                  Long-term memory summary (always included)
├── PROACTIVE_PREFERENCES.md    Proactive-contact preferences
├── TOOLS.md                   Environment notes (empty at the time)
├── HEARTBEAT.md
├── memory/
│   ├── 2026-10-23.md … 2026-11-02.md   Daily notes (audit trail)
│   ├── bank/                  Automatically generated derived memory
│   │   ├── world.md / experience.md / opinions.md / reflections.md
│   ├── people/INDEX.md        Relationship map (no person pages yet)
│   ├── groups/INDEX.md
│   └── shopping/PROFILE.md
├── dreams/
│   ├── 2026-10-23.md          Nightly-batch reflection
│   └── alignment/
│       ├── derived/ALIGNMENT_SYNTHESIS.md   Integrated user understanding (always included)
│       └── repair/REPAIR_THREADS.yaml
├── docs/                      Product documentation (muse.md, memory.md, etc.)
├── workspace/                 Working area
│   ├── your_files/            User-visible work products
│   ├── goals/                 Per-goal folders
│   ├── custom-skills/         Learned skills
│   ├── custom-connectors/     Added connectors
│   ├── email/                 Saved email copies
│   ├── system/system_prompt.md
│   └── …
└── .ssh/                      SSH keys (confidential contents)

/opt (system: described as read-only and replaced on each deployment)
├── hatch/
│   ├── bin/                   CLI executables (112 reported names; see Appendix A)
│   └── connectors/            CONNECTOR.md files
└── muse/
    ├── skills/                System Skills (SKILL.md files)
    └── assets/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer distinguishes user-specific files retained under the home directory from shared programs and definitions replaced under &lt;code&gt;/opt&lt;/code&gt;. Those are reported update and retention roles, not an independently tested VM-replacement or recovery guarantee. The &lt;code&gt;bin/&lt;/code&gt; annotation uses the complete inventory’s classification: &lt;strong&gt;112 executable names across connectors, runtime components and functional tools&lt;/strong&gt;, not 112 model functions or 112 connectors alone. The tree lists paths and purposes only; it does not reproduce file contents, messages, keys or credentials. Structured conversation records remain a separate store, described in Appendix B.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix D. Spaces contracts and experiment details
&lt;/h2&gt;

&lt;p&gt;The following preserves MUSE’s reported contracts and application-specific inspection details; these were not independently audited. The direct operation results are in §5.&lt;/p&gt;

&lt;h3&gt;
  
  
  Application types and execution
&lt;/h3&gt;

&lt;p&gt;According to Muse's summary of its product-side documentation and tool contracts, &lt;strong&gt;Space&lt;/strong&gt; is the newer name for a &lt;strong&gt;web artifact&lt;/strong&gt;, with two types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reported type&lt;/th&gt;
&lt;th&gt;Described behavior&lt;/th&gt;
&lt;th&gt;Important boundary&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web_static&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A hosted page fixed at build time; browser-side JavaScript can execute&lt;/td&gt;
&lt;td&gt;Visitor input is not saved by this type; it is not the persistent interactive-app contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;web_fullstack&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A hosted interactive application with server/storage support, saved state and live data&lt;/td&gt;
&lt;td&gt;The general interview did not identify its server runtime, database engine or isolation model&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Muse said artifacts and their data live in the user's Muse environment and are served from there, rather than being installed on the user's device; pages were described as requiring online access. This provides a &lt;strong&gt;reported connection&lt;/strong&gt; to the personal environment, not an independently verified hosting topology or proof that every application shares a particular VM process, network namespace or trust boundary. Muse could not identify the language/runtime, routing mechanism, or whether execution is long-lived or request-driven.&lt;/p&gt;

&lt;h3&gt;
  
  
  Files and the application database
&lt;/h3&gt;

&lt;p&gt;The reported identifier is a lowercase kebab-case &lt;strong&gt;slug&lt;/strong&gt;. Muse described &lt;code&gt;workspace/ts-spaces&lt;/code&gt; as the current application area and &lt;code&gt;workspace/spaces&lt;/code&gt; as an older path appearing in its tool documentation. It separately described file artifacts under &lt;code&gt;workspace/your_files/&amp;lt;slug&amp;gt;/&lt;/code&gt; or a goal's &lt;code&gt;files/&lt;/code&gt; area, with a &lt;code&gt;.src&lt;/code&gt; source marker for builder-created directories. These are &lt;strong&gt;reported environment conventions&lt;/strong&gt;, not public stable paths or instructions to bypass application tooling. Because the catalog was empty, the newer path's creation timing could not be established.&lt;/p&gt;

&lt;p&gt;For an interactive app, Muse described an application-specific database named &lt;code&gt;app.db&lt;/code&gt;, retained across restarts and updates. The engine and concrete schema format were not disclosed: &lt;strong&gt;the name &lt;code&gt;app.db&lt;/code&gt; is not evidence of SQLite&lt;/strong&gt;. The builder defines each application's data model, and model changes are requested through its editing interface. The account's existing five chat/agent tables above are not a schema for this database.&lt;/p&gt;

&lt;p&gt;Muse also described a deliberate access boundary: the ordinary conversational agent does not directly inspect Space source, logs or database contents. It uses dedicated inspection/editing interfaces and the application's declared actions. Static pages can reportedly be exported as self-contained HTML under the file-artifact area; fullstack apps are not covered by that export contract. The initial interview performed no export or direct database read; the later experiment edited the application through Muse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static snapshots are not proof of a public sharing feature
&lt;/h3&gt;

&lt;p&gt;Muse's tool-contract account included a static public snapshot operation requiring approval for each share, with later edits excluded until another share, an unshare operation, and no fullstack publication. It said application database records are not included in that snapshot. &lt;strong&gt;This must not be read as confirmation that Spaces sharing is publicly released.&lt;/strong&gt; Meta's announcement says sharing is being explored. The interview describes a narrower, reported artifact operation; no snapshot was created, published or revoked, and its availability or behavior for Spaces was not independently established.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack reported from the generated application
&lt;/h3&gt;

&lt;p&gt;The builder and follow-up inspection identified the following &lt;strong&gt;versions in this one generated app&lt;/strong&gt;, not a required stack for all Spaces:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Reported implementation&lt;/th&gt;
&lt;th&gt;Scope of the evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;TypeScript &lt;code&gt;5.6.3&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Generated-project report&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;React / React DOM &lt;code&gt;19.2.5&lt;/code&gt;, TanStack Query &lt;code&gt;5.100.10&lt;/code&gt;, Tailwind CSS &lt;code&gt;4.1.13&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Reported dependencies and client implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validation and persistence adapter&lt;/td&gt;
&lt;td&gt;Zod &lt;code&gt;4.4.3&lt;/code&gt;, Drizzle &lt;code&gt;0.45.2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Reported action/schema implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build / install&lt;/td&gt;
&lt;td&gt;Bun &lt;code&gt;1.3.10&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Confirmed by the reported build/install inspection; &lt;strong&gt;not confirmation that the production server runs on Bun&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;SQLite, named &lt;code&gt;app.db&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Reported SQLite schema declaration, migration-journal dialect and actual table SQL, rather than inference from the filename&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform metadata&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;runtime: typescript&lt;/code&gt;, &lt;code&gt;platformVersion: 28&lt;/code&gt;, package &lt;code&gt;hatch-space-cvm-v1&lt;/code&gt;, &lt;code&gt;cvm_runtime_version: 4&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;App/configuration metadata reported by Muse; these labels do not establish host process or isolation details&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This narrows the earlier database uncertainty for the tested app: SQLite now has multiple reported supporting artifacts. It does &lt;strong&gt;not&lt;/strong&gt; justify retroactively labelling every Space database SQLite or treating an &lt;code&gt;app.db&lt;/code&gt; filename alone as proof.&lt;/p&gt;

&lt;h3&gt;
  
  
  Files, typed actions and the database boundary
&lt;/h3&gt;

&lt;p&gt;Muse reported a client entry at &lt;code&gt;client/dist/index.html&lt;/code&gt;, client implementation in &lt;code&gt;App.tsx&lt;/code&gt; and &lt;code&gt;client/src/api.ts&lt;/code&gt;, action definitions in &lt;code&gt;server/src/actions.ts&lt;/code&gt;, and built server actions at &lt;code&gt;dist/actions.js&lt;/code&gt;. Its account of the request path was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App.tsx: useQuery / useMutation
  → client/src/api.ts: @hatch/space-sdk createActionClient
  → POST ./actions with { action, args }
  → server/src/actions.ts: defineAction
  → host-injected ctx.db
  → Drizzle
  → SQLite app.db
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The declared operations were &lt;code&gt;listNotes&lt;/code&gt;, &lt;code&gt;addNote&lt;/code&gt; and &lt;code&gt;toggleNote&lt;/code&gt;. According to the inspection, application code contained neither a direct database-file open nor a connection string: the host supplied &lt;code&gt;ctx.db&lt;/code&gt;. The database was described as outside the &lt;code&gt;.space-build&lt;/code&gt; artifacts and associated with the application's slug. This is a concrete reported separation of generated build output from application data, consistent with the successful heading-only rebuild. It is not an independent audit of file placement or isolation.&lt;/p&gt;

&lt;p&gt;The reported application table was small enough to show completely:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;code&gt;notes&lt;/code&gt; column&lt;/th&gt;
&lt;th&gt;Reported SQL definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INTEGER PRIMARY KEY AUTOINCREMENT&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;text&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;TEXT NOT NULL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;done&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INTEGER NOT NULL DEFAULT 0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;created_at&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;INTEGER NOT NULL&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Muse's inspection reported a two-entry &lt;code&gt;__drizzle_migrations&lt;/code&gt; record: the first creation migration generated an &lt;code&gt;entries&lt;/code&gt; table, and the second replaced it with &lt;code&gt;notes&lt;/code&gt;, with both applied during the initial build. This is &lt;strong&gt;not&lt;/strong&gt; a demonstrated migration of user data between deployed schema versions. The later v2 edit deliberately left the schema and migrations alone. The reported configuration also had an empty &lt;code&gt;managedCronJobs&lt;/code&gt; list, matching the experiment's no-scheduling scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further verification
&lt;/h2&gt;

&lt;p&gt;Useful next tests are restart recovery without duplicate effects, correction propagation into later retrieval and scheduled work, denied writes, cancellation, connector revocation, conflicting refreshes and schema-changing migrations. Process launch, routing, authentication, cross-app isolation and egress enforcement were not independently inspected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interview premise and terms
&lt;/h3&gt;

&lt;p&gt;The interview method relies on MUSE answering questions in chat about its own operation. Meta’s &lt;a href="https://muse.ai/security-and-privacy" rel="noopener noreferrer"&gt;memory-controls guidance&lt;/a&gt; invites direct questions about remembered information and viewing files such as &lt;code&gt;MEMORY.md&lt;/code&gt;. Its &lt;a href="https://muse.ai/blog/security-and-safety-for-ai-agents-our-approach-with-muse" rel="noopener noreferrer"&gt;security explainer&lt;/a&gt; presents architectural detail to help users assess trust. The data-policy section describes access to files stored for the user in their VM, including memory, using the phrase “inspect, edit and download these files freely.” These explain user controls and Meta’s transparency aim. No official explanation was identified for why MUSE gave these particular internal answers, or a promise to answer arbitrary internal questions.&lt;/p&gt;

&lt;p&gt;An answer, its accuracy, permission to publish it and legal compliance are separate matters. The &lt;a href="https://muse.ai/terms" rel="noopener noreferrer"&gt;Muse Supplemental Terms&lt;/a&gt;, updated September 8, 2026, preserve existing user-content rights (§2(a)) and reserve rights in Muse (§3). They restrict concealing AI/automation (§4(l,p)), unauthorized access and rights violations (§4(r,s)), reverse engineering including outputs (§4(t), with an applicable-law exception), and overriding safeguards (§4(v)); §§7 and 11 address user oversight/responsibility and accuracy. The incorporated &lt;a href="https://www.facebook.com/terms/" rel="noopener noreferrer"&gt;Meta Terms&lt;/a&gt; also restrict automated access/collection without prior permission (§3.2) and reverse engineering subject to stated exceptions (§3.4). These provisions are material review points, not publication clearance. The displayed terms, &lt;a href="https://www.facebook.com/legal/ai-terms" rel="noopener noreferrer"&gt;Meta AI Terms&lt;/a&gt; and &lt;a href="https://muse.ai/privacy" rel="noopener noreferrer"&gt;Muse Privacy Policy&lt;/a&gt; were read in the official browser pages on November 12, 2026, after text-only retrieval returned login prompts. Exact regional/account applicability and all additional policies were not established. Connector-provider and model-API terms were not substituted. This study makes no finding that the interviews, automated UI operation or publication are lawful or contractually permitted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sources and scope
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spaces update:&lt;/strong&gt; Meta, &lt;a href="https://about.fb.com/news/2026/11/introducing-spaces-customize-muse-app/" rel="noopener noreferrer"&gt;Introducing Spaces: A New Way to Customize Your Muse App&lt;/a&gt;, published November 6, 2026; reviewed November 10, 2026. This newer official source supports the product-level Spaces section, not the older interview's internal implementation claims. A direct Spaces-specific follow-up was subsequently obtained; its distinct scope is documented below.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spaces experiment:&lt;/strong&gt; private synthetic-data application, November 11, 2026, approximately 03:40–03:51 JST (November 10, 18:40–18:51 UTC). Dots requested the build from MUSE, operated the UI and observed note use, reopening and the v2 heading with retained data. Source, configuration, database and action-level details are Muse builder/inspection reports, not independently read artifacts. No private application URL or host is included.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spaces interview:&lt;/strong&gt; follow-up questions posed by Dots to Muse on November 10, 2026, approximately 16:53–16:55 UTC (November 11, 01:53–01:55 JST), read by Dots in its native application. Dots observed the displayed answer; claimed documentation and environment checks were not independently repeated. The catalog was empty at the initial interview; the separately documented synthetic-app experiment followed later. This article paraphrases technical claims, not private instruction text or raw internal documents.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Public product context:&lt;/strong&gt; &lt;a href="https://ai.meta.com/muse/" rel="noopener noreferrer"&gt;Meta's Muse overview&lt;/a&gt;, checked November 4, 2026. Used for product identity and broad advertised capabilities only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interview material and roles:&lt;/strong&gt; the user supplied the initial MUSE interview memo; its original interviewer is not established by the available conversation record. Dots conducted the documented November 3 follow-up questioning and later Spaces investigation. The user supplied instructions and assisted local access/setup; this assistance is separate from Dots’s reported §5 UI observations. The interview material and follow-up answers were organized on November 3, 2026. These contain edited self-reports and reported observations; raw outputs, internal document originals, environment version, and most observation timestamps were unavailable. The underlying research archive is private and is not reproduced or linked here. Only the technical synthesis and the explicitly requested catalog and schema definitions are included; they are not independent public specifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Official interview context and review limits:&lt;/strong&gt; Meta, &lt;a href="https://muse.ai/security-and-privacy" rel="noopener noreferrer"&gt;Muse security and privacy&lt;/a&gt;, “Memory you control” and its memory FAQ; &lt;a href="https://muse.ai/blog/security-and-safety-for-ai-agents-our-approach-with-muse" rel="noopener noreferrer"&gt;How We Built Safety Into Muse&lt;/a&gt;, September 8, 2026, introduction and “Our Policy Around Data”; checked November 12, 2026. These support the specific control/transparency statements above, not blanket interview or publication authorization. Muse Supplemental Terms (September 8, 2026), the displayed Meta Terms (effective January 1, 2025), Meta AI Terms (effective May 13, 2026) and Muse Privacy Policy (effective September 17, 2026) were subsequently read in the official browser pages; the regional/account-specific governing versions remain unconfirmed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;General interfaces:&lt;/strong&gt; &lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;Agent Skills specification&lt;/a&gt;, &lt;a href="https://modelcontextprotocol.io/docs/2026-07-28/learn/architecture" rel="noopener noreferrer"&gt;MCP architecture&lt;/a&gt;, and &lt;a href="https://tailscale.com/docs/concepts/what-is-tailscale" rel="noopener noreferrer"&gt;Tailscale overview&lt;/a&gt;, checked November 4, 2026. These explain their respective technologies, not MUSE compliance or integration guarantees.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The supplied illustrations summarize reported responsibilities, conceptual flows and the identified Spaces observations; none is a product screenshot or independent implementation evidence. Appendix letters and supporting-view references embedded in the supplied images reflect an earlier layout; use the current text links and appendix headings. The retained technical detail is in the main text and appendices.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>Coding Agents Are Changing How I Build Open Source and Why I Do It</title>
      <dc:creator>Satoshi Konno</dc:creator>
      <pubDate>Thu, 12 Nov 2026 13:52:19 +0000</pubDate>
      <link>https://dev.to/cybergarage/coding-agents-are-changing-how-i-build-open-source-and-why-i-do-it-399f</link>
      <guid>https://dev.to/cybergarage/coding-agents-are-changing-how-i-build-open-source-and-why-i-do-it-399f</guid>
      <description>&lt;h2&gt;
  
  
  At a glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Coding agents have helped me restart development, respond to contributors, and tackle security findings and old maintenance debt.&lt;/li&gt;
&lt;li&gt;Parallel projects bring more progress, but keeping up with decisions can be exhausting and does not preserve every pleasure of coding.&lt;/li&gt;
&lt;li&gt;Easier alternatives change my reasons to reuse and contribute to OSS, without removing the value of shared knowledge and maintenance.&lt;/li&gt;
&lt;li&gt;I question the enthusiasm for making Rust the default for new implementations and rewrites. I want to choose Rust, C, or Go through practical experience and verification, not fashion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After more than twenty years of developing and publishing software through CyberGarage, I am finding that coding agents change more than how quickly I can write code. They have helped me restart stalled development, bring existing libraries to new hardware, respond to contributors, and work through security flaws and years of maintenance debt. Work that I could not fit into my own time is moving again. I used to work through projects one at a time; delegating to agents has made working on several in parallel my normal way of developing.&lt;/p&gt;

&lt;p&gt;I now use Codex as my primary tool, with Claude in a supporting role. I rarely use GitHub Copilot these days. The examples here come from that personal workflow, not a comparison of the tools or a claim about every developer's experience.&lt;/p&gt;

&lt;p&gt;The change is welcome, but not uncomplicated. I spend more time setting direction, preparing tests, and judging results, while agents carry more of the implementation. That makes maintaining my projects more practical without replacing my responsibility for them. It also changes the satisfaction I used to find in solving a difficult problem myself. The implementation burden is lighter, but keeping up with the decisions can be tiring.&lt;/p&gt;

&lt;p&gt;This is an account of both sides: what has started moving in my projects, and what that progress has made me reconsider about learning, building, and participating in open source. It also makes me question the enthusiasm for writing and rewriting software in Rust: when an agent does the implementation, I still want the language choice to follow my experience, the project’s needs, and the strength of the verification workflow. If making an alternative becomes easier, what still draws me to a shared project, and what will I want to build for the pleasure of building it?&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Coding agents got stalled maintenance moving again
&lt;/h2&gt;

&lt;p&gt;The benefits have appeared in several kinds of work: developing something I had struggled to finish, responding to new reports and contributions, investigating security weaknesses, and returning to old maintenance debt.&lt;/p&gt;

&lt;h3&gt;
  
  
  New development: accelerating work and reaching new platforms
&lt;/h3&gt;

&lt;p&gt;Agents gave me room both to restart an unfinished implementation and to take established libraries into a new environment. The first meant working through Matter's specifications and security requirements; the second meant adapting existing protocol code to ESP32 hardware. Neither was just a request to generate code. I still had to prepare useful logs, test tools, and equipment, but the agent could carry more of the investigation, implementation, and testing between my decisions. The following examples show those two kinds of progress.&lt;/p&gt;

&lt;h4&gt;
  
  
  Matter: restarting go-matter
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/cybergarage/go-matter" rel="noopener noreferrer"&gt;go-matter&lt;/a&gt; is a Go implementation of Matter, the smart-home interoperability standard, with a commissioner that pairs devices and then reads, writes, and invokes their functions. I started it in 2024, but the volume of specifications and the effort of turning them into a working implementation had slowed my progress.&lt;/p&gt;

&lt;p&gt;Preparing the underlying communication libraries also took time: &lt;a href="https://github.com/cybergarage/go-mdns" rel="noopener noreferrer"&gt;go-mdns&lt;/a&gt; provides multicast DNS and DNS-based service discovery, while &lt;a href="https://github.com/cybergarage/go-ble" rel="noopener noreferrer"&gt;go-ble&lt;/a&gt; provides Bluetooth Low Energy scanning and GATT communication. Before I could concentrate on Matter itself, I had to build and check these foundations as well.&lt;/p&gt;

&lt;p&gt;Even once those underlying protocols were ready, progress on Matter itself remained slow. Compared with the UPnP and ECHONET Lite implementations I had worked on, Matter required me to absorb much more background on security and cryptography alongside a large body of specifications. Getting discovery or a transport working was only the beginning; understanding how to establish trust and exchange protected messages was another substantial task.&lt;/p&gt;

&lt;p&gt;After leaving the project largely stalled for a long time, I recently returned to it when I could fit it in between other work with agents. Coding agents helped me work through those specifications, compare the code with the reference implementation, and turn failures into specific corrections. The Git history shows what that meant in practice, beyond simply adding more code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date (UTC)&lt;/th&gt;
&lt;th&gt;Progress recorded in the history&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026-09-28–30&lt;/td&gt;
&lt;td&gt;Added &lt;a href="https://github.com/cybergarage/go-matter/commit/3c74021bfe945c1e396e756ca2a8e1260a353a43" rel="noopener noreferrer"&gt;end-to-end commissioning over mDNS and UDP&lt;/a&gt;, then &lt;a href="https://github.com/cybergarage/go-matter/commit/715534fea9e0567854d0423016423570a95b751b" rel="noopener noreferrer"&gt;commissioning tests against the Matter SDK's chip-tool&lt;/a&gt; and &lt;a href="https://github.com/cybergarage/go-matter/commit/79007f218c06cc0879ca8c99e81eb23044d50382" rel="noopener noreferrer"&gt;On/Off Light operation and subscription tests&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-10-09–11&lt;/td&gt;
&lt;td&gt;Built a &lt;a href="https://github.com/cybergarage/go-matter/pull/10" rel="noopener noreferrer"&gt;full-screen matterctl controller (PR #10)&lt;/a&gt;, then added &lt;a href="https://github.com/cybergarage/go-matter/pull/15" rel="noopener noreferrer"&gt;observed device inventory (PR #15)&lt;/a&gt; and &lt;a href="https://github.com/cybergarage/go-matter/pull/16" rel="noopener noreferrer"&gt;bounded configuration writes with fresh readback (PR #16)&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-10-14&lt;/td&gt;
&lt;td&gt;Added &lt;a href="https://github.com/cybergarage/go-matter/pull/20" rel="noopener noreferrer"&gt;device-attestation verification (PR #20)&lt;/a&gt;, &lt;a href="https://github.com/cybergarage/go-matter/pull/22" rel="noopener noreferrer"&gt;attribute subscriptions (PR #22)&lt;/a&gt;, &lt;a href="https://github.com/cybergarage/go-matter/pull/23" rel="noopener noreferrer"&gt;event reads and subscriptions (PR #23)&lt;/a&gt;, &lt;a href="https://github.com/cybergarage/go-matter/pull/24" rel="noopener noreferrer"&gt;session resumption (PR #24)&lt;/a&gt;, and a &lt;a href="https://github.com/cybergarage/go-matter/pull/25" rel="noopener noreferrer"&gt;private-key store (PR #25)&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-10-15&lt;/td&gt;
&lt;td&gt;Corrected &lt;a href="https://github.com/cybergarage/go-matter/pull/31" rel="noopener noreferrer"&gt;operational discovery (PR #31)&lt;/a&gt; and &lt;a href="https://github.com/cybergarage/go-matter/pull/36" rel="noopener noreferrer"&gt;session acknowledgements (PR #36)&lt;/a&gt; based on device behavior, then prepared &lt;a href="https://github.com/cybergarage/go-matter/pull/37" rel="noopener noreferrer"&gt;v0.9.0 (PR #37)&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That progress depended on preparing an environment the agent could investigate, not simply asking it to implement a standard. I built observability around &lt;a href="https://github.com/cybergarage/go-logger" rel="noopener noreferrer"&gt;go-logger&lt;/a&gt;, including hexadecimal dumps of protocol messages, so the agent had concrete bytes and logs to examine. I also made specification-related utility programs and real Matter devices available for communication tests. Together, these gave it a way to compare expected behavior with actual exchanges and continue investigating without my interpreting every packet.&lt;/p&gt;

&lt;p&gt;At a later stage, my part often became resetting and configuring the physical devices for the next attempt. The agent would then communicate with them, analyze the resulting traces, revise the implementation, and test again. I was preparing the equipment and deciding what to try, while it carried much of the analysis-and-implementation loop.&lt;/p&gt;

&lt;h4&gt;
  
  
  ESP32: bringing existing libraries to a new platform
&lt;/h4&gt;

&lt;p&gt;I already had provisional implementation code and a rough idea of where changes were needed for ESP32. But I had left the work sitting for a long time without completing the final tests. The remaining step was to carry that tentative work through verification, not to begin from nothing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cybergarage/mupnp" rel="noopener noreferrer"&gt;mUPnP for C&lt;/a&gt; is a UPnP library I have maintained for more than twenty years. Its &lt;a href="https://github.com/cybergarage/mupnp/blob/master/doc/adoption.md" rel="noopener noreferrer"&gt;adoption history&lt;/a&gt; includes Nokia tablets and, more recently, REGZA and TCL televisions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cybergarage/uecho" rel="noopener noreferrer"&gt;uEcho for C&lt;/a&gt; is my C library for discovering and controlling devices through ECHONET Lite. ECHONET Lite is a home-appliance and energy-management communication standard developed in Japan, used to connect equipment such as lighting, air conditioners, and smart meters.&lt;/p&gt;

&lt;p&gt;With help from coding agents, I brought both libraries to ESP32 through ESP-IDF. These were new uses for existing code: discovery and control from a small Wi-Fi board, and an ECHONET Lite lighting-device example. The work progressed from porting and build checks to specific hardware tests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Development and validation history&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;mUPnP for C&lt;/td&gt;
&lt;td&gt;The &lt;a href="https://github.com/cybergarage/mupnp/pull/27" rel="noopener noreferrer"&gt;initial ESP-IDF port (PR #27)&lt;/a&gt; established cross-build and host-test coverage. &lt;a href="https://github.com/cybergarage/mupnp/pull/30" rel="noopener noreferrer"&gt;Follow-up hardware checks (PR #30)&lt;/a&gt; on an ESP32 DevKitC-VE covered discovery, rediscovery, SOAP control, and GENA notifications over Wi-Fi and IPv4. These were recorded against the 3.1.0-era implementation, not every later change.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uEcho for C&lt;/td&gt;
&lt;td&gt;The &lt;a href="https://github.com/cybergarage/uecho/pull/8" rel="noopener noreferrer"&gt;ESP-IDF component and lighting example (PR #8)&lt;/a&gt; began with ESP32/S3/C3 builds and emulator tests. &lt;a href="https://github.com/cybergarage/uecho/pull/11" rel="noopener noreferrer"&gt;Real ESP32 Wi-Fi checks (PR #11)&lt;/a&gt; then covered discovery, Get responses, and SetC on/off responses. Build coverage for other variants was not equivalent to hardware validation.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These were specific hardware configurations and examples, not verification of every feature or ESP32 variant. The &lt;a href="https://github.com/cybergarage/mupnp/blob/master/doc/espidf.md" rel="noopener noreferrer"&gt;mUPnP guide&lt;/a&gt; and &lt;a href="https://github.com/cybergarage/uecho/blob/master/doc/espidf.md" rel="noopener noreferrer"&gt;uEcho for C guide&lt;/a&gt; distinguish hardware results from build coverage. For me, the useful change was being able to extend existing libraries into another environment without carrying every porting and test step myself.&lt;/p&gt;

&lt;h3&gt;
  
  
  New reports and PRs: responding promptly with less burden
&lt;/h3&gt;

&lt;p&gt;When I publish software as open source, reports and contributions can arrive from users on platforms I do not normally use. Agents have made it easier to give those contributions prompt attention rather than let them become another backlog. I can give instructions and have the agent investigate, check the change, and handle the reply, while the reporter's diagnosis or patch provides the starting point. These three cases illustrate that lighter response cycle:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date (UTC)&lt;/th&gt;
&lt;th&gt;New work&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;td&gt;mUPnP Issue #49, reported by Brecht Sanders&lt;/td&gt;
&lt;td&gt;Four defects addressed in &lt;a href="https://github.com/cybergarage/mupnp/pull/50" rel="noopener noreferrer"&gt;PR #50&lt;/a&gt;. About &lt;strong&gt;2 h 28 min&lt;/strong&gt; from the report to the reporter's successful rebuild.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-10-30&lt;/td&gt;
&lt;td&gt;uEcho for C PR #22, contributed by alosafuzz&lt;/td&gt;
&lt;td&gt;The allocation-failure fix was reviewed and merged in about &lt;strong&gt;68 minutes&lt;/strong&gt;, with local sanitizer and test results recorded in &lt;a href="https://github.com/cybergarage/uecho/pull/22#issuecomment-6535873826" rel="noopener noreferrer"&gt;my reply (PR #22)&lt;/a&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-11-11&lt;/td&gt;
&lt;td&gt;Net::UPnP RT #182942/#182943, reported by Slaven Rezic&lt;/td&gt;
&lt;td&gt;About &lt;strong&gt;81 minutes&lt;/strong&gt; from the reports to the &lt;a href="https://metacpan.org/release/SKONNO/Net-UPnP-1.4.10" rel="noopener noreferrer"&gt;1.4.10 release&lt;/a&gt;, following &lt;a href="https://github.com/cybergarage/cpan-net-upnp/pull/12" rel="noopener noreferrer"&gt;PR #12&lt;/a&gt;. Target-environment retests remained unconfirmed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are elapsed times between events, not measurements of working time; the endpoints differ between cases. My practical involvement was largely limited to giving instructions, while the agent handled the investigation, checks, and replies.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://github.com/cybergarage/mupnp/issues/49" rel="noopener noreferrer"&gt;mUPnP Issue #49&lt;/a&gt;, Brecht Sanders reported four Windows / MinGW build and link problems involving integer types, logging names, a function declaration, and a thread function. His diagnosis and successful rebuild were essential to the result.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://github.com/cybergarage/uecho/pull/22" rel="noopener noreferrer"&gt;uEcho for C PR #22&lt;/a&gt;, &lt;strong&gt;alosafuzz&lt;/strong&gt; contributed the allocation-failure check that prevented a NULL dereference; the patch and credit belong to its contributor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cybergarage/cpan-net-upnp" rel="noopener noreferrer"&gt;Net::UPnP&lt;/a&gt; is my Perl library for UPnP discovery and control. Its &lt;a href="https://github.com/cybergarage/cpan-net-upnp/blob/master/Changes" rel="noopener noreferrer"&gt;first release was in December 2005&lt;/a&gt;, and Debian distributes it as &lt;a href="https://packages.debian.org/unstable/perl/libnet-upnp-perl" rel="noopener noreferrer"&gt;libnet-upnp-perl&lt;/a&gt;.&lt;br&gt;
Just after 1.4.9, CPAN smoke tester &lt;strong&gt;Slaven Rezic&lt;/strong&gt; reported &lt;a href="https://rt.cpan.org/Public/Bug/Display.html?id=182943" rel="noopener noreferrer"&gt;older-Perl&lt;/a&gt; and &lt;a href="https://rt.cpan.org/Public/Bug/Display.html?id=182942" rel="noopener noreferrer"&gt;long-double&lt;/a&gt; failures in the security checks introduced with 1.4.7. The agent helped fix the compatibility issue and test assumption.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security review: turning findings into checked fixes
&lt;/h3&gt;

&lt;p&gt;Vulnerabilities in open-source dependencies, including those documented in &lt;a href="https://logging.apache.org/security.html" rel="noopener noreferrer"&gt;Apache's security advisories&lt;/a&gt;, are a reminder that widely used software still needs scrutiny. I wanted to examine my own OSS with OpenAI's &lt;a href="https://help.openai.com/en/articles/20001107-codex-security" rel="noopener noreferrer"&gt;Codex Security&lt;/a&gt;. It uses a repository-specific threat model to investigate potential vulnerabilities, attempts to validate them in an isolated environment, and proposes patches for review rather than automatically changing the code.&lt;/p&gt;

&lt;p&gt;Security research can also be misused to develop attacks. OpenAI’s &lt;a href="https://help.openai.com/en/articles/20001258-openai-daybreak-trusted-access-for-cyber-overview" rel="noopener noreferrer"&gt;Daybreak Access&lt;/a&gt; provides approved users with reduced refusals for supported, authorized security work while retaining safeguards against abuse. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://help.openai.com/en/articles/20001258-openai-daybreak-trusted-access-for-cyber-overview" rel="noopener noreferrer"&gt;Daybreak Access&lt;/a&gt; can be useful for deeper security investigations, but obtaining it requires an application and identity verification, as well as preparation of a physical security key. Even without that access, I used Codex Security to find vulnerabilities in my own OSS projects. These investigations led to the following findings and fixes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Findings and follow-through&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;mUPnP for C&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/cybergarage/mupnp/pull/28" rel="noopener noreferrer"&gt;PR #28&lt;/a&gt; addressed 13 findings across HTTP and XML resource limits, TLS verification, SSDP handling, and object lifetimes. &lt;a href="https://github.com/cybergarage/mupnp/pull/29" rel="noopener noreferrer"&gt;Follow-up PR #29&lt;/a&gt; corrected shared-data lifetime and server-deletion races.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uEcho for C&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/cybergarage/uecho/pull/10" rel="noopener noreferrer"&gt;PR #10&lt;/a&gt; addressed five security boundaries involving buffers, concurrency, permissions, spoofed responses, and cached data.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CyberGarage UPnP for Java&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/cybergarage/cybergarage-upnp/pull/48" rel="noopener noreferrer"&gt;PR #48&lt;/a&gt; addressed nine findings, including XML external entities, HTTP limits, GENA event handling, and SSDP processing. Three other candidates remained deferred rather than being counted as fixed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perl Net::UPnP&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/cybergarage/cpan-net-upnp/pull/4" rel="noopener noreferrer"&gt;PR #4&lt;/a&gt; recorded seven validated findings but changed no implementation. &lt;a href="https://github.com/cybergarage/cpan-net-upnp/pull/5" rel="noopener noreferrer"&gt;PR #5&lt;/a&gt; and &lt;a href="https://github.com/cybergarage/cpan-net-upnp/pull/6" rel="noopener noreferrer"&gt;PR #6&lt;/a&gt; supplied the repairs, including HTTP deadlines and limits, SSDP destination constraints, bounded traversal, and XML escaping.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In my own experience, Codex Security sometimes warned and stopped during deeper investigations without Daybreak Access. I have now obtained the hardware security key needed for the individual access process and plan to repeat those detailed reviews once the remaining setup and approval are complete.&lt;/p&gt;

&lt;h3&gt;
  
  
  Existing debt: resolving work that had waited for years
&lt;/h3&gt;

&lt;p&gt;For an individual maintainer, the limiting factor is often the time and effort available for reproducing reports, implementing changes, and checking compatibility alongside other work. Even when I knew what needed attention, I could not always make room for it. Agents made more of that work practical to take on.&lt;/p&gt;

&lt;h4&gt;
  
  
  mUPnP for C: resolving long-standing discovery and compatibility issues
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="https://github.com/cybergarage/mupnp/releases/tag/3.1.1" rel="noopener noreferrer"&gt;mUPnP 3.1.1 release&lt;/a&gt; brought together fixes for discovery that could stall, missing access to device-description information, and resource and object-lifetime problems. It also added opt-in IPv6 support requested years earlier.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Long-standing problem&lt;/th&gt;
&lt;th&gt;Work included in 3.1.1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Discovery could hang on a dropped TCP connection (&lt;a href="https://github.com/cybergarage/mupnp/issues/10" rel="noopener noreferrer"&gt;Issue #10&lt;/a&gt;, 2014).&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/cybergarage/mupnp/pull/40" rel="noopener noreferrer"&gt;PR #40&lt;/a&gt; applied pre-connect socket timeouts and bounded connection establishment.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing access to declared state-variable information (&lt;a href="https://github.com/cybergarage/mupnp/issues/9" rel="noopener noreferrer"&gt;Issue #9&lt;/a&gt;, 2014).&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/cybergarage/mupnp/pull/41" rel="noopener noreferrer"&gt;PR #41&lt;/a&gt; and &lt;a href="https://github.com/cybergarage/mupnp/pull/46" rel="noopener noreferrer"&gt;PR #46&lt;/a&gt; exposed SCPD default values and data types.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPv6 support requested in 2016 (&lt;a href="https://github.com/cybergarage/mupnp/issues/17" rel="noopener noreferrer"&gt;Issue #17&lt;/a&gt;).&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/cybergarage/mupnp/pull/42" rel="noopener noreferrer"&gt;PR #42&lt;/a&gt; and &lt;a href="https://github.com/cybergarage/mupnp/pull/43" rel="noopener noreferrer"&gt;PR #43&lt;/a&gt; added opt-in link-local support and corrected discovery address handling. Still experimental, without real-network IPv6 validation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource and lifecycle defects.&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/cybergarage/mupnp/pull/39" rel="noopener noreferrer"&gt;PR #39&lt;/a&gt; grew HTTP buffers as data arrived; &lt;a href="https://github.com/cybergarage/mupnp/pull/44" rel="noopener noreferrer"&gt;PR #44&lt;/a&gt; fixed subscription URL leaks and a device-deletion use-after-free; &lt;a href="https://github.com/cybergarage/mupnp/pull/47" rel="noopener noreferrer"&gt;PR #47&lt;/a&gt; stopped endless startup retries without a usable interface.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These were different kinds of maintenance work, from making existing behavior reliable to exposing information applications needed and extending protocol support.&lt;/p&gt;

&lt;h4&gt;
  
  
  Net::UPnP: working through a long-standing CPAN backlog
&lt;/h4&gt;

&lt;p&gt;Before this maintenance effort, Net::UPnP had not had a release since 2018. After the October security review described above, I returned to a &lt;a href="https://rt.cpan.org/Public/Dist/Display.html?Name=Net-UPnP" rel="noopener noreferrer"&gt;CPAN RT queue&lt;/a&gt; containing 17 reports from 2006–2018, some nearly twenty years old.&lt;/p&gt;

&lt;p&gt;The releases combined security hardening, compatibility corrections, and the long-requested protocol addition:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;Main changes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://metacpan.org/release/SKONNO/Net-UPnP-1.4.7" rel="noopener noreferrer"&gt;1.4.7&lt;/a&gt; · &lt;a href="https://github.com/cybergarage/cpan-net-upnp/pull/7" rel="noopener noreferrer"&gt;PR #7&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;Shipped the security hardening, corrected documentation and example errors, and added the correctly spelled &lt;code&gt;gettotalbytesreceived()&lt;/code&gt; while retaining the old name as an alias.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://metacpan.org/release/SKONNO/Net-UPnP-1.4.8" rel="noopener noreferrer"&gt;1.4.8&lt;/a&gt; · &lt;a href="https://github.com/cybergarage/cpan-net-upnp/pull/9" rel="noopener noreferrer"&gt;PR #9&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;Fixed empty service-list handling, respected caller-supplied control URLs and joined relative URLs correctly, switched requests to HTTP/1.1 for devices rejecting HTTP/1.0, and declared the BSD license in package metadata.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="https://metacpan.org/release/SKONNO/Net-UPnP-1.4.9" rel="noopener noreferrer"&gt;1.4.9&lt;/a&gt; · &lt;a href="https://github.com/cybergarage/cpan-net-upnp/pull/11" rel="noopener noreferrer"&gt;PR #11&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;Added WANPPPConnection support for routers without WANIPConnection, addressing a request from 2010.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Across &lt;strong&gt;1.4.7–1.4.9&lt;/strong&gt;, the regression suite grew from &lt;strong&gt;193 to 236 tests&lt;/strong&gt;, without retesting every historical device. The 17 ticket closures were not 17 new fixes: six were already addressed, and three involved guidance or retest requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The developer's work and enjoyment have changed
&lt;/h2&gt;

&lt;p&gt;I used to write code at the speed of my own thinking. Working out a design and making it run felt like solving a puzzle. The process satisfied my intellectual curiosity, and completing it brought a sense of achievement.&lt;/p&gt;

&lt;h3&gt;
  
  
  PuzzleDB: a changing sense of technical challenge
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/cybergarage/puzzledb-go" rel="noopener noreferrer"&gt;PuzzleDB&lt;/a&gt; is my Go-based, multi-protocol database project, inspired by the idea of a Cosmos DB-style system with multiple database interfaces over shared services. It includes PostgreSQL- and MySQL-compatible protocol frontends, with compatibility still being developed rather than complete. I had been working on it energetically in recent years and wrote about its design in &lt;a href="https://www.amazon.com/dp/B0HGMK1L7Y?th=1" rel="noopener noreferrer"&gt;Building a Multi-Protocol NewSQL Database in Go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Building a compatible implementation also meant understanding the protocol specifications in detail, rather than simply translating them into code. That work sometimes exposed errors or inconsistencies in the documentation itself. I submitted &lt;a href="https://github.com/mysql/mysql-server/pull/568" rel="noopener noreferrer"&gt;MySQL PR #568&lt;/a&gt; to correct the payload length in a COM_QUERY example, and &lt;a href="https://github.com/mysql/mysql-server/pull/593" rel="noopener noreferrer"&gt;PR #593&lt;/a&gt; to correct COM_STMT_PREPARE examples and the documented condition for reading &lt;code&gt;warning_count&lt;/code&gt;. The corresponding MySQL bug records document these fixes in &lt;a href="https://bugs.mysql.com/bug.php?id=116339" rel="noopener noreferrer"&gt;9.2.0&lt;/a&gt; and &lt;a href="https://bugs.mysql.com/bug.php?id=117373" rel="noopener noreferrer"&gt;9.3.0&lt;/a&gt;, respectively.&lt;/p&gt;

&lt;p&gt;It was a difficult, absorbing way to learn by building. Understanding the specifications, checking them against actual packets, and contributing what I found were part of the challenge. But established implementations, protocols, and tests also make this field especially accessible to coding agents. I have lost much of the motivation that came from treating it as a personal challenge.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;What changed my sense of the challenge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PuzzleDB&lt;/td&gt;
&lt;td&gt;The pleasure lay in learning to make a complex system work myself, not only in obtaining a working database.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://pgrust.com/blog/pgrust-rebuilding-postgres-in-rust-with-ai/" rel="noopener noreferrer"&gt;pgrust&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Michael Malis describes using Codex to reimplement PostgreSQL in Rust from existing code and regression tests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/tanbamboo/rusql" rel="noopener noreferrer"&gt;rusql&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Its author describes an agent-written Rust implementation targeting MySQL 8.0 compatibility using Claude Code and Cursor. It remains a developer preview, not a production replacement.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The latter two are independent projects and their authors' accounts, not replacements of upstream PostgreSQL or MySQL or proof of full compatibility.&lt;/p&gt;

&lt;p&gt;Even with those limits, seeing such work changes my sense of the challenge. An agent may make implementation easier while taking away the particular satisfaction that made me want to implement it myself. Getting more done does not automatically replace that motivation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retro computing: rethinking a retirement hobby
&lt;/h3&gt;

&lt;p&gt;The same change has reached a hobby I had been saving for retirement: hacking retro computers. I had collected many arcade circuit boards and old computers, expecting years of enjoyment from understanding them and making them do something new. Yet my interest in that work has faded surprisingly quickly as well.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Retro-computing example&lt;/th&gt;
&lt;th&gt;Agent-assisted work and its limits&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://sanjeetnd.com/vibecoding-gameboy" rel="noopener noreferrer"&gt;Game Boy emulator&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sanjeet describes ten days with Claude Code and other models, getting Tetris running and improving graphics and audio. Incorrect simplification of pixel processing and register/joypad problems still required expert help.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://remysharp.com/2026/05/17/the-30-year-game" rel="noopener noreferrer"&gt;Marbles² game port&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Remy Sharp brought his 2002 Palm game to a 32 KB Game Boy cartridge in about a week, with Claude Code writing the code. He directed design iterations and proposed a one-bit font saving about 3 KB; the same approach failed on another game.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/ruguevara/zx-reaper" rel="noopener noreferrer"&gt;ZX-Reaper&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The project reports annotated, rebuildable assembly and a Python port of Hungry Horace, checked against gameplay and Z80 memory/state traces. Jet Set Willy had reached assembly reconstruction.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These examples do not reproduce my collection or settle every hardware problem. They do change my anticipation of the work. What I had imagined as a long, hands-on journey of discovery now looks increasingly like something I could direct an agent through. Even when the result is impressive, that is not necessarily the retirement hobby I had been looking forward to.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. How I develop now
&lt;/h2&gt;

&lt;p&gt;My work now often resembles leading a project with capable staff. I describe the objective, inspect the result, point out what is missing, and make the next decision. Instead of working through one project at a time, I now routinely delegate work across several projects in parallel. That creates a different kind of busyness: I need to keep making decisions so that I do not become their bottleneck.&lt;/p&gt;

&lt;p&gt;In my professional work, I have developed substantial systems with human teams, including &lt;a href="https://techblog.lycorp.co.jp/ja/20240516b" rel="noopener noreferrer"&gt;FractalDB&lt;/a&gt;. In that setting, making a design real involved more than solving technical problems. Aligning priorities and carrying a direction through a team could take as much care as the implementation itself. I also put considerable effort into making sure I did not become the person holding everyone else up. I find myself worrying about the same thing with agents, and that sense of needing to keep their work moving can itself be exhausting.&lt;/p&gt;

&lt;p&gt;Working with agents feels lighter. Even a large project carries less coordination overhead, and I can pursue my own design intentions more directly. Commissioning designers and securing people used to be essential to moving a project forward. Whether or not I have those skills myself, I can now readily ask an agent to take on such work. I still have to judge the result, but trying another approach no longer requires the same effort to arrange.&lt;/p&gt;

&lt;p&gt;When I wrote the code by hand, the work could move at the speed of my own thinking. With agents, the next question, result, or decision can arrive before I have finished processing the last one. Across parallel projects, that pace sometimes exceeds what I can comfortably take in. I can feel as though there is no time to pause, even though the agents are doing more of the implementation. For me, less manual coding has not necessarily meant a less tiring working day.&lt;/p&gt;

&lt;p&gt;Capable does not mean infallible. An agent may start implementing before clarifying a requirement, overlook an existing design policy, or produce code that works but does not fit the project's conventions. People also deliver imperfect work. The difference is partly in how I can respond.&lt;/p&gt;

&lt;p&gt;With a human team, each iteration costs time and attention and can affect morale. Even a valid architectural refinement or coding-style correction has to be weighed against other priorities. Good collaboration includes deciding which changes justify asking people to revisit their work.&lt;/p&gt;

&lt;p&gt;With an agent, asking for another revision feels lighter. I can revisit details I might previously have accepted as a practical compromise, while still having to make the requirements clear and judge whether the result actually meets them. If agents had feelings, though, mine might have quite a grudge against me by now.&lt;/p&gt;

&lt;p&gt;There is satisfaction in directing work across several projects and seeing neglected software improve. It is a different satisfaction from solving each puzzle with my own hands. I do not think I need to pretend that nothing has been lost in order to acknowledge what I have gained.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. If rebuilding becomes easier, what happens to OSS?
&lt;/h2&gt;

&lt;p&gt;These experiences bring me back to the larger question. A substantial reason to reuse software has been the human effort required to build it. Agents are lowering that barrier enough that starting again can feel feasible even for fairly substantial software.&lt;/p&gt;

&lt;p&gt;Previously, disagreeing with an open-source project's policies might lead me to accept the difference, propose a change, or maintain a fork. Now I also consider asking an agent to build an implementation around my own requirements. Adopting existing OSS no longer feels like the automatic first choice in every case for me. That is a change in my own decisions, not evidence that everyone will make the same choice.&lt;/p&gt;

&lt;p&gt;That does not make the work free. Computation has substantial costs even when my marginal cost feels low within a subscription. Verification, security work, compatibility, and maintenance continue to consume resources. And non-commercial open source has never been motivated by economics alone. Curiosity and the desire to solve a problem are reasons to build something even when a reusable implementation exists.&lt;/p&gt;

&lt;p&gt;Companies may make similar choices. An in-house implementation tailored to a business could become more attractive than a general package or SaaS product in some cases. Having source code locally also gives an agent something concrete to inspect and adapt. Whether that choice is economical over the whole lifecycle will depend on the organization and the software.&lt;/p&gt;

&lt;p&gt;Shared knowledge and reusable implementations still have value, whether shared by individuals, within a company, across a specialist domain, publicly, or privately. I am consolidating what I learn into libraries and tools such as &lt;a href="https://github.com/cybergarage/asciidoc-pubkit" rel="noopener noreferrer"&gt;asciidoc-pubkit&lt;/a&gt; for publishing and &lt;a href="https://github.com/cybergarage/git-history-cleaner" rel="noopener noreferrer"&gt;git-history-cleaner&lt;/a&gt; for Git workflows. Reusing that knowledge helps me avoid solving the same operational problem repeatedly.&lt;/p&gt;

&lt;p&gt;Libraries and tools also let me put repeatable operations into deterministic code instead of asking a model to interpret a skill and recreate the procedure each time. With fixed inputs, versions, and relevant environmental conditions, that code can provide behavior I can test and reproduce. A model-guided skill is useful for choosing and adapting a workflow, but its interpretation can vary between runs. Skills can call deterministic tools; I see value in combining that flexibility with a stable implementation underneath, rather than replacing every tool with instructions.&lt;/p&gt;

&lt;p&gt;This also raises a question about collaboration. When building an alternative takes less effort, I may have less reason to accept upstream decisions or spend time negotiating a change with committers. Shared maintenance and knowledge still give me reasons to participate, but the balance may shift. Projects in which a small group holds decision-making authority may have to reconsider how they involve contributors if those contributors find it easier to leave and build something else. I do not know whether that will change governance, encourage more private implementations, or lead us back to shared foundations.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Why the enthusiasm for writing and rewriting in Rust?
&lt;/h2&gt;

&lt;p&gt;The question of rebuilding software also brings me back to language choice. Microsoft’s &lt;a href="https://devblogs.microsoft.com/typescript/typescript-native-port/" rel="noopener noreferrer"&gt;native TypeScript compiler port uses Go&lt;/a&gt;; the independent &lt;a href="https://github.com/dudykr/stc" rel="noopener noreferrer"&gt;stc project attempted a TypeScript type checker in Rust&lt;/a&gt;, but was archived in 2025. Neither should be presented as evidence that coding agents caused those language choices. More recently, &lt;a href="https://pgrust.com/blog/pgrust-rebuilding-postgres-in-rust-with-ai/" rel="noopener noreferrer"&gt;pgrust&lt;/a&gt; has used coding agents to build an independent Rust implementation of PostgreSQL functionality, not an upstream PostgreSQL rewrite or a fully compatible replacement. Such examples make me question the enthusiasm for treating Rust as the natural choice for agent-written software. My own perspective comes from implementing uEcho in &lt;a href="https://github.com/cybergarage/uecho" rel="noopener noreferrer"&gt;C&lt;/a&gt;, &lt;a href="https://github.com/cybergarage/uecho-go" rel="noopener noreferrer"&gt;Go&lt;/a&gt;, and &lt;a href="https://github.com/cybergarage/uecho-rs" rel="noopener noreferrer"&gt;Rust&lt;/a&gt;, rather than from the language choice of a prominent rewrite.&lt;/p&gt;

&lt;p&gt;In my earlier &lt;a href="https://www.cybergarage.org/blog/rust-eval-loc-perf/" rel="noopener noreferrer"&gt;comparison of Rust, Go, and C for database and IoT applications&lt;/a&gt;, I preferred Go as a general-purpose option for my work. The conclusion weighed design flexibility, reuse of existing code, implementation effort, and surrounding tools, not performance alone. Working across uEcho for &lt;a href="https://github.com/cybergarage/uecho" rel="noopener noreferrer"&gt;C&lt;/a&gt;, &lt;a href="https://github.com/cybergarage/uecho-go" rel="noopener noreferrer"&gt;Go&lt;/a&gt;, and &lt;a href="https://github.com/cybergarage/uecho-rs" rel="noopener noreferrer"&gt;Rust&lt;/a&gt;, I found that ownership, lifetimes, and the scope of mutex guards in the Rust implementation made it difficult to carry over my existing shared-data design. I used copies in some places; avoiding them would have required more substantial redesign. That was an experience with my implementation, not a claim that Rust’s move semantics inherently require copying or prevent zero-copy concurrency. The benchmarks were also specific to those implementations and build settings, not a general ranking of the languages.&lt;/p&gt;

&lt;p&gt;I have tended to see Rust’s restrictions as a way to prevent mistakes that programmers can make. That leads me to ask what changes when an agent does much of the programming. Could I give it C or Go, integrate the relevant tools into its harness, and have it repeatedly investigate and correct failures instead? By harness, I mean the surrounding build, test, analysis, and feedback workflow, not simply a more detailed prompt. For C, that could include compiler warnings, static analysis, sanitizers, fuzzing, and tools such as Valgrind; for Go, it could include vet, the race detector, fuzzing, and application-level tests. These tools are not equivalent to Rust’s &lt;a href="https://doc.rust-lang.org/book/ch16-00-concurrency.html" rel="noopener noreferrer"&gt;compile-time memory-safety and data-race checks&lt;/a&gt;: agents still make mistakes, and runtime tools such as Go’s &lt;a href="https://go.dev/doc/articles/race_detector" rel="noopener noreferrer"&gt;race detector&lt;/a&gt; depend on what is actually executed. Neither approach guarantees correct application logic or freedom from deadlocks, so I want to choose through practical experience and verification rather than enthusiasm for a language.&lt;/p&gt;

&lt;p&gt;This is not only my question. In &lt;a href="https://grison.me/2026/09/08/why-go-for-coding-agents/" rel="noopener noreferrer"&gt;“Why Go is a good language for coding agents”&lt;/a&gt;, Alexandre Grison questions whether stricter compiler constraints always make a better environment for an agent. He argues that Go’s smaller set of concepts and short build-and-test loop can help an agent converge on an understandable solution. He also acknowledges the strongest counterargument: Rust’s compiler checks properties that Go’s does not and provides useful feedback for autonomous changes. His discussion supports comparing the whole feedback loop, not declaring either language universally better. &lt;a href="https://spf13.com/p/go-the-agentic-language/" rel="noopener noreferrer"&gt;Steve Francia makes a related case&lt;/a&gt;, arguing that Rust’s complexity and refactoring costs can weigh against it as an agentic default while acknowledging use cases where its guarantees and interoperability make it the better fit. These are practitioners’ arguments, not evidence that one language wins across all agents and workloads.&lt;/p&gt;

&lt;p&gt;For my projects, I want the decision to follow the requirements, existing libraries, interoperability, and measurable verification results. If an agent can make a C or Go implementation easier to maintain and test, I do not want to dismiss that option merely because a Rust rewrite sounds more modern. Equally, when compile-time guarantees materially reduce the risk, they are a reason to choose Rust even if an agent writes the code. What I am questioning is choosing Rust blindly as the default, without weighing those trade-offs against the project’s needs, not the value of its guarantees.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. More progress, a different reason to build
&lt;/h2&gt;

&lt;p&gt;Coding agents have made it more practical for me to develop new features, investigate security problems, and keep long-lived projects useful. My role has shifted toward choosing the work, giving it direction, and checking the result. The progress is real, but so is the responsibility that remains with me.&lt;/p&gt;

&lt;p&gt;What surprised me was how much of the reward had come from the process itself. I was looking forward not only to finished software or working hardware, but to becoming the person who could understand and build it. Getting the result more easily does not necessarily give me that same satisfaction.&lt;/p&gt;

&lt;p&gt;I also want to keep testing which language and verification workflow fits each project, rather than following enthusiasm for Rust rewrites or assuming that agent-written software settles the case for Rust, C, or Go. I have not settled what this means for my own motivation, or how easier alternatives will change my reasons to work with others on shared software.&lt;/p&gt;

&lt;p&gt;For now, I intend to keep developing and publishing what I make. I can value the work that coding agents have made possible while continuing to ask what I want from the act of building it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Rust Implementation Guide - from efficient learning to implementation</title>
      <dc:creator>Satoshi Konno</dc:creator>
      <pubDate>Sun, 19 Jan 2025 08:53:26 +0000</pubDate>
      <link>https://dev.to/cybergarage/rust-implementation-guide-from-efficient-learning-to-implementation-2h38</link>
      <guid>https://dev.to/cybergarage/rust-implementation-guide-from-efficient-learning-to-implementation-2h38</guid>
      <description>&lt;p&gt;In the last issue &lt;a href="https://dev.to/cybergarage/rust-vs-go-vs-c-database-and-iot-application-performance-benchmarks-30h8"&gt;[30]&lt;/a&gt;, I implemented the same application in Go, Rust, and C (+ Python) and evaluated the implementation efficiency and speed with each language. In this article, we will summarize our views on how to learn and implement Rust efficiently based on our experience.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to learn Rust
&lt;/h1&gt;

&lt;p&gt;Rust is considered a language that requires a learning period before productivity is realized &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt;. With statistics showing that more than 50% of people leave during the initial learning phase and many of them fail within a month &lt;a href="https://blog.rust-lang.org/2018/11/27/Rust-survey-2018.html" rel="noopener noreferrer"&gt;[6]&lt;/a&gt;, effective initial learning is especially important.&lt;/p&gt;

&lt;h2&gt;
  
  
  STEP1: Overcoming the Learning Readiness Phase
&lt;/h2&gt;

&lt;p&gt;There are many esoteric interpretations of the Rust compiler (without explicit solutions) &lt;a href="https://www.amazon.co.jp/dp/4873119782" rel="noopener noreferrer"&gt;[11]&lt;/a&gt;, but first learn the basics of the Rust compiler until you understand and can interact with its error content.&lt;/p&gt;

&lt;p&gt;While Rust is rife with books and materials for beginners &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt;, there is a dearth of materials aimed at practical intermediate and above &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt; has not improved much. In conclusion, instead of struggling with compilers in the dark, the shortcut to Rust mastery is to first improve basic skills with good learning materials, which are the primary resources shown below &lt;a href="https://msrc.microsoft.com/blog/2019/10/an-interns-experience-with-rust/" rel="noopener noreferrer"&gt;[7]&lt;/a&gt;&lt;a href="https://zenn.dev/magurotuna/books/tokio-tutorial-ja/viewer/preface" rel="noopener noreferrer"&gt;[8]&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;[1] The Rust Programming Language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.jp/dp/4873119782" rel="noopener noreferrer"&gt;[2] Programming Rust 2nd Edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also scattered opinions that C/C++ is easy for skilled users to learn &lt;a href="https://msrc.microsoft.com/blog/2019/10/an-interns-experience-with-rust/" rel="noopener noreferrer"&gt;[7]&lt;/a&gt;&lt;a href="https://msrc-blog.microsoft.com/2019/11/07/using-rust-in-windows/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt;&lt;a href="https://www.youtube.com/watch?v=kylqq8pEgRs" rel="noopener noreferrer"&gt;[10]&lt;/a&gt;, so in terms of deepening the usefulness of Rust, it is also important to deepen the C/C ++ language may also be a shortcut to learning Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  STEP2: Practical project challenges
&lt;/h2&gt;

&lt;p&gt;If your goal is to "learn Rust," you will have achieved your objective at this stage. However, the difficulty of Rust lies in the difficulty of practice, after overcoming the preparatory phase of the learning curve &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt;&lt;a href="https://keens.github.io/blog/2019/04/21/jissenrustnyuumon_wokaitayo/" rel="noopener noreferrer"&gt;[11]&lt;/a&gt;&lt;a href="https://stackoverflow.com/questions/30681468/passing-mutable-self-reference-to-method-of-owned-object" rel="noopener noreferrer"&gt;[12]&lt;/a&gt;&lt;a href="https://rust-unofficial.github.io/too-many-lists/" rel="noopener noreferrer"&gt;[15]&lt;/a&gt;. In conclusion, it seems to be efficient for Rust learning to start some kind of practical project &lt;a href="https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html" rel="noopener noreferrer"&gt;[13]&lt;/a&gt;&lt;a href="https://gihyo.jp/article/2022/09/rust-monthly-topics-01" rel="noopener noreferrer"&gt;[14]&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If it does not follow the semantics of Rust, design patterns (experience) in other programming languages cannot be brought in directly &lt;a href="https://rust-unofficial.github.io/patterns/" rel="noopener noreferrer"&gt;[16]&lt;/a&gt;, and trial and error is required. In terms of comparison with existing languages, the following tutorials may be helpful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rust-unofficial.github.io/too-many-lists/" rel="noopener noreferrer"&gt;[15] Learning Rust With Entirely Too Many Linked Lists&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As mentioned above, the situation &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt;, where there is a dearth of material aimed at the practical intermediate level and above, has not improved very much. As an actual example, you can read the divergence between the following materials recommended for beginners to step up and the practical subject matter &lt;a href="https://rust-unofficial.github.io/too-many-lists/" rel="noopener noreferrer"&gt;[15]&lt;/a&gt; shown in the above tutorial.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/stable/rust-by-example/" rel="noopener noreferrer"&gt;[3] Rust By Example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rust-lang-nursery.github.io/rust-cookbook/" rel="noopener noreferrer"&gt;[17] Rust Cookbook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, because there is not as much "Effective" intermediate and above information as in other languages, you need to struggle with the Rust compiler and establish (pioneer) the following design patterns (experiences) &lt;a href="https://rust-unofficial.github.io/patterns/" rel="noopener noreferrer"&gt;[16]&lt;/a&gt; must be established (pioneered) by yourself while struggling with the Rust compiler.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rust-unofficial.github.io/patterns/" rel="noopener noreferrer"&gt;[16] Rust Design Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/README.html" rel="noopener noreferrer"&gt;[18] Effective Rust - The Rust Programming Language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lurklurk.org/effective-rust/" rel="noopener noreferrer"&gt;[19] Effective Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/1.30.0/book/2018-edition/index.html" rel="noopener noreferrer"&gt;[20] Effective Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many books and materials that are considered intermediate level are simplified by limiting the field of application, both in a good and bad way. In conclusion, there are few things better than official materials, and a practical shortcut may be to deepen understanding by trial and error while going back to official materials in practice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;[1] The Rust Programming Language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.jp/dp/4873119782" rel="noopener noreferrer"&gt;[2] Programming Rust 2nd Edition&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Books that are field-specific in title are an effective way to gain implementation knowledge of Rust in a specific area, serving as a Rosetta Stone of sorts. However, it should be understood only as one implementation example, and whether it is the best way or not may be reconsidered through practice.&lt;/p&gt;

&lt;h1&gt;
  
  
  Rust at Work
&lt;/h1&gt;

&lt;p&gt;The most recent Rust community survey included a "Rust at Work" item &lt;a href="https://blog.rust-lang.org/2022/12/05/survey-launch.html" rel="noopener noreferrer"&gt;[21]&lt;/a&gt;&lt;a href="https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html" rel="noopener noreferrer"&gt;[13]&lt;/a&gt;, which emphasizes the adoption of Rut as a professional language. The most recent, 2021 survey results &lt;a href="https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html" rel="noopener noreferrer"&gt;[13]&lt;/a&gt; show that while the rate of use at work has increased significantly from 42% to 59% in the previous year, industry adoption The lack of adoption in the industry was cited as the biggest concern (38%) for Rust's future.&lt;/p&gt;

&lt;p&gt;Basically, a programming language is a means to an end and should be selected based on the circumstances of the target project and team. Based on this assumption, here is a list of items to consider when adopting Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consideration of project characteristics
&lt;/h2&gt;

&lt;p&gt;First, it is important to determine whether the project to which Rust is applied is compatible with Rust semantics, in the sense of avoiding implementation complexity and performance degradation in Rust. Simply put, a project that is not stateless and involves parallel processing with data sharing in the Rust processing unit cannot be handled solely with Rust's move (Move) semantics, and ownership and lifetime management will become more complex.&lt;/p&gt;

&lt;p&gt;For example, stateless web applications and&lt;a href="https://www.usenix.org/legacy/event/osdi04/tech/full_papers/dean/dean_html/" rel="noopener noreferrer"&gt;[31]&lt;/a&gt;, which can be handled naturally with Rust's move (Move) semantics and SEDA&lt;a href="https://dl.acm.org/doi/abs/10.1145/502059.502057" rel="noopener noreferrer"&gt;[32]&lt;/a&gt;, which are concurrency models that do not require data sharing, the semantics of Rust adoption is unlikely to be a problem.&lt;/p&gt;

&lt;p&gt;Also, if we ignore the compatibility and complexity of the implementation, the adoption track record of Rust in the same field as the project, and for what applications and at what scale it has been implemented, will be a good guide for making an adoption decision &lt;a href="https://github.com/rust-unofficial/awesome-rust" rel="noopener noreferrer"&gt;[14]&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Secure core members
&lt;/h2&gt;

&lt;p&gt;What is clear is that if you are at a stage where you do not have personnel proficient in Rust, and you cannot determine the compatibility of Rust with the characteristics of your project, you should avoid hiring Rust. Simply put, you should avoid hiring Rust out of curiosity.&lt;/p&gt;

&lt;p&gt;It is essential to have a core team that is proficient in Rust. Conversely, if the core team has established design patterns for Rust implementation, it will be easier to add more people to the project, even if they are new to Rust.&lt;/p&gt;

&lt;p&gt;Basically, if core members have established a template or methodology for implementing Rust in a project, new members can follow that style and extend the project structure even if they are not necessarily proficient in Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope of Standard Library Offerings
&lt;/h2&gt;

&lt;p&gt;Rust is a language that has strengths in system programming and situations where high performance is required, but the coverage and functionality of the standard library is on the poor side, similar to the C language. The standard library provided lacks functionality and speed &lt;a href="https://dev.to/cybergarage/rust-vs-go-vs-c-database-and-iot-application-performance-benchmarks-30h8"&gt;[30]&lt;/a&gt;. memo/rust-eval-loc-perf/)&lt;a href="https://nnethercote.github.io/perf-book/" rel="noopener noreferrer"&gt;[30]&lt;/a&gt;&lt;a href="https://prev.rust-lang.org/faq.htm" rel="noopener noreferrer"&gt;[31]&lt;/a&gt;, and other maturity challenges In some cases, the&lt;/p&gt;

&lt;p&gt;Realistically, considering the scope of standard library offerings and the economics of the project, we will have to take the approach of developing a combination of third-party crates. In particular, for complex data structures and highly parallel processing functions, we are forced to rely heavily on third-party crates.&lt;/p&gt;

&lt;p&gt;However, depending on the quality and maintenance status of the crate, the project may be more at risk, and this should be taken into consideration. Also, as with Perl's CPAN, crates are registered on a first-come, first-served basis, so even if a crate is published under a major name, there may be alternative crates of higher quality and more actively developed, so thorough investigation is essential before adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inheritance of past assets
&lt;/h2&gt;

&lt;p&gt;Realistically, many will want to leverage existing development assets rather than implement exclusively in Rust, and Rust continues to see a high demand for interoperability with C/C++ language assets as an important issue &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt;&lt;a href="https://atmarkit.itmedia.co.jp/ait/articles/1907/24/news130.html" rel="noopener noreferrer"&gt;[24]&lt;/a&gt;&lt;a href="https://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/" rel="noopener noreferrer"&gt;[25]&lt;/a&gt;&lt;a href="https://blog.rust-lang.org/2020/12/16/rust-survey-2020.html" rel="noopener noreferrer"&gt;[26]&lt;/a&gt;&lt;a href="https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.html" rel="noopener noreferrer"&gt;[27]&lt;/a&gt;&lt;a href="https://security.googleblog.com/2021/09/an-update-on-memory-safety-in-chrome.html" rel="noopener noreferrer"&gt;[28]&lt;/a&gt;&lt;a href="https://www.chromium.org/Home/chromium-security/memory-safety/rust-and-c-interoperability/" rel="noopener noreferrer"&gt;[29]&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Compared to C++, Objective-C, and Go, where interoperability with C is guaranteed at the language level and can be used simply by including header files, Rust's interoperability is one major barrier. Rust provides a FFI (Foreign Function Interface) to interface with other languages, but interoperation with C requires a separate FFI definition that shows the correspondence with Rust types. rust-bindgen&lt;a href="https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.html" rel="noopener noreferrer"&gt;[27]&lt;/a&gt;, but there are also FFI generators such as &lt;a href="https://security.googleblog.com/2021/09/an-update-on-memory-safety-in-chrome.html" rel="noopener noreferrer"&gt;[28]&lt;/a&gt;&lt;a href="https://www.chromium.org/Home/chromium-security/memory-safety/rust-and-c-interoperability/" rel="noopener noreferrer"&gt;[29]&lt;/a&gt; will be an important factor in the decision to adopt Rust.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;While Rust is highly secure and performs well, learning Rust involves steep hurdles and struggles with the compiler, so effective learning methods and preparation are necessary. In the initial stages, it is important to cultivate a basic ability to understand and respond to compiler error messages, and to ensure that you learn Rust-specific concepts by using good official materials and books for beginning students.&lt;/p&gt;

&lt;p&gt;When considering the adoption of Rust for a project, it is particularly important to confirm the project characteristics and the Rust proficiency of the team, and to establish appropriate design patterns and support systems.&lt;/p&gt;

&lt;p&gt;We hope that by utilizing the learning materials and reference materials introduced in this article, you will be able to maximize the potential of Rust by establishing basic skills and then putting them into practice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;[1] The Rust Programming Language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.jp/dp/4873119782" rel="noopener noreferrer"&gt;[2] Programming Rust 第2版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html" rel="noopener noreferrer"&gt;[3] Rust Survey 2021 Results | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2020/12/16/rust-survey-2020.html" rel="noopener noreferrer"&gt;[4] Rust Survey 2020 Results | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5] Rust Survey 2019 Results | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2018/11/27/Rust-survey-2018.html" rel="noopener noreferrer"&gt;[6] Rust Survey 2018 Results | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gihyo.jp/article/2022/09/rust-monthly-topics-01" rel="noopener noreferrer"&gt;[7] データでわかるRustの開発者達 〜Rust Survey 2021の深堀 | gihyo.jp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2022/12/05/survey-launch.html" rel="noopener noreferrer"&gt;[8] Launching the 2022 State of Rust Survey | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9] ECHONET Lite規格書 | ECHONET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[10] Machine Readable Appendix Release | ECHONET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho" rel="noopener noreferrer"&gt;[11] uEcho for C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-rs" rel="noopener noreferrer"&gt;[12] uEcho for Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-go" rel="noopener noreferrer"&gt;[13] uEcho for Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-py" rel="noopener noreferrer"&gt;[14] uEcho for Pyton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-bench" rel="noopener noreferrer"&gt;[15] Benchmark utility package for uEcho implementations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/XAMPPRocky/tokei" rel="noopener noreferrer"&gt;[16] Tokei (時計)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nnethercote.github.io/perf-book/" rel="noopener noreferrer"&gt;[17] The Rust Performance Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prev.rust-lang.org/faq.htm" rel="noopener noreferrer"&gt;[18] The Rust Language FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19] Redis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;[20] Tokio - An asynchronous Rust runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21] tokio-rs/mini-redis: Incomplete Redis client and server implementation using Tokio - for learning purposes only&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tokio-rs/mini-redis/issues/1" rel="noopener noreferrer"&gt;[22] Initial benchmark results · Issue #1 · tokio-rs/mini-redis · GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23] cybergarage/go-redis: The go-redis is a database framework for implementing a Redis compatible server using Go easily.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/jp/news/2020/02/ibm-stop-work-swift-server/" rel="noopener noreferrer"&gt;[23] IBMがSwift開発を終了 - Chris Bailey氏とのQ&amp;amp;A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rust-unofficial.github.io/patterns/" rel="noopener noreferrer"&gt;[24] Rust Design Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atmarkit.itmedia.co.jp/ait/articles/1907/24/news130.html" rel="noopener noreferrer"&gt;[25] Microsoftが「Rust」言語を導入、安全性以外の理由あり（続報）：性能や安全性以外にも評価あり - ＠IT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/" rel="noopener noreferrer"&gt;[26] Why Rust for safe systems programming – Microsoft Security Response Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.html" rel="noopener noreferrer"&gt;[27] Google Online Security Blog: Supporting the Use of Rust in the Chromium Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://security.googleblog.com/2021/09/an-update-on-memory-safety-in-chrome.html" rel="noopener noreferrer"&gt;[28] Google Online Security Blog: An update on Memory Safety in Chrome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.chromium.org/Home/chromium-security/memory-safety/rust-and-c-interoperability/" rel="noopener noreferrer"&gt;[29] Rust and C++ interoperability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/cybergarage/rust-vs-go-vs-c-database-and-iot-application-performance-benchmarks-30h8"&gt;[30] Rust vs Go vs C: Database and IoT Application Performance Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.usenix.org/legacy/event/osdi04/tech/full_papers/dean/dean_html/" rel="noopener noreferrer"&gt;[31] MapReduce: Simplified Data Processing on Large Clusters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dl.acm.org/doi/abs/10.1145/502059.502057" rel="noopener noreferrer"&gt;[32] SEDA: an architecture for well-conditioned, scalable internet services
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rust</category>
    </item>
    <item>
      <title>Rust vs Go vs C: Database and IoT Application Performance Benchmarks</title>
      <dc:creator>Satoshi Konno</dc:creator>
      <pubDate>Sun, 19 Jan 2025 08:46:03 +0000</pubDate>
      <link>https://dev.to/cybergarage/rust-vs-go-vs-c-database-and-iot-application-performance-benchmarks-30h8</link>
      <guid>https://dev.to/cybergarage/rust-vs-go-vs-c-database-and-iot-application-performance-benchmarks-30h8</guid>
      <description>&lt;p&gt;Rust is a language designed to be both secure and fast &lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;[1]&lt;/a&gt;, and in recent years, it has been expected to make further strides as a professional language employed in business &lt;a href="https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html" rel="noopener noreferrer"&gt;[3]&lt;/a&gt; &lt;a href="https://blog.rust-lang.org/2022/12/05/survey-launch.html" rel="noopener noreferrer"&gt;[8]&lt;/a&gt;. However, the results of the 2021 survey &lt;a href="https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html" rel="noopener noreferrer"&gt;[3]&lt;/a&gt; also show that while the rate of use at work has increased significantly from 42% to 59%, the lack of actual adoption in the industry was cited as the biggest concern (38%) about Rust's future. &lt;/p&gt;

&lt;p&gt;In this article, to determine the practicality of Rust, we sought to compare and evaluate its implementation against application implementations with the same specifications in other programming languages, such as C and Go. We prepared two targeted evaluation applications, Database (Redis) and IoT (ECHONET Lite), to assess the efficiency and performance of practical Rust implementation.&lt;/p&gt;

&lt;p&gt;In summary, Go is considered the best successor to C from a Better C perspective, followed by Objective-C, Rust, and C++. Rust offers safety and speed but has limitations in productivity, interoperability, and programming flexibility. Despite these challenges, Go stands out for its implementation efficiency and stable performance, making it a safe choice for general-purpose applications.&lt;/p&gt;

&lt;h1&gt;
  
  
  Evaluation 1 - Database Application (Redis)
&lt;/h1&gt;

&lt;p&gt;This evaluation will compare C, Rust, and Go implementations of the Redis &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19]&lt;/a&gt; specification in the database area as the same application. The official Redis implementation &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19]&lt;/a&gt; is in C, while the Rust and Go implementations are unofficial subset implementations. The following is a list of databases using Redis used in this evaluation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19] Redis (Official Implementation&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21] mini-redis (Unofficial Rust implementation)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23] go-redis (Unofficial Rust implementation)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Rust implementation is mini-redis &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt;, which was released as a learning tool for the Tokio &lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;[20]&lt;/a&gt; library, and the Go implementation is a sample implementation (go-redis-server) of my Redis-compatible database implementation go-redis &lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23]&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Compared to the official Redis implementation &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19]&lt;/a&gt;, mini-redis &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt; and go-redis &lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23]&lt;/a&gt; are subset implementations, and therefore cannot be evaluated for implementation efficiency using LOC (Lines of Code), only for performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evaluation Benchmarks
&lt;/h2&gt;

&lt;p&gt;The benchmark programs evaluated were performed with redis-benchmark, the official benchmark tool for Redis. The benchmarks are not a full set but are limited to SET/GET commands and are run every 10,000 iterations with the standard 50 threads.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuuxqiqp1utugk139m45q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuuxqiqp1utugk139m45q.png" width="799" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason for being limited to only basic SET/GET commands is that mini-redis &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt; is only a minimal command implementation, such as SET/GET commands, and we followed the benchmark parameters &lt;a href="https://github.com/tokio-rs/mini-redis/issues/1" rel="noopener noreferrer"&gt;[22]&lt;/a&gt; in mini-redis &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt;. Note that mini-redis &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt; is the latest version at the time of evaluation and the environment is "Mac mini (2018) + macOS 12.6".&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Evaluation - C &amp;gt; Go &amp;gt; Rust
&lt;/h2&gt;

&lt;p&gt;The results of the SET/GET command execution by "redis-benchmark" are shown below. The 99th percentile (p99(ratio)) value, which is used as an indicator for database operation, is shown at the right end of the table along with the performance ratio based on the C language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feabukttfsxliegq35oku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feabukttfsxliegq35oku.png" width="798" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the evaluation benchmarks, the official implementations of redis-server in C &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19]&lt;/a&gt;, go-redis in Go &lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23]&lt;/a&gt;, and mini-redis in Rust &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt; were faster, in that order. A graph of the above table is shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkcs2jop34b4v0yk7yxfs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkcs2jop34b4v0yk7yxfs.png" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The C redis-server &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19]&lt;/a&gt; was optimized and was about 3 times faster than the sample implementations in Go and Rust. Both Go's go-redis &lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23]&lt;/a&gt; and Rust's mini-redis &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt; were implemented as samples, and both have room for improvement. Taking this into consideration, a brief review of the evaluation results for each programming language is presented below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rust
&lt;/h3&gt;

&lt;p&gt;Compared to the official C redis-server &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19]&lt;/a&gt;, SET: 28% and GET: 41% slower, and compared to the Go implementation go-redis &lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23]&lt;/a&gt;, SET: 78% (=2.879/3.663) and GET: 88% (=2.167/2.455) slower.&lt;/p&gt;

&lt;p&gt;Since the Tokio &lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;[20]&lt;/a&gt; library has been released for training purposes, it is assumed that full-scale optimization has not yet been performed. However, to some extent, optimization seems to have been performed by comparing performance with the official implementation of Redis &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19]&lt;/a&gt; &lt;a href="https://github.com/tokio-rs/mini-redis/issues/1" rel="noopener noreferrer"&gt;[22]&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is positioned for learning the Tokio &lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;[20]&lt;/a&gt; library, and the implementation basically uses the Tokio &lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;[20]&lt;/a&gt; library, with the network part built based on the Tokio &lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;[20]&lt;/a&gt; TCP server (tokio::net::TcpListener). However, the key-value data management part of the database is implemented with the HashMap of the standard (std) library and Mutex of the standard (std) library for exclusive control, as in the implementation of Evaluation 2. Performance issues may be based on performance issues of the standard (std) library &lt;a href="https://prev.rust-lang.org/faq.htm" rel="noopener noreferrer"&gt;[18]&lt;/a&gt;, such as HashMap &lt;a href="https://nnethercote.github.io/perf-book/" rel="noopener noreferrer"&gt;[17]&lt;/a&gt;, as in Evaluation 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  Go
&lt;/h3&gt;

&lt;p&gt;Compared to the official C redis-server &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19]&lt;/a&gt;, SET: 35% and GET: 46% faster, while compared to Rust's mini-redis &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt;, SET: 127% (=3.663/2.879) and GET: 113% (=2.455/2.167) faster.&lt;/p&gt;

&lt;p&gt;Go-redis &lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23]&lt;/a&gt; is a framework for implementing Redis-compatible databases, and like mini-redis &lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21]&lt;/a&gt;, the target of this evaluation is a sample implementation, so the implementation is simple. The speed difference from the official implementation was unexpected due to the assumption that there was little room for optimization.&lt;/p&gt;

&lt;p&gt;Go-redis &lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23]&lt;/a&gt; and the sample implementation "go-redis-server" are implemented only with the standard library, and the key-value data management part of the database is implemented with sync.Map. It will be necessary to refer to the official implementation for performance differences with the official implementation, in parallel with identifying bottlenecks in the profiling.&lt;/p&gt;

&lt;h1&gt;
  
  
  Evaluation 2 - IoT Applications (ECHONET Lite)
&lt;/h1&gt;

&lt;p&gt;This evaluation targets client-server function implementations of ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt;, a communication protocol in the IoT field. This implementation is an evaluation of an application for which the target requirement specifications (= ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; specifications) are the same, and the design and implementers are the same.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho" rel="noopener noreferrer"&gt;[11] uecho (ECHONET Lite framework for C)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-rs" rel="noopener noreferrer"&gt;[12] uecho-rs (ECHONET Lite framework for Rust)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-go" rel="noopener noreferrer"&gt;[13] uecho-go (ECHONET Lite framework for Go)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-py" rel="noopener noreferrer"&gt;[14] uecho-py (ECHONET Lite framework for Python)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Evaluation Frameworks
&lt;/h2&gt;

&lt;p&gt;The Rust implementation &lt;a href="https://github.com/cybergarage/uecho-rs" rel="noopener noreferrer"&gt;[12]&lt;/a&gt; of ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; implemented in C &lt;a href="https://github.com/cybergarage/uecho" rel="noopener noreferrer"&gt;[11]&lt;/a&gt;, Go &lt;a href="https://github.com/cybergarage/uecho-go" rel="noopener noreferrer"&gt;[13]&lt;/a&gt;, and Python &lt;a href="https://github.com/cybergarage/uecho-py" rel="noopener noreferrer"&gt;[14]&lt;/a&gt; are compared. The basic ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; functions are implemented using the same design as far as possible, but there are some differences in function implementation between the languages. An overview of the differences in implemented functions is shown in the figure below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkc8f32espch35oudhcb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkc8f32espch35oudhcb.png" width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; framework implementation subject to this evaluation was implemented in C, Go, Python, and Rust, in that order, and basically follows the same design.&lt;/p&gt;

&lt;p&gt;As explained in the ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; Specification, the basic Device function, the Controller function for operating devices, and the Database function for standard devices &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[10]&lt;/a&gt; defined in ECHONET Lite are implemented in all programming languages. &lt;/p&gt;

&lt;p&gt;However, for the transport layer of the ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; specification, only the mandatory UDP communication function is implemented in all programming languages, while the optional TCP communicator is implemented only in C &lt;a href="https://github.com/cybergarage/uecho" rel="noopener noreferrer"&gt;[11]&lt;/a&gt; and Go &lt;a href="https://github.com/cybergarage/uecho-go" rel="noopener noreferrer"&gt;[13]&lt;/a&gt;, with implementation in Rust &lt;a href="https://github.com/cybergarage/uecho-rs" rel="noopener noreferrer"&gt;[12]&lt;/a&gt; and Python &lt;a href="https://github.com/cybergarage/uecho-py" rel="noopener noreferrer"&gt;[14]&lt;/a&gt; omitted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation Efficiency (≠ Effort) Evaluation - Python &amp;gt; Rust ≈ Go &amp;gt; C
&lt;/h2&gt;

&lt;p&gt;The efficiency of implementation in Rust was evaluated in terms of lines of code (LOC), which was calculated using Tokei &lt;a href="https://github.com/XAMPPRocky/tokei" rel="noopener noreferrer"&gt;[16]&lt;/a&gt; and excludes comments and blank lines. The results of LOC calculation are shown in the figure below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9j6vvvgbjrjxg9o5je7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv9j6vvvgbjrjxg9o5je7.png" width="799" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For Auto, only the source code, which is the automatically generated code defining the ECHONET Lite standard devices &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[10]&lt;/a&gt; and excluding the C language header file, was subject to evaluation. The graphs in the above table are shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5z8dqek027wgwldsdzcj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5z8dqek027wgwldsdzcj.png" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Taking into account the range of implemented functionality, the LOC evaluation results in the following order: Python &amp;gt; Rust ≈ Go &amp;gt; C, with the least implemented code. Below is a brief review of each programming language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rust
&lt;/h3&gt;

&lt;p&gt;The LOC results show that (although there is no implementation of TCP functionality), the implementation rating is equivalent to Go, with a LOC efficiency of 53% of that of C. This implementation with Rust was implemented using only standard (std) libraries such as Mutex, with the exception of the UDPSocket issue described below.&lt;/p&gt;

&lt;p&gt;Rust is a language that generally requires a learning period before it feels productive &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt;. Therefore, in Rust, it is not simply ‘less LOC = more implementation effort’: even code with a low LOC often takes a long time to implement because the developer struggles with the Rust compiler. Also, the extremely high LOC of auto-generated code is due to the specification of a standard maximum line width (max_width=100) in Rust's formatter (rustfmt), which is excluded from the evaluation.&lt;/p&gt;

&lt;p&gt;There are also restrictions due to Rust-specific move semantics and lifetime, which can make it impossible to bring in designs from other languages, which can lead to high design costs. In the current implementation, some design changes were made due to the limitations of introducing the Observer pattern for trait objects and the locking interval synchronised with the Mutex lifetime.&lt;/p&gt;

&lt;h3&gt;
  
  
  C
&lt;/h3&gt;

&lt;p&gt;The implementation in C resulted in the largest LOC. The reason for this is that this implementation does not use external libraries and includes self contained libraries (e.g. strings, list structures, object-oriented structures, etc.) which are not needed in other languages, and wrapper classes (e.g. Mutex, Thread, etc.) for portability. The home-grown libraries are shared with other C projects and are not as heavily implemented in this application as the LOC figures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Go
&lt;/h3&gt;

&lt;p&gt;The LOC results show that the implementation efficiency is comparable to Rust, with an implementation rating of 63% of the source code compared to C. In Rust, there were issues with some of the standard libraries, but in the Go language, the implementation was carried out using only the standard libraries.&lt;/p&gt;

&lt;p&gt;Basically, the C design is implemented in the Go language as it is in C. Unlike the implementation in Rust, the design in C can be diverted and implemented, and there is flexibility. In addition, the standard library is more extensive than that of the C language, which can be evaluated as being directly related to ‘less LOC = less implementation time’.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;

&lt;p&gt;The implementation in Python has the lowest LOC result in this implementation evaluation, because Python does not require parentheses ({}) in code block expressions, so a comparison with other languages that require parentheses (C, Rust, Go) requires a subtraction. Also, in comparison to Rust, the fact that implementations can be inherited contributes to the reduction of LOC.&lt;/p&gt;

&lt;p&gt;Python also has the flexibility to straightforwardly transfer designs from C and Go. Apart from the execution speed issues described below, it may be the best prototyping language&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Evaluation - Go &amp;gt; C &amp;gt; Rust &amp;gt; Python
&lt;/h2&gt;

&lt;p&gt;The execution performance of Rust was evaluated for the same level of functionality of ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt;, the target of the evaluation, with the same basic design implementation. The benchmark program evaluated was a node in which the controller and objects of ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; were implemented.&lt;/p&gt;

&lt;h3&gt;
  
  
  Evaluation Benchmarks
&lt;/h3&gt;

&lt;p&gt;In the benchmark program evaluated, the ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; controller is a UDP client, and the object is a UDP server. The main loop, which is the basic sequence of the benchmark, consists of 12 UDP requests (Requests) from the controller and 12 UDP responses (Responses) from the object per execution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyy76jd84r0acz3dybpaq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyy76jd84r0acz3dybpaq.png" width="600" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To explain this in accordance with the ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; Specification, the ECHONET Lite controller itself is discovered by a UDP multicast request (ESV: 0x62) and the implementation-required properties of the node profile object (0x0EF001) contained in the discovered controller node (0x0EF001) are set to the following values (12). The benchmark is 10,000 iterations of the request (ESV:0x62) response (ESV:0x72) operation with the UDP protocol for the values of &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[10]&lt;/a&gt; (12 values). For the evaluation of implemented code, no optimization options were used in each environment. The environment is "Mac mini (2018) + macOS 12.6" and the details of the evaluation scripts are available here &lt;a href="https://github.com/cybergarage/uecho-bench" rel="noopener noreferrer"&gt;[15]&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance evaluation results
&lt;/h3&gt;

&lt;p&gt;The performance evaluation was measured by using the time command to measure the execution time of 10,000 iterations of the basic sequence shown in the evaluation benchmarks. The evaluation results are shown below, along with an overview of the compilation conditions and implementation techniques for each programming language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5t3r6nnna9zshcyb6po3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5t3r6nnna9zshcyb6po3.png" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the evaluation benchmarks, Go was the fastest implementation, followed by C, Rust, and Python. Since UDP communication is asynchronous, data transmission and reception from a request (Request) to a response (Response) are implemented using the condition and channel mechanisms of each programming language. A graph of the above table is shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2k2hbqasv39xxyweeoj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2k2hbqasv39xxyweeoj9.png" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Python was excluded from the scalability analysis due to its extremely slow execution speed. In order to compare performance with C language, the performance ratio of each programming language relative to C language is shown in the figure below, along with a brief evaluation of the performance results for each programming language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxv8g05chocn9j6w7qkfu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxv8g05chocn9j6w7qkfu.png" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust
&lt;/h4&gt;

&lt;p&gt;The Rust implementation performed worse than the Go and C implementations, being only 33% as fast as C and about 20% (=33/160) as fast as Go. While the system (sys) time is comparable to Go and faster than C, the user (user) time is larger than in C and Go.&lt;/p&gt;

&lt;p&gt;The cause needs to be investigated, but according to "The Rust Performance Book" &lt;a href="https://nnethercote.github.io/perf-book/" rel="noopener noreferrer"&gt;[17]&lt;/a&gt; and "The Rust Language FAQ" &lt;a href="https://prev.rust-lang.org/faq.htm" rel="noopener noreferrer"&gt;[18]&lt;/a&gt;, there are some standard (std) libraries, such as HashMap, that may be slow under certain circumstances.&lt;/p&gt;

&lt;p&gt;In addition, the standard (std) library Mutex, which is used extensively in this implementation, is difficult to handle because its valid interval is the same as that of the target object, and there are parts where copy semantics are unavoidably used to avoid this. Other language implementations are zero-copy (Zero Copy), so programmatically there is room for improvement (although significant design changes are required).&lt;/p&gt;

&lt;p&gt;In addition, the standard (std) library UDPSocket cannot support socket creation by the same port number, so a non-standard crate must be used in conjunction with the implementation of IoT-related protocols such as ECHONET Lite &lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9]&lt;/a&gt; and mDNS, which are the target of this implementation. In addition, although IPv6 functionality has been implemented, it cannot be enabled at this time due to an error.&lt;/p&gt;

&lt;h4&gt;
  
  
  C
&lt;/h4&gt;

&lt;p&gt;Basically, the user (user) time is the fastest, but the system (sys) time is 2.5 times slower than Go and Rust. We had no concerns about the performance of the C language until this evaluation, but there may be issues with the use of standard libraries such as pthreads.&lt;/p&gt;

&lt;h4&gt;
  
  
  Go
&lt;/h4&gt;

&lt;p&gt;The Go implementation was the fastest in this evaluation benchmark, 1.6 times (=160%) faster than the C implementation and 5 times (=4.8=160%/33%) faster than the Rust implementation. It seems that the best results were obtained by writing a straightforward program.&lt;/p&gt;

&lt;h4&gt;
  
  
  Python
&lt;/h4&gt;

&lt;p&gt;As might be expected, the Python implementation produced the lowest results in this evaluation benchmark. The system (sys) time degraded by only 1/2 (=53%) compared to C, but the user (user) time performance is less than 1/100 (&amp;lt;1%), a characteristic of the interpreter execution since it is a pure Python implementation.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conslusion
&lt;/h1&gt;

&lt;p&gt;If I were to evaluate Go as the successor to C and from a Better C perspective, I would personally rank Go = (Objective-C) &amp;gt; Rust &amp;gt; C++. C++ is overspecified in terms of Better C, and Objective-C has stopped evolving since 2007 (2.0) when ARC was introduced. Swift, the supposed successor, also has an uncertain multi-platform future &lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23]&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Regarding productivity, Rust is a language that generally requires a learning period before it feels productive &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt;. It is a language that is both safe and fast &lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;[1]&lt;/a&gt;, but due to its limitations, it is a language that forces a struggle with the compiler, both good and bad. If it does not follow Rust's semantics, it is not possible to bring in design patterns (experience) from other languages. However, its limitations make it a language that requires contending with the compiler, in both good and bad ways.&lt;/p&gt;

&lt;p&gt;In terms of productivity, it is often desirable to use existing development assets rather than implementations that can be completed only in Rust, as in this evaluation. Interoperability of C/C++ language assets continues to be highly desired in Rust and is recognized as a major challenge &lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5]&lt;/a&gt; &lt;a href="https://atmarkit.itmedia.co.jp/ait/articles/1907/24/news130.html" rel="noopener noreferrer"&gt;[25]&lt;/a&gt; &lt;a href="https://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/" rel="noopener noreferrer"&gt;[26]&lt;/a&gt; &lt;a href="https://blog.rust-lang.org/2020/12/16/rust-survey-2020.html" rel="noopener noreferrer"&gt;[4]&lt;/a&gt; &lt;a href="https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.html" rel="noopener noreferrer"&gt;[27]&lt;/a&gt;. While there are FFI generators such as rust-bindgen &lt;a href="https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.html" rel="noopener noreferrer"&gt;[27]&lt;/a&gt;, they are not interoperable with existing assets, and the interoperability issue is a major barrier compared to C++, Objective-C, and Go, where interoperability with C is guaranteed at the language level and can be used simply by including header files. Interoperability issues will be a factor in the decision to adopt Rust.&lt;/p&gt;

&lt;p&gt;In terms of design, Rust also has to bring in reference (Arc) and exclusion control (Mutex) semantics similar to the C/C++/Go languages in concurrency applications (with data sharing), and also has to avoid the semantic limitations of Rust's language specification, such as move and lifetime. There is no escape from the limitations of the Rust language specification, such as Move and Lifetime. As a result, the degree of programming flexibility is limited compared to other programming languages, and design and implementation trade-off decisions need to be made that have an impact on productivity and performance, as shown in the performance evaluation discussion in Evaluation (ii).&lt;/p&gt;

&lt;p&gt;As for safety, Rust is a programming language that is ensured by static analysis and dynamic boundary checks. However, even in traditional C/C++, a wealth of static analysis tools (e.g. Clang Static Analyze) and dynamic analysis tools (e.g. Valgrind) can be utilised, so a comprehensive evaluation including peripheral tools will be necessary.&lt;/p&gt;

&lt;p&gt;Finally, in the performance evaluation, issues were identified in the Rust, C, and Go implementations. In this evaluation, the Go implementation showed good implementation efficiency and stable performance. Go may be the safest candidate as a general-purpose option. In any case, we will investigate the performance issues of each language in more detail.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;[1] The Rust Programming Language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.co.jp/dp/4873119782" rel="noopener noreferrer"&gt;[2] Programming Rust 第2版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2022/02/15/Rust-Survey-2021.html" rel="noopener noreferrer"&gt;[3] Rust Survey 2021 Results | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2020/12/16/rust-survey-2020.html" rel="noopener noreferrer"&gt;[4] Rust Survey 2020 Results | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2020/04/17/Rust-survey-2019.html" rel="noopener noreferrer"&gt;[5] Rust Survey 2019 Results | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2018/11/27/Rust-survey-2018.html" rel="noopener noreferrer"&gt;[6] Rust Survey 2018 Results | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gihyo.jp/article/2022/09/rust-monthly-topics-01" rel="noopener noreferrer"&gt;[7] データでわかるRustの開発者達 〜Rust Survey 2021の深堀 | gihyo.jp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rust-lang.org/2022/12/05/survey-launch.html" rel="noopener noreferrer"&gt;[8] Launching the 2022 State of Rust Survey | Rust Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[9] ECHONET Lite規格書 | ECHONET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://echonet.jp/spec_g/" rel="noopener noreferrer"&gt;[10] Machine Readable Appendix Release | ECHONET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho" rel="noopener noreferrer"&gt;[11] uEcho for C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-rs" rel="noopener noreferrer"&gt;[12] uEcho for Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-go" rel="noopener noreferrer"&gt;[13] uEcho for Go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-py" rel="noopener noreferrer"&gt;[14] uEcho for Pyton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/uecho-bench" rel="noopener noreferrer"&gt;[15] Benchmark utility package for uEcho implementations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/XAMPPRocky/tokei" rel="noopener noreferrer"&gt;[16] Tokei (時計)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nnethercote.github.io/perf-book/" rel="noopener noreferrer"&gt;[17] The Rust Performance Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prev.rust-lang.org/faq.htm" rel="noopener noreferrer"&gt;[18] The Rust Language FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redis.io" rel="noopener noreferrer"&gt;[19] Redis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tokio.rs/" rel="noopener noreferrer"&gt;[20] Tokio - An asynchronous Rust runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tokio-rs/mini-redis" rel="noopener noreferrer"&gt;[21] tokio-rs/mini-redis: Incomplete Redis client and server implementation using Tokio - for learning purposes only&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tokio-rs/mini-redis/issues/1" rel="noopener noreferrer"&gt;[22] Initial benchmark results · Issue #1 · tokio-rs/mini-redis · GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cybergarage/go-redis" rel="noopener noreferrer"&gt;[23] cybergarage/go-redis: The go-redis is a database framework for implementing a Redis compatible server using Go easily.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/jp/news/2020/02/ibm-stop-work-swift-server/" rel="noopener noreferrer"&gt;[23] IBMがSwift開発を終了 - Chris Bailey氏とのQ&amp;amp;A&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rust-unofficial.github.io/patterns/" rel="noopener noreferrer"&gt;[24] Rust Design Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atmarkit.itmedia.co.jp/ait/articles/1907/24/news130.html" rel="noopener noreferrer"&gt;[25] Microsoftが「Rust」言語を導入、安全性以外の理由あり（続報）：性能や安全性以外にも評価あり - ＠IT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/" rel="noopener noreferrer"&gt;[26] Why Rust for safe systems programming – Microsoft Security Response Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://security.googleblog.com/2023/01/supporting-use-of-rust-in-chromium.html" rel="noopener noreferrer"&gt;[27] Google Online Security Blog: Supporting the Use of Rust in the Chromium Project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>rust</category>
      <category>go</category>
      <category>c</category>
      <category>database</category>
    </item>
  </channel>
</rss>
