414 Commits

Author SHA1 Message Date
vh 5178fdea3c fix(homepage): The High Seat icon -> mdi-eye-outline
svos-dev's call and the better one: The High Seat is the English name for
Hlidskjalf, the seat Odin watches all the worlds from, and watching every
session at once is what the board does. mdi-monitor-dashboard described the
artifact; the eye describes the job.

Deployed and verified in /api/services, not assumed.
2026-09-22 08:33:05 -07:00
vh 0ef25dfdb6 feat(homepage): add The High Seat (SVOS board, nh3-dev:8770)
Requested by svos-dev relaying the operator, 2026-09-22. Reversible work, so
the relay is fine to act on without escalating.

Manual services.yaml entry rather than container labels, because SVOS is a
user-level systemd unit (svos.service) on nh3-dev and nh3-dev is NOT one of
the five hosts in docker.yaml -- Homepage has no Docker API to discover it
through. Same reason the Booth, WhereTF, talk and the infra-hermes seat are
listed by hand, and the comment says so at the entry.

⚠ siteMonitor is "/" deliberately. There is no /api/health on this service:
that path 404s, and a monitor pointed at it would report the board
permanently down while it serves perfectly. svos-dev flagged it and it is
verified here -- / returns 200 and serves the SPA (<title>The High Seat</title>).

Group is Apps, which exists in settings.yaml's layout with tab: Main. An
invented group name gets no tab and renders on ALL tabs, which is how
Scriberr's "AI Systems" leaked across the whole dashboard in August.

Icon mdi-monitor-dashboard is my choice -- svos-dev explicitly did not guess
at one and offered to take a different suggestion.

Verified in a browser, not just in the API: the card renders in Apps with a
green site-monitor at 28 ms.
2026-09-22 08:30:58 -07:00
vh 94899d6fa3 feat(uptimekuma): normalize names off Homepage, publish the status page, restore the widget
NAMES. Homepage already answers "what is this service called", so the monitor
name is now that name verbatim -- a second naming authority is how drift starts,
and an alert reading "[Uptime Kuma] Beszel hub is DOWN" sends you hunting for a
card that does not exist. Only two rows moved (Beszel hub -> Beszel, Dozzle hub
-> Dozzle); the " hub" suffixes were mine, not the services'.

The remaining mixed case is deliberate and is now documented as such. talk, vor
and task-board are lowercase on Homepage and in their own repos; title-casing
them here would make this board disagree with both. What actually looked messy
was scripts/kuma's own ASCII-ordinal sort, which buried every lowercase name
below every capitalised one. Fixed to case-insensitive.

⚠ RENAME SAFETY, which this pass needed and did not have. The seed keys on NAME,
so editing a name would have read as a brand-new monitor: added fresh, with the
old row orphaned, still checking, still alerting, and holding all the history.
`rename_from:` names the old row for one run. Verified: both renamed monitors
kept their IDs and all 67 heartbeats.

Added with it, an orphan warning for any row on the board the spec no longer
names -- because a forgotten monitor keeps paging. Its first cut diffed against
the PRE-EDIT snapshot and so cried wolf on its own successful renames; it
re-reads the board now. A warning that fires on its own correct work is worse
than no warning.

STATUS PAGE + WIDGET. The Homepage uptimekuma widget reads a PUBLISHED status
page (/api/status-page/<slug>), not the admin API -- which is why the widget
labels were deliberately absent from the rebuild: a dashboard widget pointed at
a 404 is the suspected mechanism behind both of Homepage's unkillable D-state
wedges, so shipping one on purpose would have been daft.

The page now exists at slug `nethealth` (the pre-rebuild slug, so old references
still resolve) and is DECLARED IN monitors.yaml, applied by `kuma seed`. Same
principle as the notification channel: a from-scratch rebuild restores the page,
the channel and the monitors together, and nothing the widget depends on lives
only in Kuma's database. Verified in a browser: "13 SITES UP / 0 SITES DOWN /
100% UPTIME" on the dashboard.

⚠ saveStatusPage calls imgDataUrl.startsWith() unconditionally, so passing null
throws and leaves the page CREATED BUT EMPTY -- which reads as success from
/api/status-page (200, correct title) while the group list is silently blank.
Pass "" instead. Commented at the call site.
2026-09-22 00:55:29 -07:00
vh 6f0a9b9fae feat(alerts): generalize the althing bridge, wire Kuma to it, retire chamber
THE BRIDGE. `beszel-althing` hardcoded a "[Beszel] " subject prefix and a
Beszel hub footer from when Beszel was its only caller. Routing Uptime Kuma
through it unchanged would have delivered Kuma outages labelled [Beszel],
pointing the reader at the wrong dashboard -- an alert that lies about its own
source is worse than no alert.

Now a route registry: /beszel and /kuma, each with its own prefix, footer and
payload parser, because the tools do not agree on a shape (Beszel sends
{title, message}; Kuma sends {heartbeat, monitor, msg}). Generalising cost a
dict; a sibling service would have cost a second unit, a second port and a
second thing to notice had died.

Renamed beszel-althing -> althing-alert-bridge with it. A service named after
one consumer that carries two is the invisible coupling that sends a future
session looking in the wrong place.

⚠ /beszel IS FROZEN and this refactor proves it rather than claiming it. The
three original tests were kept BYTE-UNCHANGED -- including the one asserting
the exact postbox argv -- and deliver() still defaults to the Beszel route so
they exercise it. A new test asserts the Kuma footer never leaks into a Beszel
body or vice versa. Verified live after the rename: a real POST to /beszel
landed as "[Beszel] BRIDGE RENAME CHECK" with the correct hub footer, read back
from the thread rather than trusted from the receipt.

Payload shapes are parsed HERE, not via Kuma's custom-webhook-body feature,
because Kuma's notification config lives in its own database -- and that
database was destroyed and rebuilt from scratch hours ago. Anything living only
in a tool's DB is lost on the next rebuild; format knowledge belongs in git,
next to a test.

parse_kuma also handles the monitorless case. testNotification and cert-expiry
alerts carry no monitor and no heartbeat, and the first cut fabricated "unknown
monitor is ?" from them -- caught by sending a real one and reading the subject,
not by the suite. Fixed, pinned, and the earlier test asserting the bad
behaviour was corrected rather than worked around.

KUMA IS NOW WIRED. scripts/kuma gained notification support and the channel is
in monitors.yaml, seeded BEFORE the monitors and with applyExisting, so a
rebuild restores alerting and not just detection. Ground truth from the DB:
13 of 13 monitors carry the channel.

⚠ A THIRD instance of the same class of bug, worth naming: notifications() is
pushed as `notificationList` at LOGIN ONLY -- there is no event to ask with. The
first cut cleared the captured value before waiting, discarding the only copy it
would ever be sent, then blocked for the full timeout and reported an empty
list. That reads exactly like "no channels configured" and is a lie. Same family
as the getMonitorList ack-vs-push trap, different shape.

End-to-end, both shapes, read back from the inbox:
  [Uptime Kuma] Homepage is DOWN          + target + board link
  [Uptime Kuma] althing (infra-ops) Testing   (no fabricated subject)
  [Beszel] BRIDGE RENAME CHECK            + hub footer, unchanged

ALTHING CHAMBER RETIRED (operator). Three of its four containers had never
started -- created 2026-09-19, StartedAt epoch-zero, 0 restarts -- so :7881
refused, and nothing was watching it. Only its valkey was running, on the
project's own network with no external consumer. Stack, compose/build/conf dirs
and the local image removed; the Homepage card went with the label.
2026-09-21 23:11:54 -07:00
vh 3a85a6bce1 feat(uptimekuma): rebuild on 2.5.5 as the fleet's service layer, with a client
Homepage sat dead for three days in September while every monitoring tool
reported correctly. Beszel said its host was up -- it was. Uptime Kuma was not
watching it. The dashboard fell into the seam between two working instruments.

Measured before changing anything:
  - Beszel: 18 hosts x {Status, CPU, Memory, Disk, Temperature}. Its alerts
    table is (system, name, value, min) -- there is NO url column, so it is
    structurally incapable of "this endpoint should return 200". Not a config
    gap; the data model.
  - Uptime Kuma: 6 rows, 2 of them folders. Four real monitors, all firewalls.
  - So the two are NOT redundant. They are disjoint, and the service layer
    between them was empty.

