diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md index e6947db..ae97e73 100644 --- a/graphify-out/GRAPH_REPORT.md +++ b/graphify-out/GRAPH_REPORT.md @@ -1,16 +1,16 @@ # Graph Report - eshpfi-management (2026-09-18) ## Corpus Check -- 623 files · ~838,395 words +- 623 files · ~839,853 words - Verdict: corpus is large enough that graph structure adds value. ## Summary -- 5469 nodes · 5972 edges · 636 communities (482 shown, 154 thin omitted) +- 5471 nodes · 5974 edges · 631 communities (477 shown, 154 thin omitted) - Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 97 edges (avg confidence: 0.81) - Token cost: 0 input · 0 output ## Graph Freshness -- Built from commit: `156e1261` +- Built from commit: `d812bfe9` - Run `git rev-parse HEAD` and compare to check if the graph is stale. - Run `graphify update .` after code changes (no API cost). @@ -153,7 +153,7 @@ - [2026-08-23] Anaheim's IPsec tunnel delivers ~25% of a verified 2 Gbps circuit - `[2026-09-15]` FV cross-site routing fixed — one NAT rule scoped to Anaheim only - category -- max +- build_gallery - lv-mccarthy — corpus → gate → pairs - 7. Critical Warnings by Model - think-leak — reproducers for the h300 unterminated-`` defect @@ -374,7 +374,7 @@ - Cloudflare state for phasefinal.com - 6. Round-1 aborted; throughput root-caused (measured 2026-08-24 22:00 PDT) - SLZB-MR1U Zigbee/Thread coordinator — ESH IoT VLAN -- mime +- CatalogResponse - Packed - Gemma-4 26B-A4B ERP/RP tune — GPU sizing adjudication - Training throughput probes @@ -444,11 +444,11 @@ - `[2026-09-04]` `gen` moved to ana-ml2 GPU0 — and I sized it against the wrong number, twice in one hour - launch-run-03c.sh - `[2026-09-04]` Forcing 10G on the ESH-Media DAC FAILED progressively — and I called the plateau too early -- optional +- fields - `[2026-09-04]` esh-nas SMB account for the AudioGridder box — and the NAS is effectively open to the whole LAN - remote-ssh - verify_corpus.py -- properties +- catalog_version - booth - tok_repro.py - wrap_verbatim_html @@ -458,7 +458,7 @@ - `[2026-09-10]` althing 3.6.2 rolled — post office + both heralds, and it was TWO nodes not seven - FV to Anaheim: scoped Tailscale NAT repair - setup-nh3-scale-socks-egress.sh -- mime_from_field +- generated_at - 2026-09-10-beszel-fleet-wiring.md - bench_lora_step.py - probe_carrier.py @@ -544,7 +544,7 @@ - guest-install.sh - 2026-09-11-beszel-priority1.md - 2026-09-11-beszel-priority2.md -- stream_chunks +- section - gen-seat — the fleet `gen` seat (fv-ml1 GPU0, :8015) - seat-inventory-drift-check.sh - build_corpus.py @@ -552,7 +552,7 @@ - irv-ml1 dead-address sweep — EXECUTED 2026-09-15 (operator-directed) - fv-mesh-watchdog.sh - grok-token-broker -- options +- accepted_types - kb - 2026-09-10-an-author-voice-adapter-transfers-subject.md - 2026-09-10-babybronte-h02-adapter-the-voice-transferred.md @@ -578,7 +578,7 @@ - breeze-tts sizing and the fv-ml1 GPU 0 placement question (2026-09-15) - 2026-09-15-client-abandon-cancellation-boundary.md - gender_by_proximity.py -- required +- streamable - verify_quant.py - [2026-08-24] ESH DNS fixed at the IPv6 layer, and the naming scheme went live - booth/app.py @@ -592,17 +592,14 @@ - Fleet SSH — the infra-ops identity and host map - build_beat_fixture.py - The Booth — ephemeral media board + operator decisions -- endpoint -- section -- $ref +- lifecycle +- min +- properties - pin_known_gender.py - Speech — TTS and ASR endpoints -- adapter/server.py - repair_corpus_bronte.py - 2026-09-16-grok-broker-shelved.md - 2026-09-17-lv-bronte-gate.md -- type -- gpu.py - Path - memorization_selfsim.py - eval-hemingway.sh @@ -622,8 +619,6 @@ - henge.md - playwright.md - _cli -- sanitize_tts_text -- generate_pickup_id ## God Nodes (most connected - your core abstractions) 1. ``[2026-09-01]` althing 3.2.0 deployed on nh3-dev — pane routes, and `uv tool install .` lies` - 36 edges @@ -640,19 +635,19 @@ ## Surprising Connections (you probably didn't know these) - `_read_cli_credential()` --calls--> `walk()` [INFERRED] services/grok-token-broker/broker.py → scripts/kb-search.py -- `_speaker_embedding()` --references--> `Tensor` [EXTRACTED] - stacks/zonos/adapter/server.py → services/coldfusion-abliteration/kl_divergence.py - `convert()` --references--> `Any` [EXTRACTED] tools/mistral-small4-nvfp4/convert_hf_to_native.py → stacks/omnivoice/app.py +- `_speaker_embedding()` --references--> `Tensor` [EXTRACTED] + stacks/zonos/adapter/server.py → services/coldfusion-abliteration/kl_divergence.py - `build_gallery()` --calls--> `is_ask_file()` [INFERRED] services/booth/booth/app.py → services/booth/booth/asks.py -- `test_cli_unlink_by_id_even_when_the_id_is_all_digits()` --calls--> `parse_link_entries()` [INFERRED] - services/booth/tests/test_booth.py → services/booth/booth/links.py +- `list_booths()` --calls--> `is_ask_file()` [INFERRED] + services/booth/booth/app.py → services/booth/booth/asks.py ## Import Cycles - None detected. -## Communities (636 total, 154 thin omitted) +## Communities (631 total, 154 thin omitted) ### Community 0 - "quant_modelopt.py" Cohesion: 0.53 @@ -675,8 +670,8 @@ Cohesion: 0.07 Nodes (29): ana-docker (VM 10.250.50.70), ana-filebot (CT 112 on pfi-pve) — file automation, ana-nas (CT 109 on pfi-pve, 10.250.50.50), ana-wg (CT 113 on pfi-pve) — WireGuard VPN, Cross-cutting: what to check FIRST for ambiguous outages, esh-docker-vm + vm-esh-nas, esh-pve + esh-pve-nas (10.0.250.35 + 10.0.50.55), Fleet disaster-recovery runbook (+21 more) ### Community 5 - "properties" -Cohesion: 0.09 -Nodes (23): anyOf, default, title, anyOf, default, title, additionalProperties, description (+15 more) +Cohesion: 0.07 +Nodes (29): anyOf, default, title, anyOf, default, title, properties, anyOf (+21 more) ### Community 6 - "1. Locked architectural decisions" Cohesion: 0.07 @@ -711,8 +706,8 @@ Cohesion: 0.11 Nodes (17): 1. Create rest-server-ana htpasswd entry, 2. Install secrets on esh-vm-db, 3. Initialize the repo, 4. Install prerequisites (restic, resticprofile, mongosh client), 5. Deploy profile + hook, 6. Schedule + verify, Deploy (one-time), Full host config (+9 more) ### Community 14 - "properties" -Cohesion: 0.11 -Nodes (19): anyOf, default, title, properties, default, title, anyOf, default (+11 more) +Cohesion: 0.08 +Nodes (24): properties, default, title, anyOf, default, anyOf, default, title (+16 more) ### Community 15 - "Deploy (one-time setup)" Cohesion: 0.12 @@ -923,8 +918,8 @@ Cohesion: 0.25 Nodes (7): backrest, Backup scope, when wired up, Deploy, First-time configuration (in the UI), Role in the fleet, Scaling knobs, Why not `offen/docker-volume-backup`? ### Community 67 - "omnivoice/app.py" -Cohesion: 0.09 -Nodes (26): Any, ChunkConfig, ChunkResult, _base_gen_kwargs(), _chunk_config(), GenParams, _log_chunk(), _pcm16() (+18 more) +Cohesion: 0.06 +Nodes (46): Any, ChunkConfig, ChunkResult, ClockFn, GenerateFn, _base_gen_kwargs(), _chunk_config(), GenParams (+38 more) ### Community 68 - "calibre-web-automated" Cohesion: 0.25 @@ -967,8 +962,8 @@ Cohesion: 0.26 Nodes (23): Exception, bw(), BwError, cmd_backfill(), cmd_get(), cmd_list(), cmd_put(), cmd_rm() (+15 more) ### Community 78 - "test_booth.py" -Cohesion: 0.05 -Nodes (48): build_gallery(), doc_kind(), is_kept(), markdown' | 'text' | None — a booth file viewable as a readable page., (rendered, is_html). Markdown → HTML (fenced code, tables, sane lists); plain…, True if this booth carries the keep sentinel and must never be swept., Files in a booth as render items, with caption sidecars folded in. A…, render_doc() (+40 more) +Cohesion: 0.06 +Nodes (35): generate_pickup_id(), is_kept(), True if this booth carries the keep sentinel and must never be swept., A human-readable id like '4-wombat' or 'star-84'. `exists(name)->bool` gates…, Releasing something already released is a no-op, not a 500., Reversible: the release step must not be a one-way door., Both mutating routes must use resolve_booth, not raw path joining. A name…, test_booth_autogallery_renders_media() (+27 more) ### Community 79 - "pfi-tacticalrmm" Cohesion: 0.25 @@ -1003,8 +998,8 @@ Cohesion: 0.25 Nodes (7): API, Deploy, Gotchas, Switching to the 7B variant, VibeVoice, Voices, Why this stack exists ### Community 87 - "properties" -Cohesion: 0.14 -Nodes (14): properties, anyOf, default, $ref, lifecycle, model, reproducibility, response (+6 more) +Cohesion: 0.15 +Nodes (13): properties, title, type, $ref, title, type, endpoint, model (+5 more) ### Community 88 - "Dia / Dia2" Cohesion: 0.29 @@ -1087,8 +1082,8 @@ Cohesion: 0.29 Nodes (6): Adapter request (example), Deploy, Notes, Two surfaces: Gradio eval (8199) + REST adapter (8203), Why this stack exists, Zonos ### Community 108 - "test_asks.py" -Cohesion: 0.06 -Nodes (68): parametrize, list_booths(), ask_stem(), AskError, _blank(), _bool(), _clean_notes(), is_answer_file() (+60 more) +Cohesion: 0.07 +Nodes (66): parametrize, ask_stem(), AskError, _blank(), _bool(), _clean_notes(), is_ask_file(), list_asks() (+58 more) ### Community 109 - "Fleet bootstrap — read this first" Cohesion: 0.40 @@ -1202,9 +1197,9 @@ Nodes (20): `[2026-09-15]` FV cross-site routing fixed — one NAT rule scoped t Cohesion: 0.50 Nodes (4): enum, title, type, category -### Community 138 - "max" -Cohesion: 0.50 -Nodes (4): anyOf, default, title, max +### Community 138 - "build_gallery" +Cohesion: 0.09 +Nodes (24): booth_image_names(), build_gallery(), classify(), doc_kind(), list_booths(), markdown' | 'text' | None — a booth file viewable as a readable page., (rendered, is_html). Markdown → HTML (fenced code, tables, sane lists); plain…, Image files in a booth, in gallery (sorted-rel) order — for viewer prev/next. (+16 more) ### Community 139 - "lv-mccarthy — corpus → gate → pairs" Cohesion: 0.33 @@ -1759,8 +1754,8 @@ Cohesion: 0.70 Nodes (4): ask(), classify(), load_prompts(), main() ### Community 327 - "worker/app.py" -Cohesion: 0.14 -Nodes (10): RuntimeError, get_gpu_status(), post_train(), FastAPI surface for the LoRA training worker (§4.1 API — arbo is the client). E, TrainRequest, Static configuration for the LoRA training worker. Everything load-bearing is a, LoRA training worker — a host service (runs as llmuser on irv-ml1) that runs sd-, Busy (+2 more) +Cohesion: 0.15 +Nodes (15): RuntimeError, get_gpu_status(), post_train(), FastAPI surface for the LoRA training worker (§4.1 API — arbo is the client). E, TrainRequest, _bus_id_by_index(), _cmdline(), gpu_status() (+7 more) ### Community 329 - "Beszel fleet monitoring" Cohesion: 0.33 @@ -1930,9 +1925,9 @@ Nodes (10): 6.1 Where the step time goes, 6.1a ⚠ 8.6% MFU was an accounting ar Cohesion: 0.18 Nodes (10): ⚠ Home Assistant CANNOT resolve `.internal` — give it the IP, mDNS crosses the VLAN boundary — and that has one sharp edge, ⚠ port_overrides is a WHOLE-ARRAY PUT, Reachability is already open, and was proven before the move, Resolver: ha-dev declined the `dns:` fix, deliberately, Rollback, SLZB-MR1U Zigbee/Thread coordinator — ESH IoT VLAN, The MAC is a derived ESP32 interface address — stable, not fragile (+2 more) -### Community 380 - "mime" -Cohesion: 0.50 -Nodes (4): anyOf, default, title, mime +### Community 380 - "CatalogResponse" +Cohesion: 0.33 +Nodes (6): additionalProperties, description, required, title, type, CatalogResponse ### Community 381 - "Packed" Cohesion: 0.09 @@ -2043,8 +2038,8 @@ Cohesion: 0.29 Nodes (6): lv-bronte — corpus pipeline, end to end, ⭐ The leak the gate cannot see, The two source defects, What the controls caught, Why gender needs a separate pinning stage, Why this corpus needed its own pipeline ### Community 419 - "searxng" -Cohesion: 0.25 -Nodes (7): Current egress: ESH (2026-09-17), ⚠ /healthz cannot tell you whether search works, Historical placement: NH3 rather than the colo, searxng, Secret, The MCP tool, Update +Cohesion: 0.20 +Nodes (9): Current egress: direct from NH3, ⚠ /healthz cannot tell you whether search works, Historical placement: NH3 rather than the colo, searxng, Secret, The 2026-09-18 engine outage — cause was the build, not egress, The ESH egress experiment (2026-09-17 → reverted 2026-09-18), The MCP tool (+1 more) ### Community 420 - "voice_distance.py" Cohesion: 0.52 @@ -2115,8 +2110,8 @@ Cohesion: 0.40 Nodes (3): `[2026-09-05]` A peer's "2.7x stack effect" was a coin flip — the operator caught it and the arithmetic is worth keeping, `[2026-09-04/05]` vLLM RUNS on sm_121 — and the blocker was `ninja` not being on PATH, not the silicon, Run 4 — the corpus arm ### Community 443 - "FastAPI" -Cohesion: 0.19 -Nodes (11): ACEStepInput, ACEStepOutput, generate_audio(), initialize_pipeline(), Generate music; respond with the audio bytes inline. Pre-2026-05-11 this re, ACEStepPipeline, BaseModel, FastAPI (+3 more) +Cohesion: 0.12 +Nodes (18): ACEStepInput, ACEStepOutput, generate_audio(), initialize_pipeline(), Generate music; respond with the audio bytes inline. Pre-2026-05-11 this re, ACEStepPipeline, _get_model(), OpenAI-ish /v1/audio/speech adapter in front of the Zonos Python SDK. Why this (+10 more) ### Community 445 - "`[2026-09-15]` ESPHome modernised for ha-dev; `kb` search tool for the personal Worldtree KB" Cohesion: 0.50 @@ -2142,17 +2137,17 @@ Nodes (3): `[2026-09-04]` `gen` moved to ana-ml2 GPU0 — and I sized it against Cohesion: 0.50 Nodes (3): `[2026-09-04]` Forcing 10G on the ESH-Media DAC FAILED progressively — and I called the plateau too early, ⚠ IT DEGRADED, AND MY "PLATEAU" READ WAS WRONG, Method notes worth keeping -### Community 454 - "optional" +### Community 454 - "fields" Cohesion: 0.50 -Nodes (4): default, title, type, optional +Nodes (4): items, title, type, fields ### Community 456 - "remote-ssh" Cohesion: 0.50 Nodes (3): SSH_MCP_STRICT_ALLOWLIST, node, remote-ssh -### Community 458 - "properties" -Cohesion: 0.15 -Nodes (13): default, title, type, anyOf, default, title, properties, catalog_version (+5 more) +### Community 458 - "catalog_version" +Cohesion: 0.50 +Nodes (4): default, title, type, catalog_version ### Community 462 - "wrap_verbatim_html" Cohesion: 0.22 @@ -2178,13 +2173,13 @@ Nodes (6): `[2026-09-10]` althing 3.6.2 rolled — post office + both heralds, a Cohesion: 0.25 Nodes (7): Backup and rollback, Broadened to the whole FV LAN, same session, Evidence and verification, ⭐ EXTENDED 2026-09-15 — NH3, ESH and Irvine now have the same rule, FV to Anaheim: scoped Tailscale NAT repair, Persistent configuration, What this looks like when it breaks, so the next person skips the evening -### Community 469 - "mime_from_field" +### Community 469 - "generated_at" Cohesion: 0.50 -Nodes (4): anyOf, default, title, mime_from_field +Nodes (4): anyOf, default, title, generated_at ### Community 474 - "invocation.py" -Cohesion: 0.19 -Nodes (14): Path, test_published_relative_path(), test_published_relative_path_explicit_train_id_wins(), ValueError, InvalidTrainRequest, published_relative_path(), Fixed-invocation command builder — the enforcement point for INV-T7. arbo hands, The ComfyUI-relative loras path for a succeeded LoRA (Phase 2 publish step). (+6 more) +Cohesion: 0.14 +Nodes (17): Path, test_published_relative_path(), test_published_relative_path_explicit_train_id_wins(), ValueError, Static configuration for the LoRA training worker. Everything load-bearing is a, LoRA training worker — a host service (runs as llmuser on irv-ml1) that runs sd-, InvalidTrainRequest, published_relative_path() (+9 more) ### Community 483 - "recover_direction" Cohesion: 0.52 @@ -2207,8 +2202,8 @@ Cohesion: 0.33 Nodes (3): png(), Verify the swapped char-rp-fast seat before the gateway alias points at it. The…, Minimal solid-colour PNG, built here so the test needs no asset on disk. ### Community 503 - "Path" -Cohesion: 0.21 -Nodes (14): load_config(), Path, load_pairs(), main(), Do the GENERATED BEATS name characters the rename removed? `leak_gate.py` reads…, load_copies(), load_works(), main() (+6 more) +Cohesion: 0.18 +Nodes (16): load_config(), Path, load_pairs(), main(), Do the GENERATED BEATS name characters the rename removed? `leak_gate.py` reads…, load_copies(), load_works(), main() (+8 more) ### Community 506 - "Plex hardware transcoding on the Arc A580 (esh-pve-nas, LXC 105)" Cohesion: 0.25 @@ -2314,9 +2309,9 @@ Nodes (5): Authoritative vs mirror, Deploy, dockge, Homepage, Layout Cohesion: 0.33 Nodes (5): Deploy, fablefusion-charrp-probe — THROWAWAY evaluation seat (fv-ml1 GPU1), ⚠️ GPU1 is zero-sum — this seat CANNOT run beside Dark-Scarlett, MTP depth: 3, not the card's 5, Why this candidate -### Community 556 - "stream_chunks" -Cohesion: 0.19 -Nodes (17): ClockFn, GenerateFn, ChunkConfig, _ema(), _est_gen_time(), plan_chunk(), protect_first_audio(), Split into sentence units, preserving punctuation. Whitespace-collapsed. (+9 more) +### Community 556 - "section" +Cohesion: 0.50 +Nodes (4): section, anyOf, default, title ### Community 557 - "gen-seat — the fleet `gen` seat (fv-ml1 GPU0, :8015)" Cohesion: 0.50 @@ -2334,9 +2329,9 @@ Nodes (6): ⚠⚠ FOUR MORE LIVE BREAKAGES on OTHER hosts — the sweep's real f Cohesion: 0.29 Nodes (6): Current state — ⛔ SHELVED, deliberately, 2026-09-16, For a consumer, grok-token-broker, Invariants, The problem, ⛔ Why the loop is disarmed until measured -### Community 564 - "options" +### Community 564 - "accepted_types" Cohesion: 0.50 -Nodes (4): anyOf, default, title, options +Nodes (4): anyOf, default, title, accepted_types ### Community 582 - "build_corpus_hemingway.py" Cohesion: 0.20 @@ -2358,9 +2353,9 @@ Nodes (8): breeze-tts sizing and the fv-ml1 GPU 0 placement question (2026-09-15 Cohesion: 0.31 Nodes (9): decide(), load_text(), main(), Path, D2b for BabyHemingway: resolve entity gender by MAJORITY VOTE over nearby…, One pass over the corpus for EVERY surface at once. The obvious shape -- rescan…, Score a name's local pronoun mix AGAINST THE CORPUS BASE RATE, not against…, score() (+1 more) -### Community 590 - "required" +### Community 590 - "streamable" Cohesion: 0.50 -Nodes (4): required, default, title, type +Nodes (4): streamable, default, title, type ### Community 591 - "verify_quant.py" Cohesion: 0.40 @@ -2371,8 +2366,8 @@ Cohesion: 0.40 Nodes (5): [2026-08-24] ESH DNS fixed at the IPv6 layer, and the naming scheme went live, Root cause, The naming scheme became real, The three wrong turns, What landed ### Community 593 - "booth/app.py" -Cohesion: 0.08 -Nodes (29): fixture, booth_image_names(), classify(), create_app(), _from_env(), human_dur(), The Booth — a standing web server that renders drop-folders as ephemeral media…, Image files in a booth, in gallery (sorted-rel) order — for viewer prev/next. (+21 more) +Cohesion: 0.10 +Nodes (22): fixture, create_app(), _from_env(), human_dur(), The Booth — a standing web server that renders drop-folders as ephemeral media…, A Content-Disposition-safe `.zip` (strip quotes/control chars)., Reduce a client-supplied filename to a safe basename (no path, no hidden)., safe_upload_name() (+14 more) ### Community 596 - "description" Cohesion: 0.50 @@ -2402,38 +2397,26 @@ Nodes (5): Fleet SSH — the infra-ops identity and host map, Identity, Mesh, Si Cohesion: 0.40 Nodes (4): Ask the operator to decide (no chat round-trip), Show the operator something, Standing convention — the link board, The Booth — ephemeral media board + operator decisions -### Community 604 - "endpoint" +### Community 604 - "lifecycle" Cohesion: 0.67 -Nodes (3): title, type, endpoint +Nodes (3): anyOf, default, lifecycle -### Community 605 - "section" +### Community 605 - "min" Cohesion: 0.50 -Nodes (4): section, anyOf, default, title +Nodes (4): anyOf, default, title, min -### Community 606 - "$ref" +### Community 606 - "properties" Cohesion: 0.15 -Nodes (13): items, title, type, $ref, fields, section_groups, services, items (+5 more) +Nodes (14): $ref, properties, reproducibility_audit, section_groups, services, items, title, type (+6 more) ### Community 608 - "Speech — TTS and ASR endpoints" Cohesion: 0.40 Nodes (4): ASR, Speech — TTS and ASR endpoints, Traps, TTS -### Community 609 - "adapter/server.py" -Cohesion: 0.29 -Nodes (7): _get_model(), OpenAI-ish /v1/audio/speech adapter in front of the Zonos Python SDK. Why this, _speaker_embedding(), speech(), SpeechRequest, JSONResponse, Zonos - ### Community 612 - "2026-09-17-lv-bronte-gate.md" Cohesion: 0.05 Nodes (41): `[2026-09-16]` lv-hemingway corpus: half the work was EXCLUSION, and the gate found what a hand count would not, `[2026-09-16]` The lv-* voice line: Option C proved, lv-yarros shipped, lv-hemingway training, `[2026-09-16]` voices-seat: LoRA over merge, measured — and GPU 0 is now full, `[2026-09-17]` The beat-writing model restores the author's real names — a leak the corpus gate structurally cannot see, `[2026-09-17]` lv-bronte: corpus gated for real, adapter trained, SHIPPED with a FAILED voice axis on the record, ⚠ A DEFECT IN THE v2 RULE ITSELF, worth fixing before the next author, ⚠⚠ AMENDED 2026-09-17 — THE VOICE AXIS PASSES UNDER THE CORRECTED FLOOR RULE, Artefacts (+33 more) -### Community 613 - "type" -Cohesion: 0.50 -Nodes (4): type, enum, title, type - -### Community 614 - "gpu.py" -Cohesion: 0.42 -Nodes (8): _bus_id_by_index(), _cmdline(), gpu_status(), _query_compute_apps(), _query_devices(), GPU status for arbo's device-aware scheduler (GET /gpu-status). arbo steers a l, Return `{devices: [...], tts_on_3090: bool}`. Degrades to an error field on nvid, _run() - ### Community 620 - "althing — inter-agent message bus" Cohesion: 0.50 Nodes (3): althing — inter-agent message bus, Commands, Traps @@ -2466,16 +2449,8 @@ Nodes (3): load_text(), main(), Audit a stoplist for entries that are actually C Cohesion: 0.25 Nodes (8): _cli(), Regression: the branch ended with `[ "$n" -eq 0 ] && echo ...`, so it returned…, Regression: ids are 8 hex chars and roughly one in forty is all digits. Those…, test_cli_links_exits_zero_on_a_NON_empty_board(), test_cli_unlink_by_id_even_when_the_id_is_all_digits(), test_cli_unlink_by_index(), test_cli_unlink_of_a_stale_id_leaves_the_board_alone(), test_cli_unlink_rejects_a_non_id_non_index() -### Community 634 - "sanitize_tts_text" -Cohesion: 0.50 -Nodes (3): Language-safe text sanitizer for the OmniVoice TTS wrapper. Strips artifacts th, Return ``text`` cleaned of artifacts that shouldn't be spoken, language-safe., sanitize_tts_text() - -### Community 635 - "generate_pickup_id" -Cohesion: 0.50 -Nodes (4): generate_pickup_id(), A human-readable id like '4-wombat' or 'star-84'. `exists(name)->bool` gates…, test_generate_pickup_id_avoids_collision(), test_generate_pickup_id_format() - ## Knowledge Gaps -- **3019 isolated node(s):** `Current egress: ESH (2026-09-17)`, `Historical placement: NH3 rather than the colo`, `⚠ /healthz cannot tell you whether search works`, `Update`, `The MCP tool` (+3014 more) +- **3021 isolated node(s):** `⚠ YOU ARE `infra-ops` — the fleet operations agent`, `Persistent memory`, `Model quantization`, `Training runs`, `Purpose` (+3016 more) These have ≤1 connection - possible missing edges or undocumented components. - **154 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. @@ -2483,16 +2458,16 @@ Nodes (4): generate_pickup_id(), A human-readable id like '4-wombat' or 'star-84 _Questions this graph is uniquely positioned to answer:_ - **Why does `create_app()` connect `booth/app.py` to `FastAPI`, `test_booth.py`, `Path`?** + _High betweenness centrality (0.003) - this node is a cross-community bridge._ +- **Why does `main()` connect `abliterate.py` to `convert_hf_to_native.py`, `Path`?** _High betweenness centrality (0.002) - this node is a cross-community bridge._ -- **Why does `AskError` connect `test_asks.py` to `invocation.py`?** +- **Why does ``[2026-09-01]` pfi-gx10 (ASUS Ascent GX10) onboarded headless — and it is the intended new home for run 3c` connect ``[2026-09-01]` pfi-gx10 (ASUS Ascent GX10) onboarded headless — and it is the intended new home for run 3c` to `archival-memory.md`?** _High betweenness centrality (0.002) - this node is a cross-community bridge._ -- **Why does `[2026-08-15] Uncensored gen seat: Qwen3.8-27B-Uncensored deployed; the definitive MTP-graft fix` connect `[2026-08-15] Uncensored gen seat: Qwen3.8-27B-Uncensored deployed; the definitive MTP-graft fix` to `Archived 2026-08-02 — Recent decisions (archived)`, `archival-memory.md`, `Archived 2026-08-02 — Tried and abandoned (archived)`, `Recent decisions (archived 2026-08-03 batch)`?** - _High betweenness centrality (0.001) - this node is a cross-community bridge._ -- **What connects `Current egress: ESH (2026-09-17)`, `Historical placement: NH3 rather than the colo`, `⚠ /healthz cannot tell you whether search works` to the rest of the system?** - _3019 weakly-connected nodes found - possible documentation gaps or missing edges._ +- **What connects `⚠ YOU ARE `infra-ops` — the fleet operations agent`, `Persistent memory`, `Model quantization` to the rest of the system?** + _3021 weakly-connected nodes found - possible documentation gaps or missing edges._ - **Should `Status + Open Issues` be split into smaller, more focused modules?** _Cohesion score 0.05555555555555555 - nodes in this community are weakly interconnected._ - **Should `Fleet disaster-recovery runbook` be split into smaller, more focused modules?** _Cohesion score 0.06666666666666667 - nodes in this community are weakly interconnected._ - **Should `properties` be split into smaller, more focused modules?** - _Cohesion score 0.08695652173913043 - nodes in this community are weakly interconnected._ \ No newline at end of file + _Cohesion score 0.06896551724137931 - nodes in this community are weakly interconnected._ \ No newline at end of file diff --git a/playbooks/searxng-tierA-engines.yaml b/playbooks/searxng-tierA-engines.yaml index e700a47..1d006c2 100644 --- a/playbooks/searxng-tierA-engines.yaml +++ b/playbooks/searxng-tierA-engines.yaml @@ -1,32 +1,78 @@ # SearXNG Tier A captcha fix (2026-09-18): remove scraped engine families that -# CAPTCHA this egress (brave/duckduckgo/startpage), enable mojeek. -# File: /opt/docker/conf/searxng/searxng-settings.yml (bind-mounted ro into the -# container) -> restart required to take effect. Rerunnable. +# CAPTCHA this egress (brave/duckduckgo/startpage), wikidata 403'd too. +# +# ⚠ SUPERSEDED FOR THE SETTINGS FILE — read the scope of this note. +# The v4 design here assumed settings.yml could pull the Brave key via +# `!ENV SEARXNG_BRAVE_API_KEY`. This build has NO !ENV YAML constructor: that +# attempt made the file unparseable and crash-looped the container ten times +# with fleet search down. The key is now INLINE in the canonical settings file +# (operator decision, the key is low-value free-tier), and settings deployment +# goes through `scripts/deploy-stack.sh nh3-docker searxng --conf` like every +# other stack. Do NOT upload a settings file from here expecting !ENV to work. +# +# What is still worth keeping below: the `.env` merge step and the +# `up -d`-not-`restart` step, plus the two ⚠ notes recording real bugs this +# playbook hit (a wholesale .env overwrite that clobbered SEARXNG_SECRET, and a +# sed that inserted literal backslash-n into compose.yaml). +# +# Rerunnable. Pass the key at the CLI: --var brave_key=... (never store it here). vars: conf: /opt/docker/conf/searxng/searxng-settings.yml + compose_dir: /opt/docker/compose/searxng + brave_key: "" + searxng_secret: "" # from vault nh3-docker/searxng-secret, passed via --var steps: - name: Timestamped backup of current settings shell: cp {{ conf }} {{ conf }}.bak-$(date +%Y%m%d-%H%M%S) - # Only back up while this version of the change has not been applied yet. - when: "! grep -q 'Tier A (v3' {{ conf }}" + when: "! grep -q 'Tier A (v4' {{ conf }}" - name: Install new settings upload: src: /tmp/searxng-tierA/searxng-settings.yml dest: "{{ conf }}" mode: "0644" - when: "! grep -q 'Tier A (v3' {{ conf }}" + when: "! grep -q 'Tier A (v4' {{ conf }}" - - name: Restart searxng to pick up settings - shell: docker restart searxng + - name: Write .env with BOTH keys (a previous run clobbered SEARXNG_SECRET) + # ⚠ This dir already had a .env holding SEARXNG_SECRET; an earlier version + # of this step overwrote the file wholesale. Merge, never truncate. + sudo: true + shell: | + test -n '{{ brave_key }}' && test -n '{{ searxng_secret }}' && \ + printf 'SEARXNG_SECRET=%s\nSEARXNG_BRAVE_API_KEY=%s\n' '{{ searxng_secret }}' '{{ brave_key }}' | tee {{ compose_dir }}/.env >/dev/null && \ + chown infra-ops:docker {{ compose_dir }}/.env && chmod 600 {{ compose_dir }}/.env + # Skip only when .env already holds both keys (values are stable; to force + # a rewrite, delete the file). + when: "grep -q SEARXNG_SECRET {{ compose_dir }}/.env 2>/dev/null && grep -q SEARXNG_BRAVE_API_KEY {{ compose_dir }}/.env && exit 1 || exit 0" + + - name: Ensure compose references the key (undo bad sed, then append cleanly) + # ⚠ `sed 's/$/\\n.../'` inserted LITERAL backslash-n text, not a newline — + # compose then parsed one env entry. awk-append instead. + sudo: true + shell: | + sed -i 's|\\n - SEARXNG_BRAVE_API_KEY=${SEARXNG_BRAVE_API_KEY}||' {{ compose_dir }}/compose.yaml + grep -q SEARXNG_BRAVE_API_KEY {{ compose_dir }}/compose.yaml || \ + awk '{print} /SEARXNG_SECRET/ {print " - SEARXNG_BRAVE_API_KEY=${SEARXNG_BRAVE_API_KEY}"}' {{ compose_dir }}/compose.yaml > {{ compose_dir }}/.c.new && mv {{ compose_dir }}/.c.new {{ compose_dir }}/compose.yaml + when: "! grep -q 'SEARXNG_SECRET=${SEARXNG_SECRET}$' {{ compose_dir }}/compose.yaml || ! grep -q SEARXNG_BRAVE_API_KEY {{ compose_dir }}/compose.yaml" + + - name: Recreate container (env changes need up -d, not restart) + shell: cd {{ compose_dir }} && docker compose up -d verify: - name: New config in place - shell: grep -q 'Tier A (v3' {{ conf }} + shell: grep -q 'Tier A (v4' {{ conf }} changed_when: "false" - - name: Container serving /healthz after restart + - name: Compose references the key + shell: grep -q SEARXNG_BRAVE_API_KEY {{ compose_dir }}/compose.yaml + changed_when: "false" + + - name: Key is in the container env + shell: docker exec searxng printenv SEARXNG_BRAVE_API_KEY >/dev/null + changed_when: "false" + + - name: Container serving /healthz after recreate shell: sleep 8; curl -sf http://127.0.0.1:9996/healthz changed_when: "false" diff --git a/stacks/searxng/compose.yaml b/stacks/searxng/compose.yaml index 9902995..f7371a2 100644 --- a/stacks/searxng/compose.yaml +++ b/stacks/searxng/compose.yaml @@ -16,6 +16,16 @@ services: - /opt/docker/conf/searxng/searxng-settings.yml:/etc/searxng/settings.yml:ro environment: - SEARXNG_SECRET=${SEARXNG_SECRET} + # Brave Search API key (vault: nh3-docker/searxng-brave-api-key). + # ⚠ NOTHING READS THIS. 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 crash-looped the container ten times with + # search down fleet-wide. The loader reads only SEARXNG_SETTINGS_PATH and + # the entrypoint substitutes only `ultrasecretkey`. The key is therefore + # inline in searxng-settings.yml by operator decision. Kept here, unused, + # so it is ready if upstream ever gains env interpolation — remove it + # rather than believing the comment it replaced. + - SEARXNG_BRAVE_API_KEY=${SEARXNG_BRAVE_API_KEY} - BASE_URL=http://10.100.50.40:9996/ - INSTANCE_NAME=SearXNG deploy: