<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>LightsOut Factory field notes</title><id>https://lightsoutfactory.ai/field-notes/feed.xml</id><link rel="self" href="https://lightsoutfactory.ai/field-notes/feed.xml"/><link href="https://lightsoutfactory.ai/"/><updated>2026-11-02T00:00:00Z</updated><author><name>LightsOut Factory</name></author>
<entry><title>Our wait loop waited 35 hours for itself: pgrep -f and pkill -f over SSH</title><link href="https://lightsoutfactory.ai/field-notes/wait-loop-waited-for-itself/"/><id>https://lightsoutfactory.ai/field-notes/wait-loop-waited-for-itself/</id><published>2026-11-02T00:00:00Z</published><updated>2026-11-02T00:00:00Z</updated><summary>A loop meant to wait for a job on another machine found its own command line instead, for 35 hours. Why pgrep -f and pkill -f match the shell that runs them, and the patterns we use now.</summary></entry>
<entry><title>In 14 of our 42 languages, the plural form called &quot;one&quot; is not just for 1</title><link href="https://lightsoutfactory.ai/field-notes/plural-one-is-not-one/"/><id>https://lightsoutfactory.ai/field-notes/plural-one-is-not-one/</id><published>2026-11-02T00:00:00Z</published><updated>2026-11-02T00:00:00Z</updated><summary>Russian &quot;one&quot; is also 21 and 31, French &quot;one&quot; is also 0. Our translation check got this wrong in both directions on the same day: it refused a right translation and would have passed a wrong one.</summary></entry>
<entry><title>1,082 translations had a word in the wrong alphabet. Our checks passed every one.</title><link href="https://lightsoutfactory.ai/field-notes/letters-of-another-script/"/><id>https://lightsoutfactory.ai/field-notes/letters-of-another-script/</id><published>2026-11-02T00:00:00Z</published><updated>2026-11-02T00:00:00Z</updated><summary>A Chinese word inside Hungarian, Cyrillic inside Greek, Thai on Khmer pages: what a local model slipped into our translations, why a script check let it through, and the rule that catches it.</summary></entry>
<entry><title>Our watchdog restarted the services we had stopped on purpose</title><link href="https://lightsoutfactory.ai/field-notes/watchdog-restarted-stopped-services/"/><id>https://lightsoutfactory.ai/field-notes/watchdog-restarted-stopped-services/</id><published>2026-10-31T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>A watchdog that starts enabled but stopped services cannot tell a crash from a pause. Twice it undid our stops, once with visitors getting 502s. The rule we use now, and two more systemd traps.</summary></entry>
<entry><title>The view counter that turned our catalogue into a 502</title><link href="https://lightsoutfactory.ai/field-notes/view-counter-broke-the-catalogue/"/><id>https://lightsoutfactory.ai/field-notes/view-counter-broke-the-catalogue/</id><published>2026-10-31T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>For about 41 hours the main catalogue page of our store answered every visitor with a 502, because the code counting its visits crashed on its address. Why none of our checks saw it, and the three changes that would have.</summary></entry>
<entry><title>Two DGX Spark-class boxes, one model: a copy on each beat splitting it</title><link href="https://lightsoutfactory.ai/field-notes/two-sparks-one-model/"/><id>https://lightsoutfactory.ai/field-notes/two-sparks-one-model/</id><published>2026-10-31T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>We split one model across two NVIDIA GB10 machines with tensor parallelism, then ran a full copy on each behind a proxy: 180 to 210 tokens a second. What it cost us.</summary></entry>
<entry><title>We checked every machine translation. The checks were the part that was wrong.</title><link href="https://lightsoutfactory.ai/field-notes/translation-checks-were-wrong/"/><id>https://lightsoutfactory.ai/field-notes/translation-checks-were-wrong/</id><published>2026-10-31T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>A local model translated a small app into five languages in six file formats. Four of 350 strings were rejected, and all four rejections were mistakes in our own checks: a loanword, an e-mail address and Japanese plural text.</summary></entry>
<entry><title>The bug in our secret scanner that canaries could not find</title><link href="https://lightsoutfactory.ai/field-notes/secret-gate-quoted-value-bug/"/><id>https://lightsoutfactory.ai/field-notes/secret-gate-quoted-value-bug/</id><published>2026-10-31T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>Our release gate plants canaries before every scan, and they always passed. The bug was one step earlier: a quoted secret followed by a comment was read with its quotes. How we found it, why canaries miss this kind of bug, and what tests it now.</summary></entry>
<entry><title>A scraper flood on Cloudflare&#x27;s Free plan: what stopped it, and what we left switched off</title><link href="https://lightsoutfactory.ai/field-notes/scraper-flood-cloudflare-free-plan/"/><id>https://lightsoutfactory.ai/field-notes/scraper-flood-cloudflare-free-plan/</id><published>2026-10-31T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>A scraper behind residential proxies took one of our sites down for about ten hours. What gave it away, the three free WAF rules and the app-level gate that stopped it, and the Cloudflare switches that would have broken something else.</summary></entry>
<entry><title>Our health check restarted a healthy model server eight times in one day</title><link href="https://lightsoutfactory.ai/field-notes/health-check-restarted-healthy-model/"/><id>https://lightsoutfactory.ai/field-notes/health-check-restarted-healthy-model/</id><published>2026-10-31T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>The check sent a real request to a busy vLLM server, waited in its queue, timed out and restarted it. Why, and the check that replaced it: the server&#x27;s own counters.</summary></entry>
<entry><title>Our GB10 machine kept switching itself off. The log blamed memory; it was heat</title><link href="https://lightsoutfactory.ai/field-notes/gb10-switching-off-heat/"/><id>https://lightsoutfactory.ai/field-notes/gb10-switching-off-heat/</id><published>2026-10-31T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>Hard power-offs under GPU load, a kernel error that was only the most common line in the log, and what kept the machine running: a clock cap, a staged heat guard and alarms set from data.</summary></entry>
<entry><title>YouTube now counts uploads in their own bucket: 100 a day, one unit each</title><link href="https://lightsoutfactory.ai/field-notes/youtube-upload-quota-bucket/"/><id>https://lightsoutfactory.ai/field-notes/youtube-upload-quota-bucket/</id><published>2026-10-29T00:00:00Z</published><updated>2026-10-29T00:00:00Z</updated><summary>Google moved video uploads out of the 10,000-unit daily quota. What changed in the YouTube Data API, what it means for an automated channel, and the limits that still apply.</summary></entry>
<entry><title>A vision model as a frame checker: what it caught and what it let through</title><link href="https://lightsoutfactory.ai/field-notes/vision-model-frame-check/"/><id>https://lightsoutfactory.ai/field-notes/vision-model-frame-check/</id><published>2026-10-29T00:00:00Z</published><updated>2026-10-29T00:00:00Z</updated><summary>Before a generated picture costs render time, Studio asks a local vision model whether it shows text, a watermark or deformed hands. What our test frames showed.</summary></entry>
<entry><title>When NVENC will not start: a GPU full of models, and a renderer that falls back</title><link href="https://lightsoutfactory.ai/field-notes/nvenc-gpu-full-of-models/"/><id>https://lightsoutfactory.ai/field-notes/nvenc-gpu-full-of-models/</id><published>2026-10-29T00:00:00Z</published><updated>2026-10-29T00:00:00Z</updated><summary>On a machine that also serves a language model, ffmpeg&#x27;s hardware encoder can fail to open for lack of GPU memory. How it showed up, why, and why the CPU fallback cost less than expected.</summary></entry>
<entry><title>Shipping code from a working fleet without shipping its secrets</title><link href="https://lightsoutfactory.ai/field-notes/keeping-secrets-out-of-kits/"/><id>https://lightsoutfactory.ai/field-notes/keeping-secrets-out-of-kits/</id><published>2026-10-29T00:00:00Z</published><updated>2026-10-31T00:00:00Z</updated><summary>Every kit we sell passes secret scans on three machines before it is zipped. What they look for, and the false alarms that taught us the most.</summary></entry>
<entry><title>A 24/7 stream that does not reconnect between videos: one ffmpeg fed through a pipe</title><link href="https://lightsoutfactory.ai/field-notes/24-7-stream-one-ffmpeg-pipe/"/><id>https://lightsoutfactory.ai/field-notes/24-7-stream-one-ffmpeg-pipe/</id><published>2026-10-29T00:00:00Z</published><updated>2026-10-29T00:00:00Z</updated><summary>How Studio&#x27;s live channel changes videos without dropping the RTMP connection, and the three details that made the timestamps behave.</summary></entry>
</feed>