REBUILT FROM SCRATCH, operator-authorised ("uptime-kuma was never really
used... you can even dump the existing container and config"). Nothing was
migrated, which also skipped the one-way v1->v2 database migration.

  - Pinned to 2.5.5. `:latest` is a documented trap now: upstream keeps it on
    the 1.x line, so an August 2026 pull produced an image BUILT 2024-12-20
    running 1.23.16. Verified by digest -- latest and 1 share one digest while
    2/next carry 2.5.5. Pinned exactly, not floating on 2, for the same reason.
  - Moved esh-docker-vm -> ana-docker. House placement rule puts cross-site
    services beside the Beszel and Dozzle hubs, and esh-docker-vm has wedged
    unkillably twice in four months. A monitor also cannot report the failure
    of the host it runs on, so it should not share a failure domain with the
    host layer.
  - Normalised restart: always -> unless-stopped, which the 2026-08-18 README
    flagged as worth doing on the next deliberate touch.
  - UPTIME_KUMA_DB_TYPE=sqlite in the compose skips 2.x's interactive database
    screen, so the stack comes up ready rather than parked on a form.

scripts/kuma is a first-party Socket.IO client, because both obvious paths are
wrong: there is no REST CRUD API in EITHER major version (server/routers/ holds
exactly two files, /metrics + badges + status pages), and the community wrapper
uptime-kuma-api is abandoned -- last release 2023-09-26, ceiling 1.23.1, no 2.x
support ever.

  ⚠ getMonitorList's callback returns only {ok:true}; the list arrives as a
  SEPARATE pushed monitorList event. Reading the ack yields an empty board that
  looks authoritative -- which duplicated all 13 rows on the first re-seed
  before the bug was found. The client now waits for the push, and carries a
  dedupe verb because of it.

13 monitors seeded from monitors.yaml, keyed on name so a re-run updates rather
than forking the board -- proven by re-running it (0 added, 13 updated), not
assumed. Every URL was probed before being written: all 200. A board that ships
red teaches everyone to ignore it.

Verified: 13 rows, no duplicates, all UP with "200 - OK" read from the database
WITH its WAL (a first read of kuma.db alone showed a stale 26 -- the copy
predated the deletes). Homepage renders exactly one Uptime Kuma card.

⚠ NOT YET WIRED: notification delivery. The board detects but tells nobody,
which is the same gap this work exists to close. The beszel-althing bridge
hardcodes a [Beszel] subject prefix and hub footer, so routing Kuma through it
unchanged would mislabel the alerts. Needs a decision before it is generalised.
2026-09-21 22:59:37 -07:00
Vuong Hoang 6692701571 docs(voices-seat): every voice prefixes an empty think block unless the caller disables it
Found while smoke-testing the lv-mccarthy ship. Measured live:

  default                 -> '<think>\n\n</think>\n\nThere were no horses in the road...'
  enable_thinking=false   -> 'The sun was hot on the dry riverbed and the stones were red...'

This is the Qwen3-4B-Instruct CHAT TEMPLATE, not an adapter property, so it applies
to lv-yarros, lv-bronte and lv-hemingway equally and has done since this seat went
up on 2026-09-16.

No gate number is affected: gen_beats_chat_yarros.py sets enable_thinking when the
template supports it, so every arm in every r49 gate was generated without the tags.
But a caller that does not pass chat_template_kwargs gets 17 junk characters at the
head of every passage -- and any word-count or in-band check run over that string is
counting the tags as prose. Skaldsong should be checked.
2026-09-21 18:02:56 -07:00
Vuong Hoang 17db37e1cc feat(voices-seat): ship lv-mccarthy (checkpoint-300) as the fourth author voice
Shipped on the operator's standing authorisation, "ship it if the gate passes".
The gate design of record for this line -- the operator's own v2 rule, ratified
2026-09-15 -- passes on all three axes:

  VOICE          +0.177 delta_cb at 3.2x the pairwise floor, the BEST arm of five,
                 and +0.128 at 2.8x on the pre-registered punctuation-stripped
                 secondary read, so ~3/4 of the gain is words rather than marks.
                 Closed 60.8% of the reachable span on an axis deliberately made
                 harder than Bronte's or Hemingway's.
  NOT COPIED     0.12 hit-rate against HELD-OUT McCARTHY'S OWN 0.12 -- 1.0x the
                 author -- with a longest verbatim run of 10 words against the 12
                 genuinely unseen McCarthy shares with the train split by
                 coincidence. All 31 matches READ: stock grammar, name-shaped hits
                 are the renamed inventions, nothing protectable. This matters:
                 McCarthy is in copyright with a living estate.
  NO DAMAGE      ran-on +0.12 against the 0.200 floor, 40% headroom, and the
                 measured minimum across the five-arm ladder.

ckpt300 over ckpt900, the eval-loss minimum: the two-epoch recipe is now 0 for 3,
and this time the curve was CONFIDENT and wrong -- ckpt900 is the minimum and
ckpt300 sits +15.8x the median neighbour jitter above it, yet ckpt300 wins every
axis that resolves (3.2x vs 1.2x voice margin, 2.7x tighter seed spread,
memorisation 1.0x the author vs 1.8x, ran-on 0.13 vs 0.28). On this schedule read
the axes, not the curve.

THE COST IS REAL AND IS WRITTEN INTO THE COMPOSE, THE ADAPTER README AND THE
MEMORY RECORD RATHER THAN GLOSSED. In-band is 0.65 against base's 0.89 and on-beat
0.42 against 0.71 -- 35% of generations miss the requested 90-140 word band against
base's 11%. Axis C is ran-on only and is structurally blind to this; that blindness
was identified and written down before these numbers existed. No checkpoint choice
fixes it: every adapted arm is 33-48% out-of-band and ran-on is non-monotonic in
epoch. If a caller depends on a word budget, expect one generation in three to miss
it, and the fix is a retrain targeting length rather than a different checkpoint.

Rollback is one line and 0.003 s: drop the --lora-modules entry, or POST
/v1/unload_lora_adapter. The other three voices are untouched.
2026-09-21 17:58:23 -07:00
vh 838ea60fc0 homepage: surface the infra-hermes bus seat status page (nh3-dev:8766) 2026-09-20 08:08:45 -07:00
vh 920f37c6c2 chore(althing): pin the post office to 3.7.0
Canonical pin bump for the 3.7.0 rollout forseti approved and released
(althing 6db955f, tag v3.7.0). Image built from that tree and pushed as
sha256:df0709b3f532557aebb47d6ece486ae32e851776f732862094608d55eefcd4e7;
previous pin was 3.6.3@sha256:978f8553 and remains the rollback target.

Content-verified rather than tag-verified: `postbox --version` inside the
built image reports 3.7.0 before it was pushed, and again inside the running
container after. A tag is a claim.

Also adds playbooks/nh3-extdev-althing-upgrade.yaml -- a version-parameterised
upgrade for the box a git pull cannot move. The existing
nh3-extdev-althing-v3.yaml is the historical v2->v3 CUTOVER and is left alone
rather than mutated per release; it still carries v2-retirement steps that
document what happened.

Every check in the new playbook asserts what the installed entry point
reports, including one that the herald restarted within the last 5 minutes
rather than surviving from before -- "active" does not mean "running the code
you just installed".
2026-09-19 06:49:11 -07:00
vh 5b20b02fb9 chore(searxng): adopt the concurrent v4 work, with its dead mechanism marked
Picks up uncommitted searxng changes left by another session and makes them
truthful rather than committing them as written. The stack itself verifies
clean: canonical and live are byte-identical for both compose.yaml and
searxng-settings.yml, the container is running with zero restarts, and live
queries return 51-54 results from 5-6 engines with braveapi contributing 20
each time.

compose.yaml gains SEARXNG_BRAVE_API_KEY, which NOTHING READS. It was added on
the belief that settings.yml could pull it via `!ENV SEARXNG_BRAVE_API_KEY`;
this build has no !ENV YAML constructor, so that attempt made the file
unparseable and crash-looped the container ten times with fleet search down.
The comment claiming the variable is "consumed by settings.yml" is replaced
with what is actually true. The variable is kept, unused, in case upstream ever
gains env interpolation — a comment that lies is worse than a variable that
does nothing.

The Tier A playbook is marked superseded FOR THE SETTINGS FILE ONLY, and
scoped deliberately: its v4 design uploads a settings file carrying the !ENV
tag, which would re-break the container, so settings deployment goes through
scripts/deploy-stack.sh like every other stack. Its .env merge and
up-d-not-restart steps remain useful, as do its two warnings recording real
bugs it hit — a wholesale .env overwrite that clobbered SEARXNG_SECRET, and a
sed that inserted literal backslash-n into compose.yaml. An unscoped
"superseded" banner would have buried those; that failure mode cost an outage
earlier today.

Also folds in the regenerated graphify report.
2026-09-18 14:11:58 -07:00
vh d812bfe96d feat(homepage): update the talk tile to the inverted mark
talk shipped a reworked mark at v18 on operator ruling — the 1024x1024
cerulean field rect is gone, the bubble now carries #03adfb where it used to
carry #2e2d30, and the three waveform bars are holes rather than filled
shapes. Path data is byte-identical to the original trace; only the two fills
moved. Fetched from the app and from the booth and confirmed the two sources
are byte-identical before taking either.

tts-dev flagged a real risk with the change: with the field gone the tile
background shows THROUGH the waveform holes, so a tile close to #03adfb would
swallow the bars. Checked rather than assumed. Homepage's card surface is
--sea-20, oklch(0.31 0.022 262) = #2a313c, a dark desaturated navy; the bubble
against it is 5.22:1, well clear of the 3:1 bar for non-text graphics. The
page ground behind it is 6.73:1. Safe on this tile specifically — the earlier
"reads well against the tile background" judgement was about a solid square
and did not carry over on its own.

Also refines the Next.js note in CLAUDE.md, which was over-broad. A NEW file in
the images mount 404s until restart, but REPLACING an existing file's bytes
serves immediately with no restart — measured here, the served hash matched the
new file straight after rsync. It is the route table that freezes at container
start, not the file contents. The previous wording would have had people
bouncing Homepage for every icon tweak.
2026-09-18 14:08:18 -07:00
vh 9219942037 feat(searxng): enable the keyed braveapi engine
Brave Search API key wired literally into the settings file and committed.
Operator decision, 2026-09-18, made explicitly: this is a free-tier key on a
rate-limited service of marginal value — "if the service is useless, so is the
key" — so it does not justify the machinery that keeping it out of git would
cost. The key remains in the vault at nh3-docker/searxng-brave-api-key as
well. This is a scoped judgement about one low-value credential and not a
change to the no-secrets-in-git rule for anything else.

⚠ It cannot be un-committed. Rotation means issuing a new key at Brave and
replacing the line; never a history rewrite, since the repo is shared and
other sessions commit to it.

There is no supported alternative in this build. An earlier attempt used
`api_key: !ENV SEARXNG_BRAVE_API_KEY`, which crash-looped the container ten
times with search down fleet-wide: the settings loader has no !ENV YAML
constructor, reads only SEARXNG_SETTINGS_PATH from the environment, and the
entrypoint substitutes only `ultrasecretkey` at template-creation time. The
variable reaches the container and is never read. Literal or nothing.

Key verified against Brave's API directly before wiring, and verified in place
after: three consecutive queries returned 55-63 results from six engines with
braveapi contributing 20 each time, while google cse and marginalia remain
quota-suspended. General web engines are now seven, up from one this morning.
2026-09-18 13:07:39 -07:00
vh 274d3e2443 fix(searxng): six general web engines by default, not one
Root cause of the silent-empty-results failure peedlar-dev reported. Of 55
general-category engines, only seven were enabled-by-default, and six of those
are dictionary, translation, currency or encyclopedia engines that return
nothing for an ordinary web query. `google cse` was the instance's ONLY general
web engine, so a single quota exhaustion produced HTTP 200 with an empty
results array and no error, for every consumer on the fleet.

The distinction that matters: `inactive: false` only makes an engine
selectable, `disabled: false` puts it in the default set. The other 48 were
selectable-but-off, which an API client has no way to change.

Enables five keyless engines, each bang-probed first and returning real results
with no API key: duckduckgo web 10, bing 10, yep 20, yahoo 7, wiby 12. General
web engines go 1 -> 6. Deliberately excluded: mojeek, qwant, startpage and the
brave scraper, all of which CAPTCHA or rate-limit this egress, and seznam,
which times out.

Verified under the live failure condition rather than a simulated one. google
cse is still quota-suspended right now, and three consecutive queries returned
38-41 results from 4-5 engines each. The single point of failure is gone while
the failing engine is still failing.

Also adopts the concurrent v4 settings work from the other session — marginalia
on its public key, and the captcha'd-scraper removals — plus the fix for the
crash-loop that work introduced: this build has no !ENV YAML constructor, so
`api_key: !ENV SEARXNG_BRAVE_API_KEY` made the file unparseable and the
container restarted ten times with search down fleet-wide. That block stays
commented; the vaulted Brave key is valid but has no supported path into the
settings file, which is a separate decision.
2026-09-18 13:02:43 -07:00
vh 9a428fded9 fix(searxng): update to 2026.9.18 — all four engines restored
searxng had been answering from google cse alone for at least a day, with
brave and startpage suspended and duckduckgo returning CAPTCHA. Updating the
image from 2026.9.3+a1144dda3 to 2026.9.18+c0042add3 restored all four
engines immediately, and they held across 11 consecutive queries run after the
change specifically to rule out a freshly-reset circuit breaker flattering the
first measurement.

  before  searxng/searxng@sha256:3602e6ddbeba037f5d800d1ed9d296a8b93c9f5b3cf9d05fa179d0e766dd59a1
  after   searxng/searxng@sha256:e0027a772aeeea55bf642256aae6fb3344ffa5f25ca665898c2ea821101334c4

The image stays on :latest rather than being digest-pinned. For this stack that
is deliberate and now demonstrated: upstream ships engine-handler fixes as
providers change their bot gating, so being current is the mitigation, and a
pin would have frozen the breakage in place. The post office is pinned for the
opposite reason — it is the fleet message bus and must not move under us.

README corrected. It had carried two successive wrong diagnoses, both blaming
egress, and now records the real cause plus the two measurements that
falsified them: reverting to direct NH3 egress reproduced the failure exactly,
and a live !ddg probe on a freshly restarted container also CAPTCHA'd, ruling
out a stale suspension timer. Both wrong claims asserted causation from
correlation without a baseline.

The health-script blind spot is unchanged and still called out:
scripts/searxng-health.sh reports the same passing result whether four engines
answer or one.
2026-09-18 12:46:21 -07:00
vh ca5f0a91c0 searxng: sync settings with live (captcha-era engine set) 2026-09-18 12:42:51 -07:00
vh 1a35181b67 revert(searxng): return search egress to direct NH3
Reverts the outgoing.proxies block added in 156e126. Canonical restored from
that commit's parent and verified byte-identical to the host's
searxng-settings.yml.pre-esh-20260917 backup, then deployed via
scripts/deploy-stack.sh so canonical and host converge rather than drift. The
esh-scale searxng-egress.service is stopped and disabled; tailscaled on that
container was not touched.

⚠ THE ROLLBACK DID NOT RESTORE THE ENGINES, WHICH FALSIFIES THE REASON GIVEN
FOR IT. 156e126 recorded that moving egress to ESH had cost three of four
engines. Measured after this revert, with egress confirmed back on
70.230.226.88 and the same instrument used for the before-measurement, the
result is identical: brave and startpage suspended, duckduckgo CAPTCHA, google
cse the only engine answering. Per-engine bang probes confirm duckduckgo is
CAPTCHA-ing the residential address live, so this is not a stale suspension
timer.

The engine failures therefore have some other cause and predate or are
independent of the ESH move. The claim in 156e126 asserted causation from a
correlation without measuring the pre-change state; the only evidence for
"residential egress avoids CAPTCHAs" was a comment dated 2026-09-03, which is
no longer true of this address.

The revert still stands on its own merits: ESH egress bought no measurable
improvement while adding a hard dependency on ESH WAN and mesh availability
for all fleet search, so the simpler configuration is the better one. It is
simply not the fix for the engines.

README rewritten to match: direct NH3 is documented as current, the ESH
attempt is kept as history with its measured outcome, and the health script's
blind spot is called out — scripts/searxng-health.sh prints a passing result
while three engines are blocked, because it gates on "any results returned"
and treats failed engines as informational. That script needs to fail on
blocked engines before any future egress change, or the next regression is
equally invisible.
2026-09-18 12:34:52 -07:00
vh 156e12619d feat(searxng): route search egress through the esh-scale SOCKS5 proxy
Committing work deployed on 2026-09-17 that had been left uncommitted, so
canonical intent stops disagreeing with the running host. The deployed
/opt/docker/conf/searxng/searxng-settings.yml is byte-identical to the
canonical file here, verified before this commit.

Search requests and their DNS now exit via socks5h://10.0.50.65:1080 on
esh-scale (CT 108), an application-level proxy rather than a host-wide exit
node; no route or firewall changes. microsocks runs as nobody under
searxng-egress.service, binds only 10.0.50.65:1080, and bypasses SOCKS auth
for source 10.100.50.40 alone — every other source must supply a password
regenerated at each start and never distributed. Verified active and enabled.

There is deliberately no direct-NH3 fallback: an ESH outage must fail the
search rather than silently revert egress.

⚠ THE CHANGE HAS NOT ACHIEVED ITS PURPOSE AS DEPLOYED. Two independent live
queries, 2026-09-18, both report brave "Suspended: too many requests",
duckduckgo "CAPTCHA" and startpage "Suspended: CAPTCHA", leaving google cse
as the only answering engine. Moving egress off NH3's residential address is
what this change did, and CAPTCHA avoidance was the stated reason searxng sits
at NH3 at all. The README anticipated the risk in its Dependency note; it has
materialised. Rollback procedure is in the README and the pre-change config is
kept on the host as searxng-settings.yml.pre-esh-20260917.

Measured egress also drifted from the value recorded at cutover: the README
notes 154.50.58.126, the proxy now exits 128.177.138.182. Expected — the README
pins no public IP and calls out WAN failover — but recorded here so the number
in the doc is not mistaken for current.

Also retargets seat-inventory.py's default host from the mesh address
100.64.0.7 to fv-ml1's LAN address 10.251.50.54, routed by the site gateway.
2026-09-18 12:30:42 -07:00
vh 670ac9e8a0 deploy(althing): pin the post office to 3.6.3
Canonical intent still named the 3.6.2 digest while nh3-docker was running
3.6.3, so the next scripts/deploy-stack.sh run against this stack would have
silently rolled the fleet message bus back and taken the hyphenated-search
fix with it. Caught by forseti during independent post-deploy verification.

3.6.3 is the literal-search fallback: a query containing a hyphen was parsed
by FTS5 as a column filter, raised OperationalError, and search() returned []
— indistinguishable from "no results" — so every hyphenated term on this
fleet silently matched nothing. nh3-docker, irv-ml1, esh-docker-vm, tts-dev
and every other hyphenated name were unsearchable.

Deployed digest verified against the running container before this pin:
sha256:978f85533674ee248d6c6f29c54ffab0bc2cb16332c18c9fb8bfda1d566e2de4,
built from git archive of tag v3.6.3 (5de41b7). The image line is the only
difference between canonical and live; the two files are now identical, so a
managed deploy is a no-op rather than a regression.
2026-09-18 12:17:58 -07:00
vh d6a9d70b9e feat(homepage): add talk tile with its commissioned mark
talk has served on nh3-dev since 2026-09-08 with no dashboard presence.
nh3-dev is not a Docker-stack host and is absent from docker.yaml, so
label auto-discovery cannot reach it — this is a manual services.yaml
entry in Apps, beside the Booth and WhereTF which are there for the
same reason.

siteMonitor points straight at the app: talk.nh3.phasefinal.com:8092
now presents the Let's Encrypt *.nh3.phasefinal.com wildcard (valid to
2026-12-06), so no cert or port special-casing is needed.

Icon is copied into the images mount rather than hot-linked from the
booth, which is scratch space. Document the two traps that cost time
here: Homepage v2 serves nothing but custom.css/custom.js out of the
config dir, and Next.js fixes its public/ route manifest at container
start, so a newly added image 404s until the container is restarted.
2026-09-18 06:50:21 -07:00
vh 300ecc1276 voices-seat: ship lv-hemingway (ckpt850), and replace the memorisation control that passed it
Live on vllm-voices (fv-ml1 GPU0 :8027) beside voices-base, lv-yarros and lv-bronte.
Healthy 190 s after recreate, four models served, GPU0 96,092 -> 96,090 MiB. The adapter
was verified byte-identical to checkpoint-850 by sha256 across both transfer hops, and the
seat was verified by generating, not by reading its config: base emits 170 words of <think>
planning and never writes the passage, lv-hemingway writes the scene.

