From ea8cd9723b1b7846227470636cedb1598b748382 Mon Sep 17 00:00:00 2001 From: echo6-autocommit Date: Tue, 7 Jul 2026 18:00:05 +0000 Subject: [PATCH] auto: docs sync 2026-07-07T18:00:05+00:00 Files changed: engine/lint-report.md vault/.obsidian/workspace.json vault/runbooks/meshai-prod-compose-override.md --- engine/lint-report.md | 2 +- vault/.obsidian/workspace.json | 4 +- .../runbooks/meshai-prod-compose-override.md | 73 +++++++++++++++++++ 3 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 vault/runbooks/meshai-prod-compose-override.md diff --git a/engine/lint-report.md b/engine/lint-report.md index 3b37057..2d92d62 100644 --- a/engine/lint-report.md +++ b/engine/lint-report.md @@ -1,6 +1,6 @@ # Vault Lint Report -Generated: 2026-07-07T06:00:07Z | Docs scanned: 101 | Elapsed: 0.0s +Generated: 2026-07-07T12:00:07Z | Docs scanned: 101 | Elapsed: 0.0s ## Summary diff --git a/vault/.obsidian/workspace.json b/vault/.obsidian/workspace.json index 4205fe7..5e22a3f 100644 --- a/vault/.obsidian/workspace.json +++ b/vault/.obsidian/workspace.json @@ -199,6 +199,8 @@ }, "active": "17bd4a6166f789d0", "lastOpenFiles": [ + "runbooks/meshai-prod-compose-override.md", + "runbooks/meshai-prod-compose-override.md.tmp.5281.6ff00a45f3af", "docs/hardware/environment.md.tmp.246153.593a4dd35d71", "docs/hardware/environment.md.tmp.246153.61ce5813aae7", "glossary.md.tmp.246153.a1d75ab07676", @@ -208,8 +210,6 @@ "projects/meshcore-transport.md.tmp.5281.d9ef6ce168ab", "projects/meshcore-transport.md.tmp.5281.017d34de615d", "projects/meshcore-transport.md.tmp.5281.1f9a0c39eb6d", - "projects/meshcore-transport.md.tmp.5281.72fa3b1103cf", - "projects/meshcore-transport.md.tmp.5281.ecb9b7a692b9", "projects/meshai.md", "projects/meshcore-transport.md", "runbooks/pymc-repeater-kiss-tnc-reenumeration.md", diff --git a/vault/runbooks/meshai-prod-compose-override.md b/vault/runbooks/meshai-prod-compose-override.md new file mode 100644 index 0000000..3d288ee --- /dev/null +++ b/vault/runbooks/meshai-prod-compose-override.md @@ -0,0 +1,73 @@ +--- +title: meshai prod compose override (cutover state + MeshCore radio) +type: runbook +tags: + - mesh +related: + - [[meshai]] + - [[meshcore-transport]] +updated: 2026-07-07 +--- + +# meshai prod compose override + +Backup + restore for `docker-compose.override.yml` on **CT 108** (the [[meshai]] +production host). This file is **untracked and prod-only** — it exists nowhere +but `/home/zvx/meshai/work/docker-compose.override.yml`, is not in the public +`zvx-echo6/meshai` repo, and carries no git trace. If the deploy tree is +re-cloned or wiped, production silently reverts to shadow-mode alerts and loses +the MeshCore radio. This runbook is its durable copy. + +Docker Compose auto-merges `docker-compose.override.yml` over the committed +`docker-compose.yml`, so both settings below are live without any extra flag. + +## Verbatim contents (as of 2026-07-07) + +```yaml +services: + meshai: + environment: + - MESHAI_CUTOVER_CATEGORIES=earthquake_event,geomagnetic_storm,rf_propagation_alert,avalanche_warning,avalanche_watch,weather_warning,weather_statement,work_zone,road_incident,road_closure,traffic_congestion,stream_flow,wildfire_declared,wildfire_incident,wildfire_closed + devices: + - /dev/meshcore-rak:/dev/meshcore-rak +``` + +## What each line does + +- **`MESHAI_CUTOVER_CATEGORIES`** — the staged-cutover switch consumed by + `meshai/notifications/cutover.py` (`is_cutover()`). Each hazard category is + migrated onto the shared formatter+decider pipeline in shadow-only mode first + (old handler broadcasts live; new code dry-runs and logs mismatches to + `/app/data/shadow/.jsonl`). Adding a category name here **flips it + live** onto the new formatter+decider and stops the shadow comparison. The + list above is effectively the full hazard set → the all-native cutover is + complete in prod. Empty/unset = nothing cut over (pure shadow bake). + Note: the three `wildfire_*` categories are *also* force-enabled directly in + code (`NATIVE_ALWAYS_DECIDE` in `cutover.py`) regardless of this var, because + the fire decider itself is the dedup/cooldown gate. +- **`devices: /dev/meshcore-rak`** — passes the RAK4631 MeshCore USB radio on + the utility host into the container at a stable udev symlink path. Without it + the container cannot see the MeshCore hardware (see [[meshcore-transport]]). + +Both are deployment state (cutover progress + host-specific device path), which +is why they live in an override rather than the committed public compose file. + +## Restore + +```bash +# from root@utility (100.64.0.5); zvx has no sudo on CT 108 +pct exec 108 -- bash -lc 'cat > /home/zvx/meshai/work/docker-compose.override.yml <<"EOF" +services: + meshai: + environment: + - MESHAI_CUTOVER_CATEGORIES=earthquake_event,geomagnetic_storm,rf_propagation_alert,avalanche_warning,avalanche_watch,weather_warning,weather_statement,work_zone,road_incident,road_closure,traffic_congestion,stream_flow,wildfire_declared,wildfire_incident,wildfire_closed + devices: + - /dev/meshcore-rak:/dev/meshcore-rak +EOF' +# then rebuild/recreate so the merge takes effect +pct exec 108 -- bash -lc 'cd /home/zvx/meshai/work && docker compose up -d' +``` + +Verify after restore: `docker exec meshai printenv MESHAI_CUTOVER_CATEGORIES` +returns the list, and `docker exec meshai ls -l /dev/meshcore-rak` shows the +device inside the container.