<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
  <title>The Cloudy Brain</title>
  <link>https://thecloudybrain.com</link>
  <description>One small learning a day, across every project.</description>
  <language>en</language>
  <item>
    <title>Decision: the heavy AI jobs live on a Mac Mini, not in the cloud</title>
    <link>https://thecloudybrain.com/cloud-run-60-min-timeout</link>
    <guid>https://thecloudybrain.com/cloud-run-60-min-timeout</guid>
    <pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate>
    <category>decision</category>
    <description>**Decision.** For my wine app, all heavy batch work — scraping a dozen shops with Playwright, deduplicating a 100k+ bottling catalog (a full O(n²) similarity pass), and LLM enrichment — runs in Docker on a Mac Mini M4 at home. Cloud Run hosts only the thin API.

**Because.** Cloud Run kills any request at 60 minutes; these jobs run for hours. And local hardware changes the economics: Ollama does the free extraction tier, the canonical Postgres catalog sits on the same machine (no egress, no Cloud SQL bill), and the paid model only sees what the free tiers couldn't fill.

**Instead of.** Contorting long pipelines into serverless functions with checkpointing and queue glue — complexity that exists only to work around a platform limit I don't have at home.</description>
  </item>
  <item>
    <title>Dev diary — 2026-06-10</title>
    <link>https://thecloudybrain.com/dev-diary-2026-06-10</link>
    <guid>https://thecloudybrain.com/dev-diary-2026-06-10</guid>
    <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
    <category>diary</category>
    <description>A big build day — +8k lines in [The Cloudy Brain](/p/thecloudybrain) alone — but the real story is the reversal in the middle of it.

The morning went into autonomous machinery: a curation and rating engine that would harvest my notes, draft posts, and run them past a multi-AI panel with a skeptic and a judge. I built the whole thing — validation gate, decision memory, a first real run against twenty vault candidates. The run looked like a failure (seventeen rejections) but the commit bodies call it a correct diagnosis: the harvester was reading status notes, and the engine rightly killed the status reports it got fed.

Then, by what the log marks as "RESET v2", I killed the autonomous pipeline entirely. The new shape: a blog co-written in session, with the engines detached into standalone capabilities you call deliberately instead of a machine that publishes on its own. The reference notes that failed as post sources got repurposed as grounding for human-written drafts — an editorial copilot rather than an author. Two proposed posts were built and removed the same day, along with about, lab, and projects pages; judging by the churn, the reset was decided mid-build, not planned.

The rest was making the blog real: an editing platform with edit and delete, share and SEO plumbing, structured data, a contact address. The design went through an A/B — a salmon newspaper look versus an "Engineering Sheet" — and the sheet won; the brass-and-ink dark theme built earlier in the day was retired.

Along the way I built a small internal AI proxy of my own — the open-source gateways all wanted to be platforms, and I needed something simple that every one of the site's AI calls could route through, with hard limits on what a headless model is allowed to do. And the ideas pile got pruned by one entry that didn't survive contact with daylight.

Tonight: the autonomous publisher is dead, the co-written blog is live in its place, and every AI call passes through one guarded door.</description>
  </item>
  <item>
    <title>NULL beats a plausible guess</title>
    <link>https://thecloudybrain.com/null-beats-a-plausible-guess</link>
    <guid>https://thecloudybrain.com/null-beats-a-plausible-guess</guid>
    <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
    <category>til</category>
    <description>**What I learned.** When an AI-extracted field can't be grounded in the source text, NULL beats a plausible guess.

Where it bit me: the batch enrichment pipeline behind my on-device sommelier app. Let the model "complete" sparse shop data and it drifts into hallucinated tasting notes — they read great, but never appeared in the shop's own description.

The fix is dumb and brutal: every extracted field runs a token-overlap check against the source text. Fails the check → it dies and becomes NULL. No fallback, no guess.

A catalog with empty fields is honest. One with invented tasting notes is broken in a way you can't detect later — and it quietly poisons a hundred thousand rows.

Absence beats noise.</description>
  </item>
  <item>
    <title>Munich court: "the AI said it" is not a shield</title>
    <link>https://thecloudybrain.com/munich-ai-liability</link>
    <guid>https://thecloudybrain.com/munich-ai-liability</guid>
    <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
    <category>news</category>
    <description>If you ship anything that presents LLM answers as authoritative to end users, this is the precedent to read twice. The disclaimer-and-pray era just got weaker in Germany: treat generated answers like statements your company makes — because a court now does. The detail that should worry builders most: the AI didn't just repeat a bad source, it **fabricated connections that appeared in none of the linked sources**. That's the failure mode your RAG pipeline has too.

---