Gate design was pre-registered before any generation existed (0bb4938). Three arms, 60
held-out beats, 4 seeds, 240 generations per arm.

  A. VOICE   PASS 6.4x   +0.413 delta_cb, pairwise floor 0.064 -- and it clears the OLD
                         all-arms floor (0.113) too, so this verdict does not lean on the
                         rule change. Closes 73.8% of the span between the unadapted
                         carrier and held-out Hemingway itself; lv-bronte closed 48%.
  B. NOT COPIED  see below
  C. NO DAMAGE   PASS    ran-on +0.08, on-beat -0.14, both inside a 0.217 floor

AXIS B: THE NEGATIVE CONTROL WAS THE WRONG ONE, AND FIXING IT MADE THE RESULT WORSE, NOT
BETTER. memorization_check.py uses the base-unadapted arm as its control. Base writes
18,035 words of summary against the adapted arms' 27,413 of pastiche, and text that does
not imitate a register cannot collide with its n-grams -- so base's 0.00 measures "different
register", not "did not memorise". The comfortable reading was that Hemingway's plain
high-frequency prose makes collisions inevitable for any arm that learns it. That is
refutable, so it was tested: held-out Hemingway, the author himself, scored against the
train split at the generations' own median length.

  HELD-OUT HEMINGWAY (never trained)   370 chunks   0.01 hit-rate   mean-longest 0.1   max 10
  base-unadapted                       240 gens     0.00                        0.0        0
  ckpt850 (shipped)                    240 gens     0.07                        0.6        9
  positive control (train vs train)                                             160

