<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Rabeh Engineering]]></title><description><![CDATA[Engineering notes on Rust, systems engineering, developer tools, reliability, and building practical software products.]]></description><link>https://rabeh-engineering.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 03 Nov 2026 04:29:13 GMT</lastBuildDate><atom:link href="https://rabeh-engineering.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why “Service Active” Does Not Mean “System Healthy”]]></title><description><![CDATA[Why a running service is not proof of a healthy system, and how runtime verification, capability checks, and recovery improve local automation reliability.]]></description><link>https://rabeh-engineering.hashnode.dev/why-service-active-does-not-mean-system-healthy</link><guid isPermaLink="true">https://rabeh-engineering.hashnode.dev/why-service-active-does-not-mean-system-healthy</guid><category><![CDATA[Rust]]></category><dc:creator><![CDATA[Laouadi Rabah]]></dc:creator><pubDate>Mon, 02 Nov 2026 19:40:09 GMT</pubDate><content:encoded><![CDATA[<p>While building and using Sovereign Local MCP, one reliability lesson kept becoming clearer:</p>
<p><strong>A running service is not the same thing as a working system.</strong></p>
<p>A process can be alive. A service manager can report <code>active</code>. A health request can succeed. And the capability the user actually needs can still be broken.</p>
<h2>Process health is only one layer</h2>
<p>Imagine a browser automation service. The daemon is running, the browser process is running, and the connection service is running. Everything looks healthy from the operating system’s point of view.</p>
<p>Then you try the operation that actually matters:</p>
<ul>
<li>discover browser tabs;</li>
<li>take a snapshot;</li>
<li>select a target;</li>
<li>execute a bounded browser action;</li>
<li>recover after a reconnect.</li>
</ul>
<p>And it fails.</p>
<p>From the service manager’s perspective, nothing is wrong. From the user’s perspective, the system is broken. Both observations can be technically correct because they are measuring different things.</p>
<h2>Health should follow the capability</h2>
<p>A useful health model should move through layers:</p>
<h3>1. Is the process alive?</h3>
<p>Necessary, but weak evidence.</p>
<h3>2. Can the component respond?</h3>
<p>Stronger, but still not proof that downstream capabilities work.</p>
<h3>3. Is the expected runtime actually loaded?</h3>
<p>Source code, installed binaries, configuration, services, and browser bridges can drift apart. The source tree can contain a fix while an older runtime is still executing.</p>
<h3>4. Can the real operation succeed?</h3>
<p>If the system exists to discover browser tabs, tab discovery itself is meaningful evidence. If it exists to read a page, a real bounded snapshot proves more than checking whether the bridge process exists.</p>
<p>The health check should get as close as safely possible to the capability that matters.</p>
<h2>“Healthy” should not hide partial failure</h2>
<p>A system may have transport available, runtime reachable, browser connected, one tool working, another failing, and session state preserved.</p>
<p>Calling the whole system simply “healthy” loses useful diagnostic information.</p>
<p>A better result looks like this:</p>
<p><code>transport reachable → runtime verified → browser reachable → tab discovery failed</code></p>
<p>That tells us exactly where investigation should begin.</p>
<h2>Recovery is part of reliability</h2>
<p>Local automation contains state: browser profiles, authenticated sessions, tabs, runtime configuration, and operation identity.</p>
<p>A restart that restores the process but destroys useful state is not a complete recovery.</p>
<p>The system should be able to reconnect, rediscover the current environment instead of trusting stale references, preserve the user session where possible, and determine what can safely be retried.</p>
<h2>Runtime verification should be explicit</h2>
<p>After an important fix, I now prefer a sequence closer to:</p>
<p><strong>change → build → install/deploy → identify runtime → reproduce the original failure → verify corrected behavior</strong></p>
<p>Skipping runtime identity creates a dangerous debugging gap. Tests can pass against one version while the real environment executes another.</p>
<h2>A green status is evidence, not proof</h2>
<p>Every health signal proves only what it actually measured.</p>
<p>A running process proves the process is running. A successful health request proves the health request succeeded. A verified runtime proves something stronger. A successful real operation proves more again.</p>
<p>Reliability comes from composing those pieces of evidence instead of treating one green indicator as proof of the whole system.</p>
<p>This is one of the ideas shaping Sovereign Local MCP as it evolves: failures should identify their boundary clearly, recovery should preserve useful state, and health checks should verify real capabilities rather than only confirming that processes exist.</p>
<p>Because in operational systems, <strong>“active” and “working” are not synonyms.</strong></p>
]]></content:encoded></item><item><title><![CDATA[What Building Reliability Tools in Rust Taught Me About Software Engineering]]></title><description><![CDATA[Lessons from building reliability tools in Rust: explicit boundaries, recoverable failures, idempotent retries, observability, and verification.]]></description><link>https://rabeh-engineering.hashnode.dev/what-building-reliability-tools-in-rust-taught-me-about-software-engineering</link><guid isPermaLink="true">https://rabeh-engineering.hashnode.dev/what-building-reliability-tools-in-rust-taught-me-about-software-engineering</guid><category><![CDATA[Rust]]></category><category><![CDATA[Software Engineering]]></category><category><![CDATA[Developer Tools]]></category><category><![CDATA[systems-engineering]]></category><dc:creator><![CDATA[Laouadi Rabah]]></dc:creator><pubDate>Mon, 02 Nov 2026 06:47:06 GMT</pubDate><content:encoded><![CDATA[<p>Building reliability tools in Rust changed how I think about software engineering. The hardest problems were rarely about syntax. They were about boundaries, failure modes, observability, state, and proving that a system actually behaves the way we expect.</p>
<h2>Reliability starts with boundaries</h2>
<p>A system becomes easier to trust when every boundary is explicit. Inputs should be validated, state transitions should be controlled, and failures should produce useful evidence instead of disappearing behind a generic error. Rust helps here because it pushes many assumptions into types and interfaces, but the engineering discipline still has to come from the design.</p>
<h2>Failure should leave evidence</h2>
<p>When an operation fails, the failure should tell us what happened, where it happened, and what can be safely retried. Good observability is not just logging more data. It is preserving the information needed to understand the state of the system after something goes wrong.</p>
<h2>Retries need identity</h2>
<p>A retry is only safe when the system can recognize that it is the same operation. Without stable identity and idempotency, retries can duplicate work, corrupt state, or create results that are difficult to reconcile later. Reliability therefore depends on knowing not only what failed, but also which operation is being resumed.</p>
<h2>Types help , but architecture decides</h2>
<p>Rust can eliminate entire classes of mistakes, but it cannot decide where trust boundaries belong, how recovery should work, or which state transitions are valid. Those are architectural decisions. The language gives us strong tools, but reliable systems still depend on explicit design and verification.</p>
<h2>Verification matters more than confidence</h2>
<p>A system is not reliable because we believe it is reliable. Reliability needs evidence: tests, reproducible behavior, clear invariants, and observable results. The more critical the system becomes, the more important it is to replace assumptions with verification.</p>
<h2>What I'm taking forward</h2>
<p>The biggest lesson for me is simple: reliability is designed, not added later. I want to keep building systems where boundaries are explicit, failures are recoverable, and important behavior can be verified instead of merely assumed.</p>
]]></content:encoded></item></channel></rss>