**The story** — the Regional Court of Munich issued a temporary injunction against Google (case 26 O 869/26): its AI Overviews had falsely tied two Munich publishers to scams and subscription traps. The court classified the overview as **Google's own content** — not search results — because the AI rewrites and judges "in its own words," and it rejected Google's argument that users must fact-check. ([The Decoder](https://the-decoder.com/landmark-german-ruling-declares-googles-ai-overviews-are-googles-own-words-and-makes-it-liable-for-false-answers/) · [heise](https://www.heise.de/news/LG-Muenchen-I-Google-fuer-falsche-Aussagen-in-KI-Uebersichten-verurteilt-11326867.html))</description>
  </item>
  <item>
    <title>TIL: SignalK tank levels are 0..1 ratios, not liters</title>
    <link>https://thecloudybrain.com/signalk-tank-levels-are-ratios</link>
    <guid>https://thecloudybrain.com/signalk-tank-levels-are-ratios</guid>
    <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
    <category>til</category>
    <description>**What I learned.** SignalK's `tanks.fuel.{0,1}.currentLevel` is a **ratio (0..1)**, not a volume — and `.capacity` is in m³, so liters = `currentLevel × capacity × 1000`.

Why it matters / where it bit me — it bit me in Maracaibo's fuel estimator: early calibration was off by the whole tank capacity until I stopped treating the level as liters. Tiny example: a half-full 0.4 m³ tank reads `currentLevel = 0.5` → `0.5 × 0.4 × 1000 = 200 L`, not "0.5 L".

#SignalK #NMEA2000</description>
  </item>
  <item>
    <title>On-device AI is free per call — that's the trap</title>
    <link>https://thecloudybrain.com/on-device-ai-free-per-call-trap</link>
    <guid>https://thecloudybrain.com/on-device-ai-free-per-call-trap</guid>
    <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
    <category>til</category>
    <description>**What I learned.** On-device LLM calls cost $0 per call — so nothing in my stack ever flagged that I was making way too many of them.

Why it matters — cloud bills are accidental call-graph auditors, and Apple's Foundation Models took that auditor away.

The app is on-device by design: scan → match → recommend runs on the phone; the backend just syncs user state and ships a static catalog. So there was no per-call cost line to scream at me.

Then I audited it. One cold home-screen open fired **six** LLM calls — one quote, five narrations. 15–25 calls per typical session, several generating overlapping prose about the same wine. API pricing would have exposed that smell in a day.

The fix: consolidate to one or two structured calls per surface. The bill was never money — it was latency and battery.</description>
  </item>
  <item>
    <title>"You'll never know if the AI degrades you" — except you can</title>
    <link>https://thecloudybrain.com/trust-the-structure-not-the-agent</link>
    <guid>https://thecloudybrain.com/trust-the-structure-not-the-agent</guid>
    <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
    <category>news</category>
    <description>I spent Fable 5's launch day building with it — a whole publishing platform, including the bumps: it over-built twice, and I had to catch it. So when the sharpest critique of the launch landed the same day, it read like a description of my morning.

He's right that you can't know **why** an answer degrades. But you can know **that** it did — if the structure forces visibility. Every post here passes a human gate, AI objections are surfaced instead of silently applied, and every decision lands in a log I can read. Don't trust the agent. Verify the output.

---

**The story** — [Jonathon Ready noticed](https://jonready.com/blog/posts/claude-fable5-is-allowed-to-sabotage-your-app-if-youre-a-competitor.html) that the Fable 5 **model card itself** discloses safeguards that limit effectiveness on frontier-LLM-development requests — prompt modification, steering vectors, PEFT — explicitly **invisible to the user**, no fallback, no notice. His point: startups now train embedders and rerankers routinely, so the "frontier" line blurs — and a bad answer becomes indistinguishable: *confused, or quietly nerfed?* ([Announcement](https://www.anthropic.com/news/claude-fable-5-mythos-5) · [Mollick's hands-on](https://www.oneusefulthing.org/p/what-it-feels-like-to-work-with-mythos))</description>
  </item>
  <item>
    <title>Starlink adds a monthly kit fee — boat math changes</title>
    <link>https://thecloudybrain.com/starlink-rental-boat-math</link>
    <guid>https://thecloudybrain.com/starlink-rental-boat-math</guid>
    <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
    <category>link</category>
    <description>For a boat the calculation just shifted: the default new-customer path now carries a **recurring** hardware cost on top of the subscription, forever. On a vessel you refit yourself, owned hardware you can mount, ground, and repair on your terms beats drip-priced kit — so if marine connectivity is on the project list, buying the antenna outright at retail is now the deliberate move, not the default.

---

**The story** — Starlink introduced a **€10/month "kit fee"** for new residential customers (spotted by users, confirmed worldwide: US, Canada, UK, France, Australia, Mexico, Germany). The standard antenna was previously included free with a 12-month contract. You can still avoid the fee: declare you own an antenna and buy it at retail (e.g. MediaMarkt) instead. ([heise](https://www.heise.de/news/Starlink-aendert-Geschaeftsmodell-Hardware-Kits-fuer-Neukunden-zur-Miete-11326849.html))</description>
  </item>
</channel>
</rss>