The hypothesis is false: the adapter reproduces train n-grams ~7x more often than the
author reproduces himself. That is real and is on the record. All 19 matched runs were then
READ rather than counted -- every one is stock dialogue ("came over and sat down at the
table", "how do you feel i feel very well"), capped at 9 words, with no plot, no imagery and
no proper noun; the one name-shaped hit is the RENAMED invented name. Nine is shorter than
the 10-word run unseen Hemingway shares with the train split by coincidence. Elevated rate,
zero protectable content. Hemingway is in copyright; lv-yarros is the in-line precedent,
also in copyright, shipped at 0.10 against a 0.07 control. Unload is 0.003 s.

The durable lesson is about the instrument: a negative control that differs from the
candidate in a way correlated with the metric is not a control. memorization_selfsim.py and
memorization_dump_matches.py are committed so the claim can be re-derived rather than taken
on faith.

SHIPPED ckpt850, NOT the loss minimum at step 1750. The two are indistinguishable on voice
-- 0.072 apart against a 0.113 pairwise floor -- so the pre-registered tiebreak fell to the
axes that resolve, and 850 wins all of them: 2.3x tighter seed spread (0.050 vs 0.113),
lower memorisation, less ran-on, half an epoch less overfit. ckpt1750's spread is one seed
(0.491, 0.449, 0.468, then 0.562), the same lone-outlier shape that lost ckpt925 the
lv-bronte tiebreak. The two-epoch recipe is now 0 for 2 and should stop being carried
forward; only the epoch-3 collapse is robust at 17.4x jitter.

servers/fv-ml1/ssh-target was a bare IP, so deploy-stack.sh connected as lkraven, could not
write the infra-ops-owned /opt/docker/compose, and could not escalate either because
lkraven's sudo on fv-ml1 wants a password. Now infra-ops@10.251.50.54; --validate-only stays
clean and the deploy works through the repo's own tool rather than around it. Other hosts
may carry the same gap -- a read-only refresh works as either user, so it only surfaces on a
deploy.
2026-09-17 03:36:29 -07:00
vh 2e9b118e70 lv-bronte: the voice axis passes under the corrected floor rule — amended, not rewritten
lv-bronte shipped 2026-09-17 with a FAILED voice axis written into its compose comment,
its NFS README and its gate record. That verdict no longer stands, and this records the
correction in all three places without deleting what they said.

The floor rule is now pairwise (commit 0bb4938, pre-registered for lv-hemingway before
any Hemingway number existed). Re-scoring the SAME 360 generations, no re-run, no changed
delta_cb:

  ckpt475 (shipped)      +0.193  vs pairwise floor 0.091  -> PASS, 2.1x
  ckpt925 (not shipped)  +0.210  vs its own spread 0.251  -> still fails

As run, the floor was 0.251 for every candidate, contributed entirely by ckpt925's single
outlier seed — a candidate nobody was shipping failed the one that was.

Why this is not a threshold chosen to produce a verdict: the previous session found the
defect, wrote it into this very file, and deliberately declined to act on it. The rule was
changed prospectively on an argument independent of the answer — the sampling variability
of a difference A-B depends on A and B, not on a third arm C. voice_distance.py now prints
both floors and flags disagreement so neither can be quoted without the other.

What changes for a reader: the sensitivity floor is 0.091 rather than 0.251, and "do not
cite lv-bronte as evidence pair-SFT works for this author" is withdrawn. What does not
change: NOT-COPIED and NO-DAMAGE as recorded, ckpt475 over ckpt925 for the same reasons,
and the two-epoch recipe still not transferring to Brontë.

Amendments are append-only in all three artifacts. The on-host compose is unchanged so far
— this edit is comment-only and will ride with the next real deploy rather than triggering
a model reload for a comment.
2026-09-17 02:27:52 -07:00
vh 61840f3131 voices-seat: ship lv-bronte (ckpt475) with its failed voice axis on the record
lv-bronte is live on vllm-voices (fv-ml1 GPU0 :8027) alongside voices-base and
lv-yarros. The seat lists all three; container healthy; GPU0 96092 -> 96090 MiB,
so the adapter cost nothing measurable.

IT DID NOT PASS ITS VOICE GATE, and the artifact says so in three places — this
commit, a comment in the compose file, and a README beside the adapter on NFS —
because an adapter found without its provenance will otherwise be read as a pass.

  VOICE       FAIL  +0.193 delta_cb vs base, against a 0.251 measured noise floor
  NOT COPIED  PASS  8-gram hit-rate 0.00, longest 0 - identical to the control
  NO DAMAGE   PASS  ran-on +0.15 against a 0.400 floor

Shipped on three grounds, none of them that the number was nearly good enough:
it is additive (a named LoRA nobody reaches without asking for it), reversible
(one compose line; hot-unload measures 0.003 s), and clean on the axis that
carries actual risk - verbatim regurgitation of the source, on a public-domain
corpus, measured against a positive control that saturates at 160.

The voice result is UNDERPOWERED rather than absent: it closed 48% of the span
from base to the same-author target and beat the control on every individual
seed. The cause is structural - 81 val pairs against Hemingway's 200, from a
678k-word corpus against 994k - and neither more beats nor more seeds fixes it,
because the floor is a range statistic and ranges widen with n.

ckpt475 over ckpt925: indistinguishable on voice (0.017 apart), but ckpt925 has a
verbatim 8-gram hit where this has none, and is 2.7x less stable seed-to-seed
(0.251 vs 0.092) with a degeneracy probe showing no collapse to explain it.
2026-09-17 01:22:03 -07:00
Vuong Hoang d17bd3df86 voices-seat: one carrier, lv-<author> LoRA adapters, with the measured cost and placement limits 2026-09-16 13:51:51 -07:00
vh 66c860d6c1 fix(sweep): retire the dead 10.100.79.3 address across the fleet
Operator-directed. The wg0 lifeline retired at the 2026-09-06 headscale cutover is
on no interface anywhere, so anything pointing at it gets no route at all. Homepage
went from 9 dead cards to 0 of 112.

The load-bearing part is that there is no single right target: it depends on who
resolves it. The operator's browser and the Homepage and open-webui containers on
esh-docker-vm all resolve nh3.internal, so those get the name and survive the next
renumber. Containers on irv-ml1 and ana-docker cannot resolve it at all, so those
get the IP.

litellm on ana-docker looked like a counterexample and is not: it resolves the name
only through its own extra_hosts entry, while asset-engine on the same host fails on
it. Test from the container you are about to change, never from a neighbour. Before
committing to the name I confirmed the Homepage container actually fetches ytvc's
healthz through it in production rather than assuming resolution implies reach.

On irv-ml1, 24 files swept and 14 comment-only hits left as port-allocation history.
Seven running containers recreated so the labels took. Seven dormant ones carried
stale labels because editing a compose file does not touch an existing container
object - fixed with compose create --force-recreate, which rebuilds the container
without starting it, the right tool for a deliberately dormant stack.

The sweep's real find was off irv-ml1 entirely: four live values on two other hosts,
silently dead for nine days and alerting nobody. Open WebUI's read-aloud TTS,
asset-engine's inference host, and two skaldsong TTS URLs. Both running services were
recreated and verified reaching their targets afterwards rather than merely carrying
the new string.

One self-inflicted outage worth recording: I recreated breeze-tts for a cosmetic
label change and took ext-tts down for its ~90s CUDA-graph warm-up, returning 500. I
caught it only because I had taken a baseline before touching it. A label-only edit
still costs a full model reload on a GPU container.
2026-09-15 08:41:44 -07:00
vh caa04801f3 fix(parakeet): move the seat from the empty GPU 3 to GPU 0
Placed on GPU 3 first because it was the empty card. That was the wrong read:
the seat is ~800 MiB, under 1% of a 96 GB card, so the question was never "where
does it fit" but "whose headroom is cheapest to spend".

vLLM sizes its KV cache as a fraction of TOTAL VRAM, not free VRAM. A resident
tenant on an otherwise-clean card therefore does not cost its own megabytes — it
costs the profiling margin of whatever full-size seat lands there later, and
flash-next needs 93 GiB of 96. A 96 GB card at 2 MiB can still take that; the
same card at 922 MiB is one where the next big seat needs its utilization
hand-trimmed, which this repo's flash-next history shows is both thin and silent
when it goes wrong.

Committed utilization per card is the number that governs, not free bytes:

    GPU 0   0.40 + 0.48                       = 0.88    ~13 GB spare  <- moved here
    GPU 1   0.52+0.24+0.10+0.055+0.03+0.03    = 0.975   ~4.3 GB
    GPU 2   0.96                                        ~1.8 GB
    GPU 3   -                                           kept empty as reserve

GPU 3 is back to 2 MiB / 97,247 MiB free and is now documented as a deliberate
reserve rather than a spare.

Post-move n=5 on the same clip: 0.68 / 0.54 / 0.54 / 0.52 / 0.53 s, median 0.54 s
against 0.50 s on GPU 3. The spreads overlap at this sample size and no difference
is claimed; the GPU 3 figure was taken on an idle card and is now noted as a best
case, since the seat shares GPU 0 with the hot serving path. Silence control and
the gateway round-trip both re-verified after the move.

Also records both Parakeet endpoints (FV v3 on Blackwell, IRV v2 on a 3090) and
the four confounds that make them not an A/B pair, sent to tts-dev for the bench.
2026-09-15 01:50:25 -07:00
vh b9b14b5baf feat(parakeet): stand up Parakeet STT on fv-ml1 GPU 3 + LiteLLM ext-stt/whisper-1
Retargets the existing sherpa-onnx stack from irv-ml1 to fv-ml1's utility card
and puts it behind the gateway. GPU 3 was the only card with room: 0/1/2 carry
the vLLM seats at 84-95.5 GB of 96.

Changes:

- compose: pin GPU via `device_ids: ["3"]` (the dead on-host stub used
  `count: all`, which would have handed a 0.6B ASR seat all four cards);
  join traefik-net; port 8300; homepage href to the live FV address.
- .env.example: default to the v3 int8 model (25 European languages, 464 MiB)
  rather than English-only v2; models to /tank/parakeet/models.
- app.py: warm the recognizer at startup before uvicorn accepts traffic.

The warmup is not an optimisation. ONNX Runtime's CUDA EP compiles and autotunes
lazily on the FIRST DECODE, and on sm_120 that measured 45.7s cold (reproduced at
45.1s on a second container) against ~0.50s warm. A 45s first request is
indistinguishable from a hang and LiteLLM's default timeout abandons it long
before it returns. Decoding 1s of silence at load moves the cost inside the
healthcheck's 300s start_period; first real request after restart is now 0.65s.

Verification, because "provider=cuda" in the log is only an echo of the env var:
ORT falls back to CPU silently and still returns correct text, so the service
being up and the transcript being right establishes nothing. The discriminator is
a process on GPU 3 (922 MiB), confirmed. Controls both directions — a known TTS
sentence transcribes near-exactly (positive), 3s of digital silence returns
empty (null). Warm throughput 0.50s median on an 8.52s clip, n=5, spread
0.47-0.65s, single-stream, one clip: a smoke measurement with its harness
stated, not a benchmark.

Gateway aliases `ext-stt` (engine-neutral, mirrors ext-tts) and `whisper-1`
(OpenAI-compatible drop-in) registered via POST /model/new, i.e. LiteLLM's
Postgres store where the ext-tts family already lives — no gateway restart, and
config.yaml is consequently not a complete picture of what the gateway serves.
Both verified end to end.

The aliases use a raw IP deliberately: ana-docker resolves no .internal names at
all (resolv.conf points at 1.1.1.1), and LiteLLM only reaches irv-ml1 through a
hand-pinned extra_hosts entry. A second hosts entry would mean recreating the
container and bouncing the gateway for every consumer.

Also records the svos_miranda plugin validation pass and its structural findings,
and notes that the irv-ml1 parakeet is still running — there are two now, and
retiring the old one is the operator's call.
2026-09-15 01:41:41 -07:00
vh c659fa5020 fix(esphome): correct the record — mDNS advertisement was never removed
ha-dev caught a false claim I committed in 687c699: 'no mDNS advertisement'
and '_esphomebuilder._tcp gone too'. Both wrong. The dashboard is still
advertised; I confirmed it independently with an mDNS PTR query rather than
taking the correction on trust — 331-byte response from 10.0.50.45.

The error was two instruments deep. First, wrong instrument: I inferred a
network fact from a log grep instead of asking the network. Second, the grep
itself was silently truncating —  returned 0 for a
line that exists in the full log at 19:03:03 on the current boot, because a
bare time is parsed against a different reference than the displayed
timestamps. A filter that drops your window reports absence indistinguishably
from a real zero.

Re-verified the peer-link conclusion against the FULL log, since it rested on
the same bad grep: 'peer-link site listening' appears at 18:55:22 and 19:01:28
only, both before the 19:03:01 restart, and Netid State      Recv-Q Send-Q                                                                      Local Address:Port               Peer Address:Port     Process
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 503187424                     * 503225110
u_str ESTAB      0      0                                                                                       * 321804885                     * 321804884
u_dgr ESTAB      0      0                                                                                       * 520466417                     * 25662
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 502189514                     * 502207581
u_str ESTAB      0      0                                                                                       * 20836                         * 15946
u_str ESTAB      0      0                                                                                       * 364734154                     * 364734153
u_str ESTAB      0      0                                                                                       * 172931544                     * 172931545
u_str ESTAB      0      0                                                                                       * 187891155                     * 187891156
u_str ESTAB      0      0                                                                                       * 520270573                     * 520261514
u_str ESTAB      0      0                                                                                       * 20631                         * 25881
u_str ESTAB      0      0                                                                                       * 172931543                     * 172931542
u_dgr ESTAB      0      0                                                                                       * 16863                         * 16864
u_str ESTAB      0      0                                                                                       * 503210394                     * 503205589
u_str ESTAB      0      0                                                                                       * 248399528                     * 248399529
u_str ESTAB      0      0                                                                                       * 105475370                     * 105475371
u_str ESTAB      0      0                                                                                       * 69011789                      * 69011788
u_str ESTAB      0      0                                                                                       * 3165934                       * 3165933
u_str ESTAB      0      0                                                                                       * 24696                         * 20601
u_str ESTAB      0      0                                                                                       * 2175986                       * 2175985
u_str ESTAB      0      0                                                                                       * 172931558                     * 172931559
u_str ESTAB      0      0                                                                                       * 160801993                     * 160801992
u_str ESTAB      0      0                                                                                       * 18386                         * 18385
u_str ESTAB      0      0                                                                                       * 187891160                     * 187891159
u_dgr ESTAB      0      0                                                                                       * 61008                         * 25662
u_str ESTAB      0      0                                                                                       * 3167752                       * 3167753
u_dgr ESTAB      0      0                                                                                       * 17512                         * 25662
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 20596                         * 24684
u_str ESTAB      0      0                                                                                       * 364734156                     * 364734155
u_str ESTAB      0      0                                                                                       * 172931557                     * 172931556
u_str ESTAB      0      0                                                                                       * 163017376                     * 163017377
u_str ESTAB      0      0                                                                                       * 24671                         * 19536
u_str ESTAB      0      0                                                                                       * 160801991                     * 160801990
u_str ESTAB      0      0                                                                                       * 37642868                      * 37642869
u_str ESTAB      0      0                                                                                       * 535492351                     * 535492350
u_str ESTAB      0      0                                                                                       * 105475367                     * 105475366
u_str ESTAB      0      0                                                                                       * 24705                         * 24706
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 271511134                     * 271557694
u_str ESTAB      0      0                                                                                       * 2175985                       * 2175986
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 15948                         * 16931
u_str ESTAB      0      0                                                                                       * 18328                         * 15945
u_str ESTAB      0      0                                                                                       * 105323726                     * 105323727
u_str ESTAB      0      0                                                                                       * 45403900                      * 45403901
u_str ESTAB      0      0                                                                                       * 527114553                     * 527114554
u_str ESTAB      0      0                                                                                       * 287336311                     * 287336310
u_str ESTAB      0      0                                                                                       * 287354062                     * 287354063
u_str ESTAB      0      0                                                                                       * 105315056                     * 105315055
u_str ESTAB      0      0                                                                                       * 3165933                       * 3165934
u_str ESTAB      0      0                                                                                       * 14493                         * 14492
u_str ESTAB      0      0                                                                                       * 16875                         * 24708
u_dgr ESTAB      0      0                                                                                       * 27435051                      * 25664
u_str ESTAB      0      0                                                                                       * 163017377                     * 163017376
u_str ESTAB      0      0                                                                                       * 505982055                     * 505963077
u_str ESTAB      0      0                                                                                       * 505979226                     * 505982036
u_str ESTAB      0      0                                                                                       * 248399529                     * 248399528
u_str ESTAB      0      0                                                                                       * 51378988                      * 51378989
u_str ESTAB      0      0                                                                                       * 364734155                     * 364734156
u_str ESTAB      0      0                                                                                       * 160777161                     * 160777160
u_dgr ESTAB      0      0                                                                                       * 20583                         * 25662
u_str ESTAB      0      0                                                                                       * 37642870                      * 37642871
u_str ESTAB      0      0                                                                                       * 520270568                     * 0
u_str ESTAB      0      0                                                                                       * 105475368                     * 105475369
u_str ESTAB      0      0                                                                                       * 18990478                      * 18991473
u_str ESTAB      0      0                                                                                       * 4332746                       * 4332745
u_str ESTAB      0      0                                                                                       * 4041751                       * 4041752
u_str ESTAB      0      0                                                                                       * 24684                         * 20596
u_str ESTAB      0      0                                                                                       * 520517051                     * 0
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 321223400                     * 321228120
u_dgr ESTAB      0      0                                                                                       * 28403                         * 25662
u_str ESTAB      0      0                                                                                       * 172931542                     * 172931543
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 15945                         * 18328
u_str ESTAB      0      0                                                                                       * 51378990                      * 51378991
u_str ESTAB      0      0                                                                                       * 364734153                     * 364734154
u_str ESTAB      0      0                                                                                       * 172931561                     * 172931560
u_str ESTAB      0      0                                                                                       * 28400                         * 19407
u_str ESTAB      0      0                                                                                       * 287336310                     * 287336311
u_str ESTAB      0      0      /run/containerd/s/11912e5b8985b87f67739888cd3d1796ea228b84682db1a435736131d390e93d 505982036                     * 505979226
u_str ESTAB      0      0                                                                                       * 51378992                      * 51378993
u_str ESTAB      0      0                                                                                       * 163017378                     * 163017379
u_str ESTAB      0      0                                                                                       * 105323728                     * 105323729
u_dgr ESTAB      0      0                                                                                       * 16794                         * 16795
u_str ESTAB      0      0                                                                                       * 502207581                     * 502189514
u_str ESTAB      0      0                                                                                       * 24687                         * 20599
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 61700                         * 61004
u_str ESTAB      0      0                                                             /run/dbus/system_bus_socket 24708                         * 16875
u_str ESTAB      0      0                                                                                       * 172931559                     * 172931558
u_str ESTAB      0      0                                                                                       * 18385                         * 18386
u_str ESTAB      0      0                                                                                       * 502207587                     * 502207588
u_str ESTAB      0      0                                                                                       * 2175982                       * 2175981
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 15947                         * 24716
u_dgr ESTAB      0      0                                                                     /run/systemd/notify 16793                         * 0
u_str ESTAB      0      0                                                                                       * 211929261                     * 211929262
u_str ESTAB      0      0                                                                                       * 505966166                     * 505963075
u_str ESTAB      0      0                                      /home/lkraven/.claude/remote/run/b927d560/rpc.sock 520261514                     * 520270573
u_str ESTAB      0      0                                                                                       * 177602210                     * 177602211
u_str ESTAB      0      0                                                                                       * 160777160                     * 160777161
u_str ESTAB      0      0                                                                                       * 211929262                     * 211929261
u_dgr ESTAB      0      0                                                                                       * 4041742                       * 25662
u_str ESTAB      0      0                                                                                       * 503653921                     * 503666646
u_str ESTAB      0      0                                                                                       * 4041752                       * 4041751
u_str ESTAB      0      0                                                         /run/containerd/containerd.sock 503204798                     * 503100306
u_str ESTAB      0      0                                                                                       * 51378991                      * 51378990
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 18991473                      * 18990478
u_str ESTAB      0      0                                                                                       * 2175983                       * 2175984
u_str ESTAB      0      0                                                                                       * 364734152                     * 364734151
u_str ESTAB      0      0                                                                                       * 172931545                     * 172931544
u_str ESTAB      0      0                                                                                       * 160801990                     * 160801991
u_dgr ESTAB      0      0                                                                                       * 16866                         * 16865
u_dgr ESTAB      0      0                                                            /run/systemd/journal/dev-log 25662                         * 0
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 503222380                     * 503210386
u_str ESTAB      0      0                                                                                       * 2175981                       * 2175982
u_dgr ESTAB      0      0                                                             /run/systemd/journal/socket 25664                         * 0
u_str ESTAB      0      0                                                                                       * 187891158                     * 187891157
u_str ESTAB      0      0                                                                                       * 105323725                     * 105323724
u_str ESTAB      0      0                                                                                       * 271499970                     * 271499971
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 20599                         * 24687
u_dgr ESTAB      0      0                                                                                       * 16865                         * 16866
u_str ESTAB      0      0                                                                                       * 520517939                     * 520517938
u_str ESTAB      0      0                                                                                       * 287354064                     * 287354065
u_str ESTAB      0      0                                                                                       * 105475369                     * 105475368
u_str ESTAB      0      0                                                                      /run/user/1000/bus 283951                        * 286837
u_dgr ESTAB      0      0                                                                                       * 20620                         * 25664
u_str ESTAB      0      0                                                                                       * 187891159                     * 187891160
u_dgr ESTAB      0      0                                                                                       * 16795                         * 16794
u_str ESTAB      0      0                                                                                       * 211826467                     * 211826466
u_str ESTAB      0      0                                                                                       * 158808                        * 158807
u_str ESTAB      0      0                                                                                       * 24716                         * 15947
u_str ESTAB      0      0                                                                        /run/docker.sock 505963075                     * 505966166
u_str ESTAB      0      0                                                                                       * 177602211                     * 177602210
u_str ESTAB      0      0                                                                                       * 160777158                     * 160777159
u_str ESTAB      0      0                                                                                       * 37642872                      * 37642873
u_str ESTAB      0      0                                                                                       * 502207588                     * 502207587
u_str ESTAB      0      0                                                                                       * 286837                        * 283951
u_str ESTAB      0      0                                                                                       * 14492                         * 14493
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 20601                         * 24696
u_str ESTAB      0      0                                                                                       * 160801992                     * 160801993
u_str ESTAB      0      0                                                                                       * 409730867                     * 409730866
u_str ESTAB      0      0                                                                                       * 520517938                     * 520517939
u_str ESTAB      0      0                                                                                       * 287354063                     * 287354062
u_str ESTAB      0      0                                                                                       * 271499971                     * 271499970
u_str ESTAB      0      0                                                                                       * 2175984                       * 2175983
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 19536                         * 24671
u_dgr ESTAB      0      0                                                                                       * 57047973                      * 16793
u_str ESTAB      0      0                                                                                       * 45403901                      * 45403900
u_str ESTAB      0      0                                                                                       * 37642869                      * 37642868
u_str ESTAB      0      0                                                                                       * 158807                        * 158808
u_str ESTAB      0      0                                                                                       * 61004                         * 61700
u_str ESTAB      0      0      /run/containerd/s/642d2e2cfa9c2dce9b0a7f5d1300cbf425c4ebf5c4725e1fe426333f34172e6f 503666646                     * 503653921
u_str ESTAB      0      0                                                                                       * 503225110                     * 503187424
u_str ESTAB      0      0                                                                                       * 3164605                       * 3164606
u_str ESTAB      0      0                                                                                       * 535492350                     * 535492351
u_str ESTAB      0      0                                                                                       * 527114554                     * 527114553
u_str ESTAB      0      0                                                                                       * 287354067                     * 287354066
u_str ESTAB      0      0                                                                                       * 51378989                      * 51378988
u_str ESTAB      0      0                                                                                       * 265067896                     * 265067895
u_str ESTAB      0      0                                                                                       * 172931546                     * 172931547
u_str ESTAB      0      0                                                                                       * 163017379                     * 163017378
u_str ESTAB      0      0                                                                                       * 187891157                     * 187891158
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 19407                         * 28400
u_str ESTAB      0      0                                                                                       * 535601698                     * 535601697
u_str ESTAB      0      0                                                                                       * 531452134                     * 531452135
u_str ESTAB      0      0                                                                                       * 503100306                     * 503204798
u_str ESTAB      0      0                                                                                       * 503210386                     * 503222380
u_str ESTAB      0      0                                                                                       * 4332745                       * 4332746
u_str ESTAB      0      0                                                                                       * 364734151                     * 364734152
u_str ESTAB      0      0                                                                                       * 172931556                     * 172931557
u_str ESTAB      0      0                                                                                       * 3167753                       * 3167752
u_str ESTAB      0      0                                                                                       * 16931                         * 15948
u_dgr ESTAB      0      0                                                                                       * 153774                        * 25662
u_str ESTAB      0      0                                                                                       * 105323729                     * 105323728
u_str ESTAB      0      0                                                                                       * 535601697                     * 535601698
u_str ESTAB      0      0                                                   /run/containerd/containerd.sock.ttrpc 505963077                     * 505982055
u_str ESTAB      0      0                                                                                       * 172931547                     * 172931546
u_str ESTAB      0      0                                                                                       * 105323727                     * 105323726
u_dgr ESTAB      0      0                                                                                       * 16864                         * 16863
u_str ESTAB      0      0                                                                                       * 468781321                     * 0
u_str ESTAB      0      0                                                                                       * 321228120                     * 321223400
u_str ESTAB      0      0                                                                                       * 105475366                     * 105475367
u_str ESTAB      0      0                                                                                       * 535633202                     * 535633201
u_dgr ESTAB      0      0                                                                                       * 30815                         * 25662
u_str ESTAB      0      0                                                                                       * 265067895                     * 265067896
u_str ESTAB      0      0                                                                                       * 177602213                     * 177602212
u_str ESTAB      0      0                                                                                       * 187891156                     * 187891155
u_dgr ESTAB      0      0                                                                                       * 16859                         * 25664
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 15946                         * 20836
u_str ESTAB      0      0                                                                                       * 172931560                     * 172931561
u_str ESTAB      0      0                                                                                       * 321804884                     * 321804885
u_str ESTAB      0      0                                                                                       * 287354065                     * 287354064
u_str ESTAB      0      0                                                             /run/dbus/system_bus_socket 25881                         * 20631
u_str ESTAB      0      0                                                                                       * 51378993                      * 51378992
u_str ESTAB      0      0                                                             /run/dbus/system_bus_socket 280975                        * 286838
u_str ESTAB      0      0                                                                                       * 37642871                      * 37642870
u_str ESTAB      0      0                                                                                       * 531452135                     * 531452134
u_str ESTAB      0      0                                                                                       * 287354066                     * 287354067
u_str ESTAB      0      0                                                                                       * 211826466                     * 211826467
u_str ESTAB      0      0                                                         /run/containerd/containerd.sock 503205589                     * 503210394
u_str ESTAB      0      0                                                                                       * 409730866                     * 409730867
u_str ESTAB      0      0                                                                                       * 105323724                     * 105323725
u_str ESTAB      0      0                                                                                       * 271557694                     * 271511134
u_str ESTAB      0      0                                                                                       * 69011788                      * 69011789
u_str ESTAB      0      0                                                                                       * 286838                        * 280975
u_str ESTAB      0      0                                                                                       * 24706                         * 24705
u_str ESTAB      0      0                                                                                       * 535633201                     * 535633202
u_str ESTAB      0      0                                                                                       * 37642873                      * 37642872
u_str ESTAB      0      0                                                                                       * 105475371                     * 105475370
u_str ESTAB      0      0                                                                                       * 105315055                     * 105315056
u_str ESTAB      0      0                                                                                       * 177602212                     * 177602213
u_str ESTAB      0      0                                                                                       * 160777159                     * 160777158
u_str ESTAB      0      0                                                                                       * 3164606                       * 3164605
u_str ESTAB      0      0                                                                                       * 15925                         * 13386
u_str ESTAB      0      0                                                                                       * 187899267                     * 187899268
u_str ESTAB      0      0                                                                                       * 4489879                       * 4489880
u_str ESTAB      0      0                                                                                       * 321803916                     * 321803915
u_str ESTAB      0      0                                                                                       * 52452825                      * 52452826
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 28383                         * 21596
u_str ESTAB      0      0                                                                                       * 531437601                     * 531437600
u_str ESTAB      0      0                                                                                       * 19420                         * 19421
u_str ESTAB      0      0                                                                                       * 503672006                     * 503563060
u_str ESTAB      0      0                                                                                       * 51388674                      * 51388673
u_str ESTAB      0      0                                                                                       * 25878                         * 24711
u_str ESTAB      0      0                                                                                       * 147394                        * 154728
u_str ESTAB      0      0                                                                                       * 187899271                     * 187899272
u_str ESTAB      0      0                                                                                       * 321803915                     * 321803916
u_str ESTAB      0      0                                                                                       * 249986684                     * 249986685
u_str ESTAB      0      0                                                                                       * 3804253                       * 3804252
u_str ESTAB      0      0                                                                                       * 24408                         * 24709
u_str ESTAB      0      0                                                                                       * 248406427                     * 248406426
u_str ESTAB      0      0                                                                                       * 527128577                     * 527128578
u_str ESTAB      0      0                                                                                       * 318961033                     * 318961034
u_str ESTAB      0      0                                                                                       * 265080194                     * 265080193
u_str ESTAB      0      0                                                                                       * 111082006                     * 111088943
u_str ESTAB      0      0                                                                                       * 19234766                      * 19234767
u_str ESTAB      0      0                                                                                       * 192528046                     * 192528045
u_dgr ESTAB      0      0                                                                                       * 149063                        * 25662
u_str ESTAB      0      0                                                                                       * 520269438                     * 520269437
u_str ESTAB      0      0                                                                                       * 265080189                     * 265080190
u_str ESTAB      0      0                                                                                       * 53881124                      * 53881123
u_dgr ESTAB      0      0                                                                                       * 27429404                      * 16793
u_str ESTAB      0      0                                                                                       * 535470104                     * 535470103
u_str ESTAB      0      0                                                                                       * 192528047                     * 192528048
u_str ESTAB      0      0                                                                                       * 535621794                     * 535621795
u_str ESTAB      0      0                                                                                       * 468766309                     * 468766308
u_str ESTAB      0      0                                                                                       * 265080192                     * 265080191
u_str ESTAB      0      0                                                                                       * 45411693                      * 45411692
u_str ESTAB      0      0                                                                                       * 16086                         * 16087
u_dgr ESTAB      0      0                                                                                       * 321773330                     * 25662
u_str ESTAB      0      0                                                                                       * 531438660                     * 531438661
u_str ESTAB      0      0                                                                                       * 249986680                     * 249986681
u_str ESTAB      0      0                                                                                       * 22636499                      * 22636498
u_str ESTAB      0      0                                                                                       * 535470103                     * 535470104
u_str ESTAB      0      0                                                                                       * 187772975                     * 187772974
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 27035                         * 21527
u_str ESTAB      0      0                                                                                       * 265080193                     * 265080194
u_dgr ESTAB      0      0                                                                                       * 15922                         * 15921
u_str ESTAB      0      0                                                                                       * 10561346                      * 0
u_dgr ESTAB      0      0                                                                                       * 21541                         * 21540
u_str ESTAB      0      0                                                                                       * 187899269                     * 187899270
u_str ESTAB      0      0                                                                                       * 4499989                       * 0
u_str ESTAB      0      0                                                                                       * 248406429                     * 248406428
u_str ESTAB      0      0                                                                                       * 19250299                      * 19250298
u_str ESTAB      0      0                                                                                       * 172954250                     * 172954249
u_str ESTAB      0      0                                                                                       * 37647005                      * 37647006
u_dgr ESTAB      0      0                                                                                       * 15898                         * 25662
u_str ESTAB      0      0                                                                                       * 192528048                     * 192528047
u_str ESTAB      0      0                                                                                       * 25874                         * 25873
u_str ESTAB      0      0                                                                                       * 535590167                     * 535590166
u_str ESTAB      0      0                                                                                       * 249986681                     * 249986680
u_str ESTAB      0      0                                                                                       * 53881123                      * 53881124
u_str ESTAB      0      0                                                                                       * 22636500                      * 22636501
u_str ESTAB      0      0                                                                                       * 19421                         * 19420
u_str ESTAB      0      0                                                                                       * 318989927                     * 318989926
u_str ESTAB      0      0                                                                                       * 192528045                     * 192528046
u_str ESTAB      0      0                                                                                       * 149062                        * 148051
u_str ESTAB      0      0                                                                                       * 527128578                     * 527128577
u_str ESTAB      0      0                                                                                       * 527122038                     * 0
u_str ESTAB      0      0                                                                                       * 341919445                     * 341919444
u_str ESTAB      0      0                                                                                       * 265080190                     * 265080189
u_str ESTAB      0      0                                                                                       * 246588366                     * 246588367
u_str ESTAB      0      0                                         /run/user/1000/zellij/contract_version_1/Claude 527128606                     * 527139333
u_str ESTAB      0      0                                                                                       * 750542                        * 750541
u_str ESTAB      0      0                                                                                       * 57054442                      * 57048863
u_str ESTAB      0      0                                                                                       * 52453681                      * 52453682
u_str ESTAB      0      0                                                                                       * 22636496                      * 22636497
u_str ESTAB      0      0                                                                                       * 150082                        * 158811
u_str ESTAB      0      0                                                                                       * 187899268                     * 187899267
u_str ESTAB      0      0                                                             /run/dbus/system_bus_socket 13386                         * 15925
u_str ESTAB      0      0                                                                                       * 52452830                      * 52452829
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 24406                         * 18609
u_str ESTAB      0      0                                                                                       * 52453682                      * 52453681
u_str ESTAB      0      0                                                                                       * 45411694                      * 45411695
u_str ESTAB      0      0                                                                                       * 187772976                     * 187772977
u_str ESTAB      0      0                                                                                       * 531419342                     * 531419341
u_str ESTAB      0      0                                                                                       * 341919444                     * 341919445
u_str ESTAB      0      0                                                                                       * 249986682                     * 249986683
u_str ESTAB      0      0                                                                                       * 321770450                     * 321770451
u_str ESTAB      0      0                                                                                       * 187899270                     * 187899269
u_str ESTAB      0      0                                                                                       * 4489882                       * 4489881
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 111088943                     * 111082006
u_str ESTAB      0      0                                                                                       * 19250298                      * 19250299
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 20604                         * 18626
u_str ESTAB      0      0                                                                                       * 19234767                      * 19234766
u_str ESTAB      0      0                                                                                       * 21596                         * 28383
u_dgr ESTAB      0      0                                                                                       * 468766299                     * 25662
u_str ESTAB      0      0                                                                                       * 52452828                      * 52452827
u_str ESTAB      0      0                                                                                       * 16087                         * 16086
u_str ESTAB      0      0                                                                                       * 750540                        * 750539
u_str ESTAB      0      0                                                                                       * 52452826                      * 52452825
u_str ESTAB      0      0                                                                                       * 535590166                     * 535590167
u_str ESTAB      0      0                                                                                       * 468766308                     * 468766309
u_str ESTAB      0      0                                                                                       * 265080191                     * 265080192
u_str ESTAB      0      0                                                             /run/dbus/system_bus_socket 148051                        * 149062
u_str ESTAB      0      0                                                                                       * 527139333                     * 527128606
u_str ESTAB      0      0                                                                                       * 187772979                     * 187772978
u_str ESTAB      0      0                                                                                       * 22636497                      * 22636496
u_str ESTAB      0      0                                                                                       * 18626                         * 20604
u_str ESTAB      0      0                                                                                       * 15887                         * 16905
u_str ESTAB      0      0                                                                                       * 4489878                       * 4489877
u_str ESTAB      0      0                                                                                       * 282025                        * 282026
u_str ESTAB      0      0                                                                                       * 246588367                     * 246588366
u_str ESTAB      0      0                                                                                       * 18609                         * 24406
u_str ESTAB      0      0                                                                                       * 318989926                     * 318989927
u_str ESTAB      0      0                                                                                       * 750541                        * 750542
u_str ESTAB      0      0                                                                      /run/user/1000/bus 158811                        * 150082
u_str ESTAB      0      0                                                                                       * 25873                         * 25874
u_str ESTAB      0      0                                                                                       * 248406431                     * 248406430
u_str ESTAB      0      0                                                                                       * 531438661                     * 531438660
u_str ESTAB      0      0                                                                                       * 520269437                     * 520269438
u_str ESTAB      0      0                                                                                       * 53881122                      * 53881121
u_str ESTAB      0      0                                                                                       * 45411692                      * 45411693
u_str ESTAB      0      0                                                                                       * 750537                        * 750538
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 16905                         * 15887
u_str ESTAB      0      0                                                                                       * 319149630                     * 319149631
u_str ESTAB      0      0                                                                                       * 187765377                     * 187765378
u_str ESTAB      0      0                                                                                       * 282032                        * 282033
u_str ESTAB      0      0                                                                                       * 22636498                      * 22636499
u_str ESTAB      0      0                                                                                       * 187899272                     * 187899271
u_str ESTAB      0      0                                                                                       * 4489877                       * 4489878
u_str ESTAB      0      0                                                             /run/dbus/system_bus_socket 24709                         * 24408
u_str ESTAB      0      0                                                                                       * 52452827                      * 52452828
u_str ESTAB      0      0                                                                                       * 282026                        * 282025
u_str ESTAB      0      0                                                                                       * 249986683                     * 249986682
u_str ESTAB      0      0                                                                                       * 22636501                      * 22636500
u_str ESTAB      0      0                                                                                       * 21527                         * 27035
u_dgr ESTAB      0      0                                                                                       * 520269428                     * 25662
u_dgr ESTAB      0      0                                                                                       * 21540                         * 21541
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 497070283                     * 497065485
u_str ESTAB      0      0                                                                                       * 192528044                     * 192528043
u_str ESTAB      0      0                                                                                       * 4489881                       * 4489882
u_str ESTAB      0      0                                                                                       * 531419341                     * 531419342
u_str ESTAB      0      0                                                                                       * 37647006                      * 37647005
u_str ESTAB      0      0                                                                                       * 45411696                      * 45411697
u_str ESTAB      0      0                                                                                       * 187772978                     * 187772979
u_str ESTAB      0      0                                                                                       * 57050542                      * 57045722
u_str ESTAB      0      0                                                                                       * 4510855                       * 4510854
u_str ESTAB      0      0                                                             /run/dbus/system_bus_socket 57048863                      * 57054442
u_str ESTAB      0      0                                                                                       * 53881121                      * 53881122
u_dgr ESTAB      0      0                                                                                       * 527122050                     * 25662
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 57045722                      * 57050542
u_str ESTAB      0      0                                                                                       * 750539                        * 750540
u_str ESTAB      0      0                                                                                       * 282033                        * 282032
u_dgr ESTAB      0      0                                                                                       * 15921                         * 15922
u_str ESTAB      0      0                                                                                       * 321770451                     * 321770450
u_str ESTAB      0      0                                                                                       * 192528043                     * 192528044
u_str ESTAB      0      0                                                                                       * 53881120                      * 53881119
u_str ESTAB      0      0                                                                                       * 187772974                     * 187772975
u_str ESTAB      0      0                                                                                       * 503669018                     * 503673885
u_str ESTAB      0      0                                                                                       * 318961034                     * 318961033
u_str ESTAB      0      0                                                                                       * 53881119                      * 53881120
u_str ESTAB      0      0                                                                                       * 187772977                     * 187772976
u_str ESTAB      0      0                                                                                       * 4510854                       * 4510855
u_str ESTAB      0      0                                                                                       * 52452829                      * 52452830
u_str ESTAB      0      0                                                                                       * 535621795                     * 535621794
u_dgr ESTAB      0      0                                                                                       * 15908                         * 25664
u_str ESTAB      0      0                                                                                       * 4489880                       * 4489879
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 154728                        * 147394
u_str ESTAB      0      0                                                                                       * 249986685                     * 249986684
u_str ESTAB      0      0                                                                        /run/docker.sock 503563060                     * 503672006
u_str ESTAB      0      0                                                                                       * 319149631                     * 319149630
u_str ESTAB      0      0                                                                                       * 248406426                     * 248406427
u_str ESTAB      0      0                                                                                       * 531437600                     * 531437601
u_str ESTAB      0      0                                                                                       * 142624625                     * 142626682
u_str ESTAB      0      0                                                                                       * 51388673                      * 51388674
u_str ESTAB      0      0                                                                                       * 45411697                      * 45411696
u_str ESTAB      0      0                                                                                       * 248406430                     * 248406431
u_str ESTAB      0      0                                                             /run/systemd/journal/stdout 142626682                     * 142624625
u_str ESTAB      0      0                                                   /run/containerd/containerd.sock.ttrpc 503673885                     * 503669018
u_str ESTAB      0      0                                                                                       * 3804252                       * 3804253
u_str ESTAB      0      0                                                                                       * 497065485                     * 497070283
u_str ESTAB      0      0                                                                                       * 45411695                      * 45411694
u_str ESTAB      0      0                                                             /run/dbus/system_bus_socket 24711                         * 25878
u_dgr ESTAB      0      0                                                                                       * 21536                         * 25664
u_str ESTAB      0      0                                                                                       * 321773321                     * 0
u_str ESTAB      0      0                                                                                       * 750538                        * 750537
u_str ESTAB      0      0                                                                                       * 248406428                     * 248406429
u_str ESTAB      0      0                                                                                       * 187765378                     * 187765377
u_str ESTAB      0      0                                                                                       * 4036771                       * 0
u_str ESTAB      0      0                                                                                       * 172954249                     * 172954250
tcp   ESTAB      0      0                                                                            10.100.10.50:8770                 10.0.10.10:61497
tcp   ESTAB      0      0                                                                            10.100.10.50:40898             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:38636             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:48192              104.18.32.47:https
tcp   ESTAB      0      0                                                                            10.100.10.50:40490              104.18.32.47:https
tcp   ESTAB      0      0                                                                            10.100.10.50:844                10.100.50.50:nfs
tcp   ESTAB      0      0                                                                            10.100.10.50:34046             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:52620              10.100.50.40:8390
tcp   ESTAB      0      0                                                                            10.100.10.50:51638             70.230.226.88:https
tcp   ESTAB      0      0                                                                            10.100.10.50:ssh                  10.0.10.10:60190
tcp   ESTAB      0      0                                                                            10.100.10.50:44198           199.165.136.101:https
tcp   ESTAB      0      0                                                                            10.100.10.50:34048             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:52664               10.6.110.50:ssh
tcp   ESTAB      0      0                                                                            10.100.10.50:36054             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:47758              104.18.32.47:https
tcp   ESTAB      0      0                                                                            10.100.10.50:56154               10.0.10.235:ssh
tcp   ESTAB      0      0                                                                            10.100.10.50:48002             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:48206             34.149.66.165:https
tcp   ESTAB      0      0                                                                            10.100.10.50:33262             104.18.28.234:https
tcp   ESTAB      0      0                                                                            10.100.10.50:ssh                 10.100.79.2:62737
tcp   CLOSE-WAIT 1      0                                                                            10.100.10.50:56568              10.250.50.70:4000
tcp   ESTAB      0      0                                                                            10.100.10.50:38016             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:44484             208.111.40.12:https
tcp   ESTAB      0      0                                                                            10.100.10.50:52610             34.149.66.165:https
tcp   ESTAB      0      0                                                                            10.100.10.50:ssh               10.100.10.194:51093
tcp   ESTAB      0      0                                                                            10.100.10.50:58500             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:57430             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:ssh                 38.120.94.3:59226
tcp   ESTAB      0      0                                                                            10.100.10.50:51558             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:57184             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:39920             160.79.104.10:https
tcp   ESTAB      0      0                                                                            10.100.10.50:44666             34.149.66.165:https
tcp   ESTAB      0      0                                                                            10.100.10.50:ssh                  10.0.10.83:49689
tcp   ESTAB      0      0                                                                            10.100.10.50:54550              38.120.12.44:https
tcp   ESTAB      0      0                                                                            10.100.10.50:39908             160.79.104.10:https
tcp   CLOSE-WAIT 1      0                                                                            10.100.10.50:42224             10.250.50.152:http-alt
tcp   ESTAB      0      0                                                                            10.100.10.50:ssh                  10.0.10.10:60814
tcp   ESTAB      0      0                                                                   [::ffff:10.100.10.50]:45876     [::ffff:10.250.50.70]:49346            shows only 6052. That
conclusion holds — but the log evidence originally cited for it was worthless
and happened to agree.

What is actually still advertised is helpers.dashboard_advertise announcing
_esphomebuilder._tcp.local. at 6052, the auth-gated dashboard, independent of
remote-build. It leaks existence, address, dashboard id, Device Builder and
ESPHome versions and hostname: LAN version fingerprinting, not reachability
into the build subsystem. Left alone deliberately; both the compose comment
and the README now say so, including that an earlier revision claimed
otherwise.
2026-09-14 19:09:27 -07:00
vh 687c6999f3 fix(esphome): actually disable remote-build — two switches, only one closes the port
ha-dev found the WS API and tested the read half; this runs the write. But the
command they identified is the wrong half, which is worth recording because the
naming actively misleads.

  remote_build/set_offloader_settings {remote_builds_enabled: false}
      the OUTBOUND half — this dashboard sending builds to peers.
      Persists, reads back false, and leaves the receiver listening.

  remote_build/set_settings {enabled: false}
      the receiver-side master switch, per ReceiverController.set_settings's
      own docstring. Tears the listener down live, no restart needed.

Set both. Verified across a restart: 6055 absent, zero peer-link bind lines,
zero mDNS advertisements, both switches read back false. Persisted at
_remote_build.enabled in /config/.device-builder.json — which did not exist
until the flag was first changed, so 'no on-disk representation' was true only
of the default state.

ESPHOME_REMOTE_BUILD_HOST=127.0.0.1 is KEPT as a backstop rather than removed.
The off state now lives in one JSON file whose in-code default is enabled:True
(controllers/remote_build/_state.py) and whose module's stores soft-recover to
an empty model on a malformed blob rather than erroring — so a lost or corrupt
settings file silently re-enables remote-build. With the env var set, that
regression binds loopback instead of 0.0.0.0.

Also finishes deploy-stack.sh properly. This was patched three times in one
session because -a is -rlptgoD and a non-root identity cannot apply owner,
group, permissions OR times to a root-owned directory; each patch fixed one
letter and the next deploy failed on the next one, every time exiting 23 AFTER
a successful transfer. The rule is now written into the script: the deploy
syncs content, the conventions own metadata. --no-o --no-g --no-perms
--omit-dir-times. Verified: clean run, destination keeps 2775 root:docker with
setgid intact.
2026-09-14 19:05:11 -07:00
vh 8073a6aed9 fix(esphome): bind the remote-build peer-link to loopback; finish the rsync fix
ha-dev asked for the Device Builder 1.0.0 remote-build receiver to be turned
off: one instance, builds run locally, so the feature has no role, and it was
binding 0.0.0.0:6055 with mDNS advertisement on a privileged host-network
container that writes firmware to devices.

Reading the source first changed the framing. controllers/remote_build/
_state.py declares 'remote_builds_enabled: bool = True', so nobody enabled it
— it arrived on by default with the rewrite. And the flag has no on-disk
representation until it is changed: neither .device-builder.json nor
.device-builder-preferences.json carries it, and the only writer is the app's
own command API behind the UI. Setting it from a playbook would mean inventing
a schema for a model I have not read.

So this binds ESPHOME_REMOTE_BUILD_HOST=127.0.0.1 — a documented env var, no
entrypoint override — which removes the LAN reachability now and is verifiable
(ss reports 127.0.0.1:6055, was 0.0.0.0:6055). It is explicitly NOT the off
switch ha-dev asked for and the compose comment says so; the Settings toggle
is one UI click and the line can go once someone flips it.

Also completes yesterday's deploy-stack.sh fix, which was half a fix. --no-o
--no-g stopped rsync chgrp-ing a root:docker destination as a non-root
identity, but the very next deploy failed the same way one layer along —
'failed to set times on ...' — because a non-root identity cannot utime() a
root-owned directory either. Same exit 23 after a successful transfer. Added
--omit-dir-times. Fixing only the group half looked fixed until the next run,
which is the whole reason this is worth a line in the script's comment.
2026-09-14 18:55:54 -07:00
vh d1769ed114 feat(esphome): pin 2026.8.2, relocate config into backup coverage, rotate creds
ha-dev requested all three on esh-docker-vm (operator-authorized); the stack
had no canonical copy, so it is added to stacks/ rather than edited in place.

Pinned ghcr.io/esphome/esphome:2026.8.2 — it was bare, which is exactly how it
sat on 2025.8.2 for a year: docker pulled latest once at container creation
(2026-04-20, from a layer cached 2025-08-29) and never re-pulled. Every current
Everything Presence sensor failed config validation on that build. Verified
after: esphome version reports 2026.8.2 and the vendor's own Pro package now
validates clean (exit 0, 'Configuration is valid!'), which is the item that
unblocks the six waiting sensors.

Relocated /path/to/esphome/config (the upstream template placeholder, taken
literally by docker) to /opt/docker/conf/esphome, matching the mosquitto
pattern. Copied and checksum-verified all 5763 files before removing the
original, with a tarball kept at /root/pre-change-archive/.

Credentials moved off test/ChangeMe to the vaulted 32-char secret
(esh-docker-vm/esphome-dashboard), passed via a host-only .env so nothing
plaintext enters git.

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

  The directory is 538 MB, not the 3 KB reported — .esphome/platformio is
  508 MB of PlatformIO toolchain and .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, so both subtrees are excluded in
  /etc/restic/profiles.yaml. The 3 KB of actual config is now covered, which
  was the point.

  2026.8.2 logs a DEPRECATION for the bare USERNAME/PASSWORD env names and says
  they will stop working in a future release — a silent auth loss on some later
  bump, on a privileged host-network container that can flash any ESP device on
  the LAN. Switched to ESPHOME_USERNAME/ESPHOME_PASSWORD; the warning is gone.

  Device Builder 1.0.0 opens a NEW listener on 0.0.0.0:6055 (remote-build
  peer-link) that 2025.8.2 did not have.

Also fixes deploy-stack.sh: plain 'rsync -a' makes rsync chgrp the destination
as the deploy identity, which since the 2026-09-14 root:docker normalisation is
not root. It failed with 'Operation not permitted' and exit 23 AFTER
transferring content — a loud error on a deploy that had succeeded. --no-o
--no-g lets the setgid bit assign the group instead.
2026-09-14 18:47:54 -07:00
vh 05f3d3b2a3 feat(fv-ml1): add gen-small A3B seat; sec/gen/char to native 262K; coder reclaim; gateway
Full seat rebalance across GPU0/GPU1 (flash on GPU2 and empty GPU3 untouched),
operator-directed. Every target seat now serves native 262,144 context with
concurrency in the requested 1.2-2.5x band, verified from live boot logs:

  cyberprev (sec)   262144 @ 1.37x   depth-probed CLEAN to 259,722 tokens
  flash-next (gen)  262144 @ 1.31x   (untouched, already in band)
  gen-small (NEW)   262144 @ 2.56x   MTP k=3 measured 69.6% accept / 3.09 len
  char-rp           262144 @ 1.22x   (was 1.02x; util 0.40->0.52)
  char-rp-fast      262144 @ 2.04x   (util cap 0.30->0.24, pinned KV unchanged)

- gen-small: NEW seat, Qwen3.6-35B-A3B (3B active MoE), llmfan46 Heretic
  (MPOA) NVFP4 experts-only, already on disk at qwen36-35b-a3b-heretic-nvfp4.
  There is no general Qwen3.8 A3B (3.8 MoEs are Flash-Next and the 2.4T), so
  this is the 3.6 fallback the operator specified. GPU0, :8026, MTP k=3, coherent
  and MTP-verified before wiring. gen-small / gen-small-reasoning gateway aliases.

- coder: 8192 @ 13.75x -> 16384 @ 4.70x (util 0.06->0.055). Context doubled,
  waste cut. Not the exact 2-3x target: the 1.5B weight+overhead floor (~4.2 GiB)
  sits just under the util knob's resolution, so hitting <=3x reliably needs a
  --kv-cache-memory byte pin (compose change) rather than the util fraction.

- cyberprev raised 163840 -> 262144: depth-probed with non-repeating prompts to
  259,722 tokens, clean (no OOM, memory flat). Unlike mog-sec (same base arch,
  capped at 163840 for depth crashes), this checkpoint holds native depth.

- Gateway (operator calls): summarizer + classifier -> gen-small; new
  classifier-large -> gen-large (flash) for the accuracy tier; summarizer-large
  stays on flash. All verified end-to-end.

- GPU1 hit its ceiling raising char-rp; resolved by trimming char-rp-fast's
  reservation cap (its KV is pinned, so concurrency held at 2.04x) rather than
  moving a utility seat -- the shared GPU_ID on reward/embed/rerank made a
  single-seat move messier than the in-GPU rebalance.

Seat inventory regenerated from the live containers.
2026-09-14 10:25:10 -07:00
vh 207798de66 feat(litellm): promote cyberprev into the sec / sec-reasoning seats; retire mog-sec
Operator instruction: take down the existing sec seat (mog-sec) and promote
hotdogs (cyberprev) into the sec and sec-reasoning gateway seats.

- mog-sec container (vllm-mog-sec, :8019, fv-ml1 GPU0) taken down; ~48 GB freed
  on GPU0 (cyberprev, already co-resident there, is now the sole GPU0 chat seat).
- Gateway sec -> hosted_vllm/cyberprev-27b @ :8025; sec-reasoning ->
  hosted_vllm/cyberprev-27b-thinking @ :8025. sec/sec-reasoning are ROLE aliases,
  so this is a promotion, not silent substitution (samplers were already identical
  between the sec blocks and cyberprev, so only model+api_base changed).
- Removed the standalone cyberprev-27b / cyberprev-reasoning gateway aliases added
  in the prior commit -- now redundant with sec/sec-reasoning, and the fleet
  convention is a role alias on the gateway with the model's served-name only at
  the vLLM layer (as mog-sec had). cyberprev's vLLM served-names are unchanged.
- Verified e2e through the gateway: sec answers (nmap -sV version detection),
  sec-reasoning answers with a thinking split (127 reasoning tokens); retired
  mog-sec-27b now 400s.

Note: mog-sec was the fleet's only offense+defense/blue-team seat; the sec role
is now offense-only (cyberprev tool-calling). Operator-directed after reviewing
the capability comparison. mog-sec stack files retained for a future restore.
2026-09-14 07:49:40 -07:00
vh 3906c6842c docs: correct sec-seat lineage — M.O.G.-SEC/mog-sec is an offense+defense SFT finetune, not a persona-on-stock
The sentinel-r3 header and two memory notes described mog-sec (Blackfrost
M.O.G.-SEC / Qwentium) as 'a persona system prompt on stock weights'. Its card
is explicit that it is NOT: base_model_relation: finetune on Qwen/Qwen3.8-27B,
a refusal-free offense+defense cybersecurity SFT with YaRN 1M context ('not a
system-prompt sticker on a stock Qwen'). So all three sec-seat candidates are
Qwen3.8-27B SFT finetunes and differ in training focus, not in kind:
mog-sec = broad offense+defense SFT; sentinel-r3 = pentest agent-trajectory SFT;
cyberprev = cyber tool-calling LoRA SFT on an abliterated base.
2026-09-14 07:31:23 -07:00
vh 196416f3da docs(cyberprev-seat): correct model lineage — it is a cyber SFT finetune, not an abliteration
Earlier commits and the compose header called cyberprev "an abliteration of
Qwen3.8-27B (refusal-direction weight edit, no finetune)". That was wrong. Per
the hotdogs model card (base_model_relation: finetune), cyberprev is an
offensive-security agentic tool-calling LoRA, merged at scale 1.0, trained on
hotdogs/cyber-sft-agent-qwen38 (8,400 rows across 22 pentest tools: nmap,
sqlmap, metasploit, hydra, crackmapexec, ...). The abliteration is INHERITED
from its base (hotdogs/Qwen3.8-27B-abliterated); the new capability in this
repo is the cyber SFT itself.

So the sec-seat lineage is: mog-sec = persona on stock weights; sentinel-r3 =
pentest-trajectory SFT on stock weights; cyberprev = cyber tool-calling SFT on
an abliterated base. All three are SFT-or-prompt variants; the earlier framing
of cyberprev as "not a finetune" was backwards.

Corrects the compose header lineage block, the homepage dashboard description,
and the gateway alias comment. No functional change; the running seat and its
weights are unchanged (label refreshes on next container recreate).
2026-09-14 07:28:26 -07:00
vh b94d173887 fix(cyberprev-seat): serve coherent v2 quant from name-repaired source; wire gateway
The first cyberprev quant served pure gibberish despite passing every structural
check. Root cause: the hotdogs/Qwen3.8-27B-abliterated-cyber-preview checkpoint
ships broken -- 850 of 1199 tensors (the whole transformer body) carry a TRIPLED
`language_model.` prefix, confirmed present in the upstream HF index (an unsloth
export bug, not our download). transformers silently loaded the unmapped tensors
as random-init, the pipeline quantized noise, and structural verification passed
because it inspects the output config, never that input names mapped. A plain
greedy coherence smoke caught it; nothing structural could.

Fix: rewrite tensor names against a known-good reference of the same architecture
(qwen38-27b-uncensored-bf16), verified the repaired name-set == reference name-set
exactly (1199 tensors, 0 collisions), and re-quantized from the corrected source
(cyberprev-bf16-fixed). v2 is coherence-verified (spec off AND live with dflash):
Paris/Berlin/Rome, correct arithmetic precedence, primes, clean cyber-domain chat
with a proper thinking split. dflash k=7 measured at 2.77 mean acceptance length.

Seat serves cyberprev-27b / cyberprev-27b-thinking on :8025/GPU0 with dflash k=7,
displacing the retired sentinel-r3. Gateway: removed the retired sentinel-r3 /
sentinel-r3-reasoning aliases and added cyberprev-27b / cyberprev-reasoning -- NOT
repointed, since serving cyberprev weights under sentinel's name is silent
substitution. Verified end-to-end through the gateway; sentinel-r3 now 400s.

Playbook gains a superseded-claims row: structural verification does not imply a
good quant; a coherence smoke is the load-bearing gate, and third-party sources
must have their tensor names diffed against a reference before quantizing.

Broken v1 quant dir removed.
2026-09-14 04:28:59 -07:00
vh 1418edb03e feat(cyberprev-seat): mixed-NVFP4 quant of the abliterated cyber-preview, displacing sentinel-r3
Third sec-seat candidate: hotdogs/Qwen3.8-27B-abliterated-cyber-preview, an
abliteration (refusal-direction weight edit) of Qwen3.8-27B aimed at the
cyber-offense refusal surface -- distinct from mog-sec (persona on stock
weights) and sentinel-r3 (SFT finetune). Operator instruction: quant it, take
sentinel down, serve it with mtp or dflash.

Quantized to the house mixed recipe via services/gen-seat-mixed-quant/ (NVFP4
W4A4 on MLP layers 0-55 + FP8 W8A8 on attn/linear_attn/lm_head/MLP 56-63, FP8
KV). The prior attempt (2026-09-11/14) died with "Cannot determine
num_attention_heads" because it ran from a bare .venv whose newer
compressed-tensors reads that field at top level; quant_mixed_nvfp4.py already
promotes text_config attention fields for exactly this reason, and the run
through the canonical vLLM-image + llmcompressor 0.13.0 / compressed-tensors
0.18.0 path (versions recorded from the container) completed clean.

post_quant.py did its job: grafted the 15 MTP tensors verbatim (BF16), and
re-injected re:^mtp.* into the ignore list after llm-compressor pruned it for
matching no module at quant time -- without which vLLM loads the grafted head
uninitialised and speculative decoding runs at 0% acceptance. It also caught a
missing preprocessor_config.json (absent from the abliterated source AND its
hotdogs upstream); restored from Qwen/Qwen3.8-27B, verified byte-identical to
the working sentinel-r3 build, so the vision tower preprocesses.

Verified from the tensors, not the config: NVFP4 covers MLP 0-55, FP8 covers
56-63, no overlap, 168 weight_packed tensors (56x3), 15 BF16 MTP, 333 BF16
vision. 51.0 GiB bf16 -> 21.0 GiB.

Served under its own name (cyberprev-27b / -thinking), NOT sentinel-r3 --
serving different weights under a retired name is silent substitution. Takes
over :8025 and GPU 0 (co-resident with mog-sec). dflash k=7 is the default,
carried from the sentinel measurement, but is re-measured against MTP on this
ABLITERATED body before cutover, since abliteration is exactly what can desync
an MTP head. Drafter (qwen38-27b-dflash2-drafter) shared with mog-sec.

Context capped at 163840 not native 262K, inherited from mog-sec's hard-won
depth lesson; raise only after a non-repeating deep-prefill probe on this
checkpoint.
2026-09-14 03:32:09 -07:00
vh 4954cf6756 test(flash-next-seat): depth-probe orca to 258K clean; record a blind instrument
Bisected context depth on the orcarouter checkpoint with non-repeating prompts
(unique random hex per probe, so prefix caching cannot short-circuit the
prefill). Six depths from 31,978 to 258,517 tokens, all served.

The load-bearing evidence is the engine allocator log: zero OOM, CUBLAS, or
illegal-memory entries across the run. That is the same detector that caught
the dealignai near-miss at 155K on the previous checkpoint, where it did fire.
The probe also ran under real concurrent operator load, making it a stricter
test than a solo run rather than a weaker one.

Positive control passed: a mis-sized first attempt produced a ~265K-token
prompt and got a clean 400 naming the limit instead of killing the engine, so
the probe could detect the failure mode it was looking for. Calibration for
re-runs: random hex words tokenize at 7.9 tokens/word here.

vLLM #54919 (long prefill starving decode for 3-7 minutes) did not reproduce:
258K prefilled in 28.9 s, roughly 8,900 tok/s, scaling near-linearly from 32K.

Records that the probe's memory-headroom half was BLIND and must not be reused.
It reported an identical 95,460 MiB used / 2,427 MiB free on every row across an
8x range of depths, which is the tell. Two causes: --kv-cache-memory pins the
pool and the engine logs "skipped memory profiling", so GPU usage is flat with
respect to depth; and the actual risk is a transient activation spike during
prefill, which before/after nvidia-smi bracketing structurally cannot observe.
Peak-activation headroom therefore remains unmeasured; the pass/fail result
rests on the allocator log alone.

Also qualifies the earlier 167.5 tok/s decode figure as a possibly-contended
lower bound, and records the operator's independent 140 tok/s average measured
in real use while this probe was loading the same card.
2026-09-14 03:02:55 -07:00
vh 1b5d6ba23a docs(flash-next-seat): dealignai weights deleted — record that no local rollback exists
Operator instruction: delete the displaced dealignai checkpoint. 125 GiB
reclaimed from /tank (59% -> 57% used). Verified before removing: not mounted
by any running or exited container, no symlinks, no inodes shared with the
converted orcarouter directory.

Every "rollback is two .env keys" statement across the stack README, the
.env.example, persistent-memory and its detail file was true when written and
is false now -- the .env backup still names paths that no longer exist.
Corrected in place rather than left as false reassurance, since a stale
rollback instruction is discovered precisely when it is needed.

Reverting this seat now costs a 126 GiB re-download. The quality A/B against
dealignai is likewise no longer runnable locally: its reference arm is gone.

The pristine 170 GiB orcarouter download is retained deliberately -- it is what
makes the PLE bf16->FP8 conversion reproducible without re-fetching -- and that
is now recorded so a future session does not reclaim it as an obvious duplicate.

Also notes that ~75 GiB of non-PLE shards are duplicated between the pristine
and converted orca directories (the convert's hardlinks hit EXDEV across two
container bind mounts); both now sit directly on /tank, so relinking would
reclaim it if /tank ever tightens.
2026-09-14 02:51:54 -07:00
vh 4390be947d feat(flash-next-seat): serve orcarouter weight-only NVFP4 on gen-large
Swaps gen-large from the dealignai ModelOpt W4A4 build to
orcarouter/Qwen3.8-Flash-Next-Uncensored-NVFP4, which is weight-only on both
axes (W8 float attn, W4 float experts, input_activations: null) and so avoids
the 4-bit-activation long-context degradation mode.

The checkpoint was previously recorded as unloadable on any mainline vLLM,
requiring a from-source PLE-loader patch. That conclusion was wrong on cost.
Qwen4ExpPLEEmbeddingMethod.from_quant_config checks ple_embedding_dtype as
branch 1, before any quant-config type check, and its NotImplementedError for
CompressedTensorsConfig is scoped to the PLE path only -- experts and dense
load through the ordinary compressed-tensors paths. Verified by instantiating
the real config and calling the selector both ways before doing any work.

orcarouter ships a bf16 PLE, so the fix was to make the declaration true:
convert the 51.2B-param table to FP8 and declare it. Its 128 PLE tensors sit
in one shard file with nothing else in it. Global amax 0.0894, per-shard
outlier ratio 1.66x, scale chosen exactly representable in bf16 so no
scale-rounding error stacks on quantization; amax maps to 446.17/448, no
clipping. Round-trip 2.655% RMS relative, 0.002% underflow, 0 saturation --
the same FP8-PLE treatment dealignai already shipped. MTP head (31 tensors)
and vision tower carried through untouched.

A second, independent blocker followed: orcarouter labels its 12 QSA layers
qwen_sparse_attention, which vLLM rejects; it accepts full_attention and
selects QSA via indexer_n_heads. Confirmed indexer_n_heads == 4 in both this
and the dealignai checkpoint before renaming -- without that check the rename
silently selects plain attention and serves a subtly wrong model that still
passes a healthcheck.

Measured on the live seat: healthy, coherent, KV 344,155 tokens @ 262,144 ctx,
MTP k=3 at 60.4% acceptance / 2.81 mean acceptance length, warm decode median
167.5 tok/s at conc=1 (n=5, spread 12.2%). The reorg note's dealignai figure
came from a different harness, so this is not claimed as a win over it; what
it does establish is that weight-only experts did not cost decode speed.

Still open: controlled quality A/B vs dealignai, and a deep-prefill probe at
262K. Rollback is two .env keys; dealignai remains on disk.

Also corrects the README's MTP-is-off section, stale since k=3 was deployed,
and adds a superseded-claims row to the quantization playbook.
2026-09-14 02:48:42 -07:00
vh ed3f1ede3b memory: snapshot — FV recovered, fv-ml1 seat reorg, gen-large blocked on orca runtime
FV colo recovered 2026-09-13 midday (chassis on PDU, firewall on the Eaton 5P1000,
GPU caps 275W/card). All-night fv-ml1 seat reorganization:

- flash-next gained MTP k=3 (campaign measured it a win here, +52% at conc=1),
  inverting vLLM's 4xH100 recipe; KV 14->10 GiB.
- gen consolidated onto flash-next (all 8 gen/summarizer/classifier/judge aliases
  repointed); 27B dense gen seat retired, 38 GB freed on GPU0.
- char-rp restored to the in-house MeroMero-v2-31B dense heretic (was serving a
  leftover-test RedHatAI 26B); char-rp-fast is the deliberate speed tier.
- Sentinel-R3 (SFT pentest finetune) served for an A/B vs mog-sec, then dflash k=7
  cut over after measuring it beat MTP (2.40 vs 2.18 acceptance, ~121 tok/s warm).

gen-large is intentionally DOWN: the orcarouter weight-only NVFP4 build downloaded
(170 GB, verified) but no mainline vLLM loads its compressed-tensors qwen4_exp PLE;
the third-party backport was vetted and is unfit (old-hardware fork, no Blackwell
image). Runtime decision pending -- this is the resume point.

Also this session: vh/infra-reference repo, scripts/seat-inventory.py + daily drift
alarm, OPNsense API reference vendored, secrets shed from a prior scratchpad.

Leaves the fv-to-ana-nat files (another session's) and graphify-out untouched.
2026-09-14 01:57:10 -07:00
vh 2d83a895c1 docs(fv-ml1): reconcile GPU seat inventory and model lineage against running containers
Read from docker inspect, nvidia-smi and each model's own config.json rather
than from compose files or the gateway config, so the document records what is
deployed rather than what was intended.

Findings worth naming:

- char-rp drift. The LiteLLM config documents char-rp as G4-MeroMero-v2-31B on
  ana-ml2 GPU 0; :8016 actually serves gemma4-26b-a4b-it-nvfp4, a 26B 30-layer
  128-expert stock Gemma-4, on fv-ml1 GPU 1. Host renaming explains part of it,
  but 31B MeroMero-v2 and 26B stock gemma4 are different models and the comment
  block carries sampler defaults keyed to the model it names.
- Two gateway aliases are dead: erp-tune-v2 (:8098) and gemma4-26b-a4b-it-base
  (:8099). Nothing is listening on either; callers get a connection failure
  rather than a clear retirement error.
- Three different speculative-decoding methods coexist -- dflash k=7 with a
  separate drafter on mog-sec, qwen3_5_mtp k=3 on gen, mtp k=3 on flash-next.
  The method string is architecture-specific; copying a --speculative-config
  between seats without changing it will not work.
- Three seats run the floating :latest tag, so what they would pull on recreate
  is not what is running and was never recorded.
- Seven aliases resolve to vllm-gen on :8015, which is why GPU 0 shows draw
  during ordinary OpenWebUI use -- its auto-titling fires summarizer per turn.

Also commits the flash-next-seat MTP k=3 change made today: compose gains the
speculative-config with its measured rationale, and .env.example documents the
KV-cache reduction MTP requires (14 GiB OOMs, 10 GiB verified in production).
2026-09-13 22:28:58 -07:00
vh 7e62a07341 flash-next-seat: full 262K context, KV pinned at a measured 14 GiB, gen-large on the gateway
Operator-directed: raise context to the model's native maximum and take as much KV
as the card safely allows, and expose the seat through LiteLLM as `gen-large`.

  max_model_len     131,072  ->  262,144
  KV cache             8.76  ->  14.00 GiB  (332,721 -> 560,654 tokens)
  concurrency      2.54x@128K ->  2.14x@262K

⚠ 16.00 GiB WAS TRIED FIRST AND IS TOO AGGRESSIVE. A 155,497-token non-repeating
prefill drove GPU 2 to 97,074 of 97,887 MiB and the caching allocator logged "OOM on
device 0 while trying to allocate 488636416 bytes (free: 422117376)" -- 466 MiB wanted
against 403 MiB free. The request completed, so nothing failed visibly; that is one
step before the shape that crashed stacks/mog-sec twice on 2026-09-10 (~1.04 GiB
wanted, ~600 MB free). Backed off to 14.00 GiB, which re-probes clean: zero allocator
warnings, a 155,557-token prefill in 14.2 s, and 2,085 MiB still free at peak.

The reason the first estimate was wrong is worth keeping, because it is not obvious
and it inverts the usual advice: --kv-cache-memory makes vLLM SKIP MEMORY PROFILING
ENTIRELY and ignore --gpu-memory-utilization. The profiler was the thing accounting
for deep-prefill activation, so pinning bytes switched off the protection that the
pin was supposed to formalise. vLLM's own "--kv-cache-memory=18745235968 (17.46 GiB)
to fully utilize gpu memory" line is computed from a profile measured at
max-num-batched-tokens depth and sits 3.5 GiB above what a 150K-token request
survives; open #54764 compounds it, since PLE short-conv prefill pads every request
in a batch to the batch-MAX query length.

max-num-batched-tokens stays at 8192 -- it is what bounds the activation peak, and
doubling max_model_len left the profiled peak unchanged at 1.65 GiB precisely because
the peak tracks chunk size, not context length.

Gateway: `gen-large` added to the LiteLLM model_list, pointing at fv-ml1:8022. One
alias on purpose -- a single alias cannot trip the shared-config enable_thinking
mutation footgun, which needs two over the same (model, api_base). Sampling is the
checkpoint's own declared set (temp 1.0 / top_p 0.95 / top_k 20); presence_penalty,
min_p and repetition_penalty are left unset because the checkpoint declares no
canonical value for them. Verified registered for both the infra-ops admin key and
the shared all-agents key, since a new model behind a scoped allowlist 403s silently.

Also adds services/flash-next-mtp-bench/ -- the MTP measurement campaign and its
rationale. MTP stays off, but on "not yet measured here" rather than on vLLM's
4xH100 recipe number, which is a cross-harness comparison and not evidence about a
TP=1 Blackwell seat.
2026-09-12 23:49:06 -07:00
vh 3132a16ca0 fv-ml1: finish the renumber the cutover missed -- 16 dead dashboard links
Every fv-ml1 link on the Homepage dashboard was broken. Measured against the
live dashboard API before the fix: 16 entries pointing at the dead 10.250.50.54
and zero at the live 10.251.50.54, covering gen, M.O.G.-SEC, Scriberr, Embed,
Rerank, Reward, Coder, Dockge and six dormant seats.

The miss was structural, not careless. fv-ml1-rename-sweep.sh works from an
allowlist assembled from files that mention the HOST, and a homepage.href label
mentions only an IP -- so every stack whose sole stale reference was a label
fell outside it. The allowlist now covers those 24 files, and records how to
derive the list next time (grep the old address, subtract history) rather than
enumerating from memory.

History is still untouched, and the exclusions are now written down with the
reason each one keeps the old address: recorded benchmark results, whose
base_url is part of a measurement's provenance; the one LiteLLM comment
preserving a retired hand-test endpoint; and the cutover runbooks, where the old
address is the subject matter.

Two bugs found while applying it, both fixed here:

  - deploy-stack.sh rejected any stack name containing a dot, so qwen3.5-122b,
    qwopus3.5-122b and mistral-medium-3.5 could not be deployed by the script at
    all. The check exists to stop path traversal, which means rejecting ".." and
    "/" -- not every dot. Traversal is now rejected explicitly and tested.
  - stacks/scriberr/.env.example allowed CORS only from the dead IP and from
    scriberr.ana.internal, which no longer resolves; the box is at the fv site
    and DNS already carries scriberr.fv.internal. The live .env had both stale
    origins, i.e. an allowlist with nothing reachable in it.

Host side, applied separately: canonical pushed for the 16 stacks whose only
difference from the host was this renumber, and an in-place address-only fix for
the nine whose host copy has genuinely drifted or has no canonical copy, so that
drift survives for a deliberate reconciliation instead of being clobbered. Every
compose.yaml on fv-ml1 now reads 10.251.50.54. The labels themselves only take
effect at container creation, so the running containers still need recreating.
2026-09-12 23:05:29 -07:00
vh f964a47262 flash-next-seat: Qwen3.8-Flash-Next on fv-ml1 GPU 2 with the n-gram table in host RAM
First seat whose weights do not fit its card. The model is 176B total -- a 125B
main model plus a 51B n-gram (PLE) lookup table -- at ~6B active per token. The
table is a pure embedding lookup, so it lives in pinned host RAM and the GPU
reads rows directly over CUDA UVA: ~78 GiB resident on a 95.6 GiB card, 47.7 GiB
pinned of 566 GB. GPU 2 and GPU 3 were both idle, so this displaced nothing.

Checkpoint dealignai/Qwen3.8-Flash-Next-ABLITERATED-NVFP4 @ be794b99, pinned by
revision: NVFP4 W4A4 routed experts, FP8 PLE table, everything else at source
precision. Chosen over better-liked builds because its provenance states
protocols and repeat counts -- AIME26 pass@1 98.75% over 30x8 repeats with a
stated SEM, full-set GSM8K, and a byte-equality audit covering all 31 MTP
tensors -- and because it declares text_config.ple_embedding_dtype, which is the
field vLLM reads first when selecting the PLE weight format. Builds that ship an
FP8 table without that declaration resolve to the unquantized path and fail on
load; the README records the check.

Requires vLLM #54371 (UVA PLE-offload, merged 2026-09-09T14:32Z), verified by
ancestry: the pinned nightly is +150 commits / behind_by 0 from the merge commit.
Not in v0.29.0, cut six hours earlier. The older worker-based offload (#53899) is
paused upstream and is not the path here -- its deadlocks, ptrace gate and
stale-output-under-graphs bugs all came from the separate worker process that UVA
does not have.

Five deliberate departures from the other seats on this box, each from a
measurement rather than a preference, all annotated in place:

  - no MTP: the vLLM recipe measured it worse at every concurrency on 4xH100
    (8-36% less throughput, 32-173% more latency, ~36% acceptance)
  - modelopt_fp4, not compressed-tensors: only the ModelOpt reader honours the
    ignore list keeping attention, shared experts, PLE and MTP out of W4A4
  - KV left at auto: fp8 KV on this model's QSA path is an unmerged RFC (#54426)
  - mamba-cache-mode stated explicitly: the model raises on mode "all"
  - 128K context and 8192 batched tokens, not the native 262K: #54764 and #54919
    make depth the risky axis, and sizing to the KV pool has never fixed a
    depth-driven crash on this hardware

Nothing is wired into LiteLLM. Pointing an alias at this seat changes what
existing callers receive and is a separate decision.
2026-09-12 23:05:29 -07:00
vh 87d7555fcf fv-ml1: the playbook + homepage body edits the rename commit missed
A zsh glob failure in the staging step of 91bda3c meant the five renamed
playbooks went in as pure renames with their bodies still saying ana-ml2 and
10.250.50.54, and the homepage docker.yaml direct-connection edit from 17586ab
did not stage either. Same content, just the half that got dropped.
2026-09-12 22:04:20 -07:00
vh 17586abb19 homepage: retire the fv-ml1 docker relay, its precondition is now met
stacks/ana-ml2-proxy existed for one reason, stated in its own README: ESH
could not reach the box's Docker API cross-site because of a return-route gap,
so ana-docker relayed :2354 -> :2375 from the same subnet. The README named
its own retirement condition -- "once it has a working return route to ESH,
point Homepage back at it directly and compose down this stack".

That condition is met. FV is on the mesh, vb-gateway accepts routes, and the
NH3 UDM, ESH UDM and Anaheim FortiGate all carry 10.251.0.0/16 statics toward
their local scale nodes. Verified before removing anything: esh-docker-vm
opens a TCP connection to 10.251.50.54:2375 directly.

Homepage now points at 10.251.50.54:2375 and discovers 112 services across 20
groups, so nothing regressed. The socat container is stopped and removed from
ana-docker; the compose file and README are deleted here rather than renamed,
because renaming would preserve a moving part that no longer earns its place.
2026-09-12 22:03:27 -07:00
vh 91bda3c480 fv-ml1: complete the cutover — rename, renumber, DNS, and the LiteLLM repoint
The box is physically at Fountain Valley, renamed, renumbered onto 10.251/16,
and serving inference again. This lands the repo half of that.

Host: hostname ana-ml2 -> fv-ml1, pinned to 10.251.50.54 by a dnsmasq
reservation so the address the runbook, DNS and LiteLLM all assume is the
address it actually has. Its headscale node is renamed too.

The sweep ran from scripts/fv-ml1-rename-sweep.sh, whose allowlist is the
reason this diff touches current-state files and not the record. Dated
persistent-memory entries, archival-memory and incident notes still say
ana-ml2 in 31 and 62 places respectively, because that is what the box was
when those things happened. Rewriting them would make the history lie.

LiteLLM was the load-bearing piece and needed more than the api_base sed the
runbook describes. Twenty api_base entries repointed, but a grep-and-verify
pass also caught a LIVE pass_through_endpoints target for the scalar-judge
reward route still on the old address -- an api_base-only substitution would
have left it dead. Four prose references describing current state were
repointed as well; one historical note recording where a hand-test was run
is deliberately left pointing at 10.250.50.54.

Two facts in the server tables were wrong and are corrected here. The site is
Fountain Valley, not Anaheim. And the box has FOUR RTX PRO 6000 Blackwell
Max-Q, not two -- verified by nvidia-smi -L and independently by PCI
enumeration of four GB202GL devices. That is 391 GB of VRAM rather than 196,
which changes what fits on it.

DNS: fv-ml1, fv-ml1-bmc and fv-gw added under the fv site via the piggyback
approach, scriberr re-homed, and the ana-ml2 records removed. Applied to all
three resolvers. The BMC record carries a warning that its 802.1q VLAN tag
must stay disabled -- it shipped tagging VLAN 250 into an untagged port,
which made it invisible to every network-side diagnostic and is the reason
it appeared dead through several cable changes.

Verified end to end: summarizer and sec both answer through the Anaheim
gateway across the mesh to FV seats on different ports.
2026-09-12 22:00:50 -07:00
vh ddfa1a6e5b feat(beszel): commit the fleet agent rollout — configs, playbooks and runbooks
Beszel agents are installed and verified across the fleet but the artifacts that
produced them were never committed, so the deployment existed only on the hosts.

Adds the per-host agent environment files (PORT, NICS, EXTRA_FILESYSTEMS and the
hub's PUBLIC key), the systemd unit, the guest install script, the Synology
compose, and the elway playbooks for native, guest-stage, guest-install and
Synology paths. The two dated memory detail files covering the priority-1 and
priority-2 waves ship alongside, per the convention that memory lands with the
work it describes.

No credentials here. The KEY= value in every host env is the Beszel hub's public
ed25519 key, identical across all nine and public by design; the agent README
says so explicitly. The nh3-nas sudo password referenced in the runbook prose
lives in Vaultwarden and the helper scripts named there never contained it.

⚠ Overlapping VMIDs across hypervisors are a standing trap and are recorded in
the priority-2 notes: pfi-pve 105=postgres and 100=pbs-ana, nh3-pve 105=pbs-nh3.
⚠ PBS-NH3's export was ~75.5% used at capture; resource checks are not job
success monitoring and should not be read as such.
2026-09-11 22:09:18 -07:00
vh b8435ceb6f Set mog-sec's context to a measured ceiling so it refuses instead of dying
Operator: "loading up the context killed sec again." That reproducer is what
finally made the failure legible, and it showed the previous four fixes had all
been aimed at the wrong quantity.

What the KV pool can hold and what the card can process at depth are different
numbers. Cutting context 420k to 384k to 320k, pinning the KV in bytes, and
dropping the prefill chunk from 16384 to 4096 all sized the pool. The crashes were
governed by the transient needed to process a prefill chunk against a quarter
million tokens of resident KV, which scales with depth and not with pool size.
Each change helped and none fixed it.

Bisected against the real reproducer, with a non-repeating prompt because prefix
caching would let a repeated one hash to cached blocks and never prefill deep:

  113,247 prompt tokens  SURVIVED (27 s)
  200,088 prompt tokens  SURVIVED (174 s)
  ~285,000 prompt tokens ENGINE DIED, HTTP 500, container restarted

The sustainable ceiling therefore sits between 200k and 285k with gen idle, and
gen shares the card with its load uncontrolled, so 163,840 takes about 20% margin
under the proven-good depth rather than sitting at the measured edge.

The ceiling's purpose is the refusal. Verified after the change: a 149,073-token
request serves in 41 s, and requests at both 200k and the ~285k depth that killed
the engine now return a clean 400 naming the limit in under a second with the seat
untouched. A seat that refuses what it cannot serve is strictly better than one
that dies trying.

Concurrency went 1.03x to 2.09x. The compose header's "served at native 262K" was
never actually deliverable on a shared card; it had simply not been exercised at
depth until today.

The probe is committed rather than described, so the ceiling can be re-measured
when the card's tenancy changes.
2026-09-10 16:04:16 -07:00
vh 8842ffe1fe Pin mog-sec's KV in bytes at 16.48 GiB and take it to 320k context
Operator: "yes, pin the kv and take it to 320k."

The real finding, which took three crashes and two failed attempts to reach:
--gpu-memory-utilization does not bound actual usage. It sizes the KV
calculation, but peak activation is measured at profiling time and real
long-context work exceeds the profile. vLLM's own budget line showed mog-sec
running 0.9 GiB over its 47.48 GiB reservation -- 26.44 consumed plus 3.53 peak
activation plus 0.89 CUDAGraph plus 17.52 KV equals 48.38 -- and gen was over by
0.33 on the same card. That overage came out of the shared card's slack, which is
what kept OOMing after the utilization drop.

The fix is the one vLLM printed itself: --kv-cache-memory=17697765376, its own
recommended figure to fit inside the requested budget. Same discipline erp-seat
already uses, and for the same stated reason -- an explicit figure is
reproducible where a ratio silently yields a different cache depending on what
else is resident at start time.

The KV pin and the context length are coupled. 16.48 GiB yields about 383,730
tokens, so a 393,216 max_model_len falls under the 1.0x floor and vLLM refuses to
start rather than crashing later; pinning the KV while keeping 384k was never an
available combination. 327,680 leaves 1.15x, up from 1.03x.

Verified: the engine now logs "reserved 16.48 GiB memory for KV Cache as
specified by kv_cache_memory_bytes config and skipped memory profiling", KV
375,901 tokens, GPU0 down to 90,561 MiB from 91,313, RestartCount 0, and both sec
and sec-reasoning return 200 through the gateway.

Also records the BabyBronte eyeball A/B, whose result is the operator's own: the
voice transferred and the sense did not. Curly quotes went 1 of 18 to 18 of 18
and worksheet collapse 3 of 18 to 0 of 18 between arms. That voice is separable
from coherence at 0.6B is the premise the lightweight-adapter regime rests on, so
this is the informative outcome rather than a disappointing one. A corpus-prep
defect surfaced with it: the tuned output is hard-wrapped at about 70 characters
because the Gutenberg source kept its line breaks and the adapter learned the
typography too.

Cost: 320k of context instead of 420k, on a seat whose crashes happened at 151k.
2026-09-10 15:19:47 -07:00