Files
esh-pfi-infrastructure/persistent-memory.d/2026-09-15-esphome-and-kb.md
T
vh 838132cd6b memory: snapshot — FV cross-site routing fixed, fleet conventions pinned
Session captured: the FV outbound-NAT root cause and its diagnostic signature,
the fv-ml1 dead man's switch, fleet identity/group/path conventions and the
root:docker normalization, nh3-dev's ts-input reachability fix, ESPHome
modernisation and the kb KB-search tool, and the Hermes bearer rotation
release. Six new detail files.

Tried-and-abandoned gains three: probing OPNsense endpoints by POSTing at them
(which rebooted the FV firewall), advertising a /32 from nh3-dev, and the
nh3-scale remote-site masquerade rules that fired but were not the fix.

Housekeeping: 8 Recent-decisions entries archived to archival-memory.md, and 21
oversized inline entries split into detail files per the two-tier rule -- they
had been sitting fully inline in the index, which is what the split exists to
prevent. Two pointers to a detail file archived this run were repointed at
archival-memory.md.

The index is 389 lines, still over the ~300 soft cap. The archival guards stop
it there: only 4 further entries are old enough to move and every one carries an
open deferred-work pointer. An over-cap file that keeps live decisions beats a
scannable one that lost a deferred call.
2026-09-15 00:53:48 -07:00

3.2 KiB

[2026-09-15] ESPHome modernised for ha-dev; kb search tool for the personal Worldtree KB

ESPHome on esh-docker-vm (commits d1769ed, 8073a6a, 687c699, c659fa5)

Container had been on 2025.8.2 since April — twelve releases behind — because the image reference was untagged: docker pulled latest once at creation and never again. Every current Everything Presence sensor failed esphome config on it. Now pinned 2026.8.2; all six sensors validate.

⚠ Pre-state was worse than "old": there was no cli-plugins directory, so docker compose printed a help blurb and exited 0 — a silent no-op a deploy script cannot distinguish from success.

Three things the job surfaced that were not in the request:

  • The config dir was 538 MB, not the 3 KB reported. .esphome/platformio is 508 MB of toolchain, .esphome/build another 31 MB — both regenerable. Relocating as-asked would have inflated restic's /opt/docker source ~45x against its own ~12 MB budget. Both subtrees excluded in /etc/restic/profiles.yaml.
  • 2026.8.2 deprecates the bare USERNAME/PASSWORD env names and says they will stop working — i.e. a silent auth loss on some later bump, on a privileged host-network container that flashes firmware. Renamed.
  • Device Builder 1.0.0 ships remote-build ON by default binding 0.0.0.0:6055. ⚠⚠ Two switches, only one closes the port: set_offloader_settings {remote_builds_enabled} is the OUTBOUND half and leaves the receiver listening; remote_build/set_settings {enabled} is the receiver-side master switch. The one named like the master switch is not. Both set false; ESPHOME_REMOTE_BUILD_HOST=127.0.0.1 kept as a backstop because the off state lives in one JSON file whose in-code default is True and whose store soft-recovers to defaults on a malformed blob.

⚠ I committed a false claim that mDNS advertisement was gone. It was not — helpers.dashboard_advertise still announces _esphomebuilder._tcp at 6052. Corrected in c659fa5.

kb — direct search over the personal Worldtree KB (commit 68fa80f)

scripts/kb + scripts/kb-search.py, on PATH as ~/.local/bin/kb. ~0.9 s over 7,634 files, no tokens.

⭐ The Worldtree HTTP API cannot answer a question about the operator's notes. /search there searches conversation MESSAGES; a note that plainly exists comes back as a clean empty result with no error. Searching for shrimp returned 0 — and so did the and a, which is the only reason the empty result was read as an empty ACCOUNT rather than an empty KB.

Two measurements shaped the design: 7,492 of 7,634 notes are ingested library material (4,155 fiction chapters, 3,287 book sections, 50 papers) so NOTES and LIBRARY are ranked separately; and only 137 notes carry a frontmatter summary:, so the description falls through three shapes.

⚠ Both of the tool's own bugs produced confident wrong output rather than errors: deriving the word list from argv made a quoted multi-word query one pattern (kb "shrimp sous vide" → "no match" for a note it had just found), and resolving the payload from dirname $0 broke the moment it was symlinked.