<?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: chemy_pvl</title>
    <description>The latest articles on DEV Community by chemy_pvl (@chemy_pvl).</description>
    <link>https://dev.to/chemy_pvl</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%2F4022907%2F84c542c2-9446-4406-85f6-0050422e3fb3.png</url>
      <title>DEV Community: chemy_pvl</title>
      <link>https://dev.to/chemy_pvl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chemy_pvl"/>
    <language>en</language>
    <item>
      <title>"Is it alive?" is the wrong question. Ask "is it working?"</title>
      <dc:creator>chemy_pvl</dc:creator>
      <pubDate>Tue, 14 Jul 2026 00:51:22 +0000</pubDate>
      <link>https://dev.to/chemy_pvl/is-it-alive-is-the-wrong-question-ask-is-it-working-5g36</link>
      <guid>https://dev.to/chemy_pvl/is-it-alive-is-the-wrong-question-ask-is-it-working-5g36</guid>
      <description>&lt;h1&gt;
  
  
  "Is it alive?" is the wrong question. The right one is "is it working?"
&lt;/h1&gt;

&lt;p&gt;I run a home lab: a couple of always-on machines, a GPU node, some AI jobs that are supposed to chew through work while I'm asleep or at my day job. The first fear anyone has with unattended infrastructure is simple — &lt;em&gt;if it breaks, will I even notice?&lt;/em&gt; So you add notifications. You put up a dashboard. You get an alert when a process dies. That's a real and necessary step.&lt;/p&gt;

&lt;p&gt;But here's the thing I keep relearning: &lt;strong&gt;monitoring can be green while nothing is getting done.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Last season on the blog I wrote up the incidents from actually running this stuff unattended — the silent stops, the healthy-looking numbers that were lying, the resource contention nobody flagged. The one that reframed everything for me: a GPU node sat idle for &lt;strong&gt;16 hours&lt;/strong&gt;. The process was alive. The network was fine. Every check I had said "OK." The only signal that didn't lie was the one I wasn't watching — &lt;em&gt;the output count wasn't going up.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post is the design I landed on, and the checklist I now use before I trust any monitoring setup, mine included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Split monitoring into three layers
&lt;/h2&gt;

&lt;p&gt;Most home-lab monitoring collapses into one undifferentiated blob of "checks." It's much easier to reason about — and much easier to find the holes — if you split it into three layers and ask what each one can and cannot tell you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1 — Liveness.&lt;/strong&gt; &lt;em&gt;Is the process alive?&lt;/em&gt; This tells you it crashed, or it restarted. What it misses: the process is running but the work has stalled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 2 — Connectivity.&lt;/strong&gt; &lt;em&gt;Does the port open? Does the API respond?&lt;/em&gt; This tells you the thing is reachable from outside. What it misses: it responds, but it isn't doing the job you think it's doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 3 — Progress.&lt;/strong&gt; &lt;em&gt;Did the amount of finished work increase over the last unit of time?&lt;/em&gt; This tells you the job is actually moving forward. What it misses: your definition of "output" could be wrong, or the measurement itself could be broken. (That failure mode is real, and I'll come back to it.)&lt;/p&gt;

&lt;p&gt;Liveness is the "notice when it dies" layer. It's the cheapest to add and the one most people already have. Connectivity is the next step up — proving the port is open and the API answers, not just that a PID exists. Both of those are worth having. Neither of them answers the question I actually care about at 2am.&lt;/p&gt;

&lt;p&gt;Because for AI agent workloads and GPU nodes, the interesting failures aren't crashes. They're &lt;em&gt;waits&lt;/em&gt;. Queues that stop draining. Work that blocks on something and never times out. Silent stops where every component is technically healthy and collectively they've achieved nothing.&lt;/p&gt;

&lt;p&gt;Measuring "is it alive" does not tell you "is it working." That gap is the whole reason to bring observability — not just monitoring — into a home lab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Green dashboards lie, and here's how
&lt;/h2&gt;

&lt;p&gt;Two incidents changed how much I trust a displayed value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Capacity showed 99% free while real errors were happening.&lt;/strong&gt; The monitored value said there was plenty of room. Actual operations were failing. The number wasn't wrong when it was written — it was &lt;em&gt;stale&lt;/em&gt;, and stale values get rendered as "normal" by default. Nothing in the display distinguishes "I checked this a second ago and it's fine" from "I last checked this hours ago and it was fine then."&lt;/p&gt;

&lt;p&gt;The rule I took from that: &lt;strong&gt;when a monitored value and a real error contradict each other, believe the real error.&lt;/strong&gt; And structurally, the fix isn't a better threshold — it's a freshness gate. A metric that hasn't been updated recently should not be allowed to count as healthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A 10G link that only delivered about 3G effective.&lt;/strong&gt; Bandwidth alone looked survivable. What was actually going on showed up somewhere else: the outward-facing port count climbed to roughly 240. That's the pattern worth internalizing — resources usually have a &lt;em&gt;leading&lt;/em&gt; indicator that saturates before the headline number does. If you only watch the headline metric, you find out late.&lt;/p&gt;

&lt;p&gt;So the honest summary is: monitoring starts lying the moment you install it. The value might be old. The notification might not get delivered. The word "OK" on a dashboard might be actively concealing a stalled job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put progress on top of what you already have
&lt;/h2&gt;

&lt;p&gt;I want to be clear that none of this means throwing out your liveness checks or your telemetry pipeline. Both are necessary. The mistake is letting their &lt;em&gt;roles&lt;/em&gt; blur together.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Liveness monitoring tells you something went down.&lt;/li&gt;
&lt;li&gt;The telemetry pipeline carries observed values from A to B.&lt;/li&gt;
&lt;li&gt;Progress monitoring asks whether the workload is producing results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you already have the first two, the realistic move is to add &lt;strong&gt;one&lt;/strong&gt; progress signal on top. Not to rebuild everything. Pick the workload that would hurt most if it silently stalled, define what "one unit of progress" means for it, and alert when that number stops increasing for longer than it should.&lt;/p&gt;

&lt;p&gt;The same skepticism generalizes. Backups are the classic case: the existence of a backup tells you nothing about whether you can restore. Only an actual restore test does. I found broken restores and prune candidates precisely because I stopped trusting the "backup completed" line and went and checked. Monitoring is not a substitute for operating the system — it's an instrument for finding the holes in how you operate it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which layers should you actually have?
&lt;/h2&gt;

&lt;p&gt;Depends on what you're running. Roughly how I'd advise choosing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Good fit for&lt;/th&gt;
&lt;th&gt;Bad fit for&lt;/th&gt;
&lt;th&gt;Upside&lt;/th&gt;
&lt;th&gt;Downside&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Liveness only&lt;/td&gt;
&lt;td&gt;Anyone with no down-alerts at all today&lt;/td&gt;
&lt;td&gt;Anyone depending on unattended jobs finishing&lt;/td&gt;
&lt;td&gt;Fast to start&lt;/td&gt;
&lt;td&gt;Silent stalls slip through&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liveness + connectivity&lt;/td&gt;
&lt;td&gt;Services consumed from outside&lt;/td&gt;
&lt;td&gt;Anyone who needs to see output increase&lt;/td&gt;
&lt;td&gt;Easy to isolate unreachability&lt;/td&gt;
&lt;td&gt;Confuses "responds" with "produces"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Liveness + connectivity + progress&lt;/td&gt;
&lt;td&gt;Unattended AI work, backups, scheduled jobs&lt;/td&gt;
&lt;td&gt;Anyone who can't yet define "progress"&lt;/td&gt;
&lt;td&gt;You can answer "is it working?"&lt;/td&gt;
&lt;td&gt;Needs a per-workload definition of output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add nothing yet&lt;/td&gt;
&lt;td&gt;Still deciding what you run and how you'd respond&lt;/td&gt;
&lt;td&gt;Anyone already trusting unattended work&lt;/td&gt;
&lt;td&gt;Avoids alert noise&lt;/td&gt;
&lt;td&gt;The blind spot stays&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you can't define progress for a workload yet, &lt;strong&gt;don't rush to add more metrics.&lt;/strong&gt; Write down the answer to this instead: &lt;em&gt;what is the moment at which I can say this job succeeded?&lt;/em&gt; Is it that a file appeared? That N items completed? That a restore verification passed? The answer is different for every workload, and metrics you add before you can answer it are decoration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist: count your own layers
&lt;/h2&gt;

&lt;p&gt;Go count what you have right now.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Liveness&lt;/strong&gt; — if a process or service dies, will I find out? Through a channel I've actually tested, not one I assume works?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connectivity&lt;/strong&gt; — can I confirm the entry points I depend on are reachable &lt;em&gt;and&lt;/em&gt; responding?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress&lt;/strong&gt; — if output or completion count stops increasing for a defined window, will anything tell me?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness&lt;/strong&gt; — can a stale value be displayed as "normal" in my setup? If yes, that's a hole. Gate it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contradiction rule&lt;/strong&gt; — when a metric says fine and a real operation fails, do I have the discipline to believe the failure?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leading indicators&lt;/strong&gt; — for my constrained resources, am I only watching the headline number, or the thing that saturates first?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification, not existence&lt;/strong&gt; — for backups and anything else where "it exists" ≠ "it works": have I actually exercised the recovery path?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A missing layer isn't a failure. It's just the next thing to build. No liveness alerting? Start there — it's the cheapest reduction in "didn't notice for 16 hours" risk you can buy. Telemetry that you suspect isn't flowing? Verify the pipeline before you build on it. Liveness and connectivity both green but work still stalling? That's exactly where progress monitoring earns its keep.&lt;/p&gt;

&lt;p&gt;What I want to be left with — and what I'd want for anyone running a lab like mine — isn't &lt;em&gt;having notifications&lt;/em&gt;. It's being able to confirm, at the moment it matters, that things are moving forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full write-up
&lt;/h2&gt;

&lt;p&gt;The full Japanese article, with the incident details, the layer-by-layer breakdown, and the reasoning behind the freshness gate and the connectivity leading indicators, is on the blog:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.proto-violet-lab.com/home-lab-monitoring-liveness-connectivity-progress/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=devto_e0" rel="noopener noreferrer"&gt;「生きているか」ではなく「働いているか」——自宅サーバー監視を実装する / Not "is it alive" but "is it working": implementing home-server monitoring&lt;/a&gt;&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>homelab</category>
      <category>observability</category>
      <category>devops</category>
    </item>
    <item>
      <title>Home Lab AI Agents: Deploying Is Easy, Keeping Them Alive Is Not</title>
      <dc:creator>chemy_pvl</dc:creator>
      <pubDate>Thu, 09 Jul 2026 14:29:11 +0000</pubDate>
      <link>https://dev.to/chemy_pvl/home-lab-ai-agents-deploying-is-easy-keeping-them-alive-is-not-d54</link>
      <guid>https://dev.to/chemy_pvl/home-lab-ai-agents-deploying-is-easy-keeping-them-alive-is-not-d54</guid>
      <description>&lt;h2&gt;
  
  
  The agents were alive. The work was not.
&lt;/h2&gt;

&lt;p&gt;I have been growing a home lab for years the way most people do: a NAS, then a switch worth caring about, then a compute node, then a second one. Adding hardware has a satisfying property — you rack it, you connect it, you configure it, and it either works or it visibly does not.&lt;/p&gt;

&lt;p&gt;Then I started running AI agents on that hardware around the clock, and the property stopped holding.&lt;/p&gt;

&lt;p&gt;A file server responds when a human asks it to. An agent fleet runs while I sleep. It makes outbound requests, occupies GPUs, collects data on a schedule, and hands results to an analysis node. It also, occasionally, plays dead while remaining alive: the processes exist, the network responds, the dashboard is green, and no actual work has completed in hours. Last season I documented the physical build — network, storage, compute, power, remote recovery. That was the cage. This season is about what lives in it, and what breaks when you keep something alive rather than merely installed.&lt;/p&gt;

&lt;p&gt;Three failures from the log, before I get to the lessons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A GPU sat silent for 16 hours. Every monitor reported normal.&lt;/li&gt;
&lt;li&gt;A collector reported "success" every day for a month. More than half its runs had actually failed.&lt;/li&gt;
&lt;li&gt;An agent reported that it had configured something. The code it described did not exist anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are dramatic. All of them are quiet.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Deploying" and "keeping" are different problems
&lt;/h2&gt;

&lt;p&gt;A server is mostly a deploy target. Power it on, install the OS, bring up the service, set it to start at boot. Faults happen, but the service boundary the administrator intended is reasonably crisp: the port answers or it doesn't.&lt;/p&gt;

&lt;p&gt;An agent is messier. It holds a task, queries something external, reads the result, does something that resembles judgment, and moves on. So "is the process running" is not a sufficient question. The questions that matter are: is it working, is it lost, and does the thing it claims to have produced actually exist on disk?&lt;/p&gt;

&lt;p&gt;The dangerous mode here is not the crash. A crash is loud — logs go red, alerts fire, monitoring notices. The dangerous mode is silent failure, where nothing is technically down and nothing is getting done. Sixteen hours of a green dashboard over a dead GPU is not really a monitoring misconfiguration. It's a category error about what was being monitored. Watching component liveness and watching work progress produce two different worlds, and I was living in the wrong one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The night the fleet used up the house internet
&lt;/h2&gt;

&lt;p&gt;The most instructive incident in the set was a network one, and it is instructive precisely because the obvious explanation was wrong.&lt;/p&gt;

&lt;p&gt;One night, DNS died across the entire house. Both DNS filters — deliberately deployed as a redundant pair — timed out against their upstream resolvers at the same minute. Redundancy failing in lockstep is a useful clue: it means the shared path broke, not the redundant components.&lt;/p&gt;

&lt;p&gt;Bandwidth was the first suspect and the wrong one. The line is 10G. Traffic was around 3 Gbps. There was headroom.&lt;/p&gt;

&lt;p&gt;The exhausted resource was NAT ports.&lt;/p&gt;

&lt;p&gt;Here is the qualifier that makes this story technically correct rather than merely alarming: my line is MAP-E — IPv4 over IPv6 — where the subscriber is allocated only a couple hundred outer ports (on the order of 240 to 1008), not the roughly 64k port space a plain NAT gets per external address. Under a conventional consumer NAT, a couple dozen parallel agents plus continuous collectors plus monitoring would not have come close to exhausting the table. Under MAP-E, they did, in bursts of one to two minutes, five times over. New sessions failed first, and UDP DNS is the most eager creator of new sessions in a household, so the symptom presented as "the internet is broken" rather than "we are out of ports."&lt;/p&gt;

&lt;p&gt;So the generalization is narrower than "consumer networks can't host agents." It is: if you are on a shared-address scheme — MAP-E, CGNAT, anything where your outer port range is a few hundred rather than tens of thousands — then concurrent session count, not bandwidth, is the budget you have to manage. This applies to anything that opens many short-lived connections: agent fleets, scrapers, P2P. No speed test will warn you about it. The speed test will look excellent.&lt;/p&gt;

&lt;p&gt;The fix was unglamorous. I halved parallelism, from 16 to 8. Daily throughput did not change, because throughput had been limited by a different quota all along — the parallelism above 8 had been buying nothing but NAT pressure. I also moved DNS to an IPv6 upstream so it stops traversing MAP-E entirely.&lt;/p&gt;

&lt;p&gt;The line I keep coming back to: overusing AI bills you in tokens, and it also bills you in your household's NAT table.&lt;/p&gt;

&lt;h2&gt;
  
  
  Care decomposes into monitoring, power, and network
&lt;/h2&gt;

&lt;p&gt;Three things demand attention, and each has a default misconception attached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring.&lt;/strong&gt; The question is not "is it alive" but "is it working." The misconception is that process supervision suffices. It does not — a process can be perfectly supervised and perfectly idle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Power.&lt;/strong&gt; The question is not only "does it stay up" but "can it come back." The misconception is that anything with autostart configured is therefore unattended-capable. Unattended means recovering without you, from a state you did not anticipate, at an hour you were not awake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network.&lt;/strong&gt; The question is not throughput but session behavior — exhaustion, skew, concurrency. The misconception is that a fast speed test means the network is adequate. See above.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four things I check now
&lt;/h2&gt;

&lt;p&gt;Before scaling any of this, the starting checklist is short on purpose:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What did this agent last actually complete?&lt;/strong&gt; Not "when did it last run" — what finished.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does the success report correspond to an artifact?&lt;/strong&gt; If it claims to have written a file, is the file there? If it claims to have written code, does the code exist?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If it fails, will a human notice?&lt;/strong&gt; Is there a notification or a log a person will actually read, or does failure look identical to success from the outside?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After a power cut or a line drop, how far back does it come automatically?&lt;/strong&gt; Know the boundary before you need it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The framing that keeps me honest: unattended operation is not unsupervised operation. It is a design that reduces the number of places a human must look, so that the hours a human isn't looking can be increased. Get that backwards and you spend months keeping a silence that looks like health.&lt;/p&gt;

&lt;p&gt;Build the cage first, by all means. But an agent is not an ornament you place inside it. Design the care before you bring the animal home.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full write-up
&lt;/h2&gt;

&lt;p&gt;The canonical version of this piece, in Japanese, opens a season of incident reports from the lab — the 16-hour silent GPU, the collector that lied for a month, the agent that reported code it never wrote, each with the numbers and the recovery path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.proto-violet-lab.com/home-lab-ai-agent-unattended-ops-season-opening/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=devto_e0" rel="noopener noreferrer"&gt;AIを自宅で飼うということ — ホームラボAI 24時間無人運用シーズン開幕&lt;/a&gt;&lt;/p&gt;

</description>
      <category>homelab</category>
      <category>ai</category>
      <category>devops</category>
      <category>networking</category>
    </item>
  </channel>
</rss>
