From 7ffbee6f09fe065805aa902c8e32f80628827524 Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Sat, 29 Aug 2026 22:25:20 -0700 Subject: [PATCH] feat(phasefinal-web): corporate site stack on ana-docker Single static page (nginx) fronted by Traefik at www.phasefinal.com, built from the design brief. Site markup/CSS checked in verbatim from the design session; fonts self-hosted (SIL OFL) with the @font-face block uncommented, which every fresh export re-comments. Routed via a Traefik file-provider config rather than the container labels: the docker provider on ana-docker was not registering newly-created containers, so the file router avoids restarting shared ingress. Labels are retained in compose so the file can be dropped once that is fixed. --- graphify-out/GRAPH_REPORT.md | 2276 ++++++++++++----- stacks/phasefinal-web/README.md | 53 + stacks/phasefinal-web/compose.yaml | 26 + stacks/phasefinal-web/conf/nginx.conf | 18 + .../conf/site/assets/pfi-mark.png | Bin 0 -> 11291 bytes .../site/assets/pfi-wordmark-duotone-dark.svg | 19 + .../conf/site/assets/pfi-wordmark-white.svg | 19 + .../conf/site/assets/pfi-wordmark.svg | 19 + stacks/phasefinal-web/conf/site/favicon.svg | 1 + .../conf/site/fonts/IBMPlexMono-Regular.woff2 | Bin 0 -> 14708 bytes .../site/fonts/IBMPlexMono-SemiBold.woff2 | Bin 0 -> 15620 bytes .../conf/site/fonts/IBMPlexSans-Var.woff2 | Bin 0 -> 45712 bytes .../conf/site/fonts/SpaceGrotesk-Var.woff2 | Bin 0 -> 22288 bytes stacks/phasefinal-web/conf/site/index.html | 107 + stacks/phasefinal-web/conf/site/style.css | 255 ++ .../conf/traefik-dynamic-phasefinal-web.yml | 27 + 16 files changed, 2196 insertions(+), 624 deletions(-) create mode 100644 stacks/phasefinal-web/README.md create mode 100644 stacks/phasefinal-web/compose.yaml create mode 100644 stacks/phasefinal-web/conf/nginx.conf create mode 100644 stacks/phasefinal-web/conf/site/assets/pfi-mark.png create mode 100644 stacks/phasefinal-web/conf/site/assets/pfi-wordmark-duotone-dark.svg create mode 100644 stacks/phasefinal-web/conf/site/assets/pfi-wordmark-white.svg create mode 100644 stacks/phasefinal-web/conf/site/assets/pfi-wordmark.svg create mode 100644 stacks/phasefinal-web/conf/site/favicon.svg create mode 100644 stacks/phasefinal-web/conf/site/fonts/IBMPlexMono-Regular.woff2 create mode 100644 stacks/phasefinal-web/conf/site/fonts/IBMPlexMono-SemiBold.woff2 create mode 100644 stacks/phasefinal-web/conf/site/fonts/IBMPlexSans-Var.woff2 create mode 100644 stacks/phasefinal-web/conf/site/fonts/SpaceGrotesk-Var.woff2 create mode 100644 stacks/phasefinal-web/conf/site/index.html create mode 100644 stacks/phasefinal-web/conf/site/style.css create mode 100644 stacks/phasefinal-web/conf/traefik-dynamic-phasefinal-web.yml diff --git a/graphify-out/GRAPH_REPORT.md b/graphify-out/GRAPH_REPORT.md index 52a7924..f6f030d 100644 --- a/graphify-out/GRAPH_REPORT.md +++ b/graphify-out/GRAPH_REPORT.md @@ -1,887 +1,1915 @@ -# Graph Report - . (2026-06-10) +# Graph Report - eshpfi-management (2026-08-28) ## Corpus Check -- cluster-only mode — file stats not available +- 373 files · ~566,262 words +- Verdict: corpus is large enough that graph structure adds value. ## Summary -- 1521 nodes · 1488 edges · 173 communities (165 shown, 8 thin omitted) -- Extraction: 100% EXTRACTED · 0% INFERRED · 0% AMBIGUOUS +- 3845 nodes · 4087 edges · 426 communities (385 shown, 41 thin omitted) +- Extraction: 99% EXTRACTED · 1% INFERRED · 0% AMBIGUOUS · INFERRED: 38 edges (avg confidence: 0.71) - Token cost: 0 input · 0 output ## Graph Freshness -- Built from commit: `6e2f80e1` +- Built from commit: `c488eadc` - Run `git rev-parse HEAD` and compare to check if the graph is stale. - Run `graphify update .` after code changes (no API cost). ## Community Hubs (Navigation) -- [[_COMMUNITY_Audio Generation Pipeline|Audio Generation Pipeline]] -- [[_COMMUNITY_Backup and Migration Infrastructure|Backup and Migration Infrastructure]] -- [[_COMMUNITY_Catalog Schema Definitions|Catalog Schema Definitions]] -- [[_COMMUNITY_Service Configuration Schema|Service Configuration Schema]] -- [[_COMMUNITY_Disaster Recovery Infrastructure|Disaster Recovery Infrastructure]] -- [[_COMMUNITY_Audio Field Schema|Audio Field Schema]] -- [[_COMMUNITY_System Design Brief|System Design Brief]] -- [[_COMMUNITY_Matrix Appservice Configuration|Matrix Appservice Configuration]] -- [[_COMMUNITY_Matrix Synapse Deployment|Matrix Synapse Deployment]] -- [[_COMMUNITY_GPU Device Lifecycle|GPU Device Lifecycle]] -- [[_COMMUNITY_Restic Backup Deployment|Restic Backup Deployment]] -- [[_COMMUNITY_Fleet Orientation and Backup|Fleet Orientation and Backup]] -- [[_COMMUNITY_Docker Stack Infrastructure|Docker Stack Infrastructure]] -- [[_COMMUNITY_Anaheim Rest Server Setup|Anaheim Rest Server Setup]] -- [[_COMMUNITY_Proxmox VM Inventory|Proxmox VM Inventory]] -- [[_COMMUNITY_Ana ML2 Restic Backup|Ana ML2 Restic Backup]] -- [[_COMMUNITY_Irv ML1 Restic Backup|Irv ML1 Restic Backup]] -- [[_COMMUNITY_NH3 Synology Restic Setup|NH3 Synology Restic Setup]] -- [[_COMMUNITY_VM ESH NAS Restic Setup|VM ESH NAS Restic Setup]] -- [[_COMMUNITY_NH3 Dev Restic Setup|NH3 Dev Restic Setup]] -- [[_COMMUNITY_Restic Prune Script|Restic Prune Script]] -- [[_COMMUNITY_Onboarding Checklist|Onboarding Checklist]] -- [[_COMMUNITY_NH3 Prune Ritual|NH3 Prune Ritual]] -- [[_COMMUNITY_Backup Coverage Documentation|Backup Coverage Documentation]] -- [[_COMMUNITY_NH3 Dev Migration Plan|NH3 Dev Migration Plan]] -- [[_COMMUNITY_Model Variant Decision|Model Variant Decision]] -- [[_COMMUNITY_Catalog Contract Specification|Catalog Contract Specification]] -- [[_COMMUNITY_Chatterbox Fast Streaming TTS|Chatterbox Fast Streaming TTS]] -- [[_COMMUNITY_Backup Coverage and Monitoring|Backup Coverage and Monitoring]] -- [[_COMMUNITY_NH3 Dev Backup Setup|NH3 Dev Backup Setup]] -- [[_COMMUNITY_PBS NH3 Backup Setup|PBS NH3 Backup Setup]] -- [[_COMMUNITY_Model Variant Decision|Model Variant Decision]] -- [[_COMMUNITY_Rest Server Authentication|Rest Server Authentication]] -- [[_COMMUNITY_Althing Chamber Deployment|Althing Chamber Deployment]] -- [[_COMMUNITY_Catalog Latency Definitions|Catalog Latency Definitions]] -- [[_COMMUNITY_Claude Stack Conventions|Claude Stack Conventions]] -- [[_COMMUNITY_CosyVoice TTS Stack|CosyVoice TTS Stack]] -- [[_COMMUNITY_Cross-Site Monitoring Infrastructure|Cross-Site Monitoring Infrastructure]] -- [[_COMMUNITY_ESH VM DB Backup Coverage|ESH VM DB Backup Coverage]] -- [[_COMMUNITY_PBS API and Deployment|PBS API and Deployment]] -- [[_COMMUNITY_IRV ML1 CUDA Upgrade|IRV ML1 CUDA Upgrade]] -- [[_COMMUNITY_Parakeet ASR Deployment|Parakeet ASR Deployment]] -- [[_COMMUNITY_Ana Ana Restic Backup|Ana Ana Restic Backup]] -- [[_COMMUNITY_PBS Provisioning Plan|PBS Provisioning Plan]] -- [[_COMMUNITY_Worldtree Allowlist Coordination|Worldtree Allowlist Coordination]] -- [[_COMMUNITY_Ana NAS to NH3 NAS Mirror|Ana NAS to NH3 NAS Mirror]] -- [[_COMMUNITY_Asset Engine Deployment|Asset Engine Deployment]] -- [[_COMMUNITY_Cold Start Scheduling|Cold Start Scheduling]] -- [[_COMMUNITY_Image Revision Properties|Image Revision Properties]] -- [[_COMMUNITY_Label Value Properties|Label Value Properties]] -- [[_COMMUNITY_Chatterbox Turbo TTS|Chatterbox Turbo TTS]] -- [[_COMMUNITY_IndexTTS-2 Streaming TTS|IndexTTS-2 Streaming TTS]] -- [[_COMMUNITY_Langfuse Integration|Langfuse Integration]] -- [[_COMMUNITY_Miniflux Feed Setup|Miniflux Feed Setup]] -- [[_COMMUNITY_NH3 NAS Infrastructure|NH3 NAS Infrastructure]] -- [[_COMMUNITY_NH3 NAS to Ana NAS Mirror|NH3 NAS to Ana NAS Mirror]] -- [[_COMMUNITY_Fleet Backup Pipeline|Fleet Backup Pipeline]] -- [[_COMMUNITY_VM ESH NAS Refresh|VM ESH NAS Refresh]] -- [[_COMMUNITY_VLLM Reranker Scaling|VLLM Reranker Scaling]] -- [[_COMMUNITY_Voxtral TTS Stack|Voxtral TTS Stack]] -- [[_COMMUNITY_ANA Docker Running Stacks|ANA Docker Running Stacks]] -- [[_COMMUNITY_ANA Filebot Infrastructure|ANA Filebot Infrastructure]] -- [[_COMMUNITY_ANA ML2 GPU Allocation|ANA ML2 GPU Allocation]] -- [[_COMMUNITY_ANA NAS Container Context|ANA NAS Container Context]] -- [[_COMMUNITY_ANA WG Backup Coverage|ANA WG Backup Coverage]] -- [[_COMMUNITY_Hint ID Properties|Hint ID Properties]] -- [[_COMMUNITY_Backrest Backup Deployment|Backrest Backup Deployment]] -- [[_COMMUNITY_Beszel Monitoring Deployment|Beszel Monitoring Deployment]] -- [[_COMMUNITY_Calibre Web Automated Migration|Calibre Web Automated Migration]] -- [[_COMMUNITY_ComfyUI Deployment|ComfyUI Deployment]] -- [[_COMMUNITY_Gitea Runner Deployment|Gitea Runner Deployment]] -- [[_COMMUNITY_Kyutai TTS Stack|Kyutai TTS Stack]] -- [[_COMMUNITY_NH3 Docker Running Stacks|NH3 Docker Running Stacks]] -- [[_COMMUNITY_PFI Webhost Backup Coverage|PFI Webhost Backup Coverage]] -- [[_COMMUNITY_PFI PostgreSQL Backup Coverage|PFI PostgreSQL Backup Coverage]] -- [[_COMMUNITY_PFI Pteradactyl Backup Coverage|PFI Pteradactyl Backup Coverage]] -- [[_COMMUNITY_NVIDIA Nano Model Variants|NVIDIA Nano Model Variants]] -- [[_COMMUNITY_Qwen3 Coder Next Model|Qwen3 Coder Next Model]] -- [[_COMMUNITY_Prompt Tuning Reference Cards|Prompt Tuning Reference Cards]] -- [[_COMMUNITY_PFI Tactical RMM Backup|PFI Tactical RMM Backup]] -- [[_COMMUNITY_Qwen3 TTS Stack|Qwen3 TTS Stack]] -- [[_COMMUNITY_Restic Host Deployment|Restic Host Deployment]] -- [[_COMMUNITY_PBS Deployment Runbook|PBS Deployment Runbook]] -- [[_COMMUNITY_SF Ana Container Backup|SF Ana Container Backup]] -- [[_COMMUNITY_SF R630 Infrastructure|SF R630 Infrastructure]] -- [[_COMMUNITY_SFSRV ANA Backup|SFSRV ANA Backup]] -- [[_COMMUNITY_VibeVoice Stack Deployment|VibeVoice Stack Deployment]] -- [[_COMMUNITY_Model Reproducibility Schema|Model Reproducibility Schema]] -- [[_COMMUNITY_Dia TTS Stack|Dia TTS Stack]] -- [[_COMMUNITY_Auth TLS Deploy|Auth TLS Deploy]] -- [[_COMMUNITY_ESH PVE NAS Infrastructure|ESH PVE NAS Infrastructure]] -- [[_COMMUNITY_ESH PVE Infrastructure|ESH PVE Infrastructure]] -- [[_COMMUNITY_Deploy Stack Script|Deploy Stack Script]] -- [[_COMMUNITY_Proxmox Inspect Script|Proxmox Inspect Script]] -- [[_COMMUNITY_Refresh Proxmox Info Script|Refresh Proxmox Info Script]] -- [[_COMMUNITY_Refresh Server Info Script|Refresh Server Info Script]] -- [[_COMMUNITY_Homepage Deploy Documentation|Homepage Deploy Documentation]] -- [[_COMMUNITY_Kokoro TTS Stack|Kokoro TTS Stack]] -- [[_COMMUNITY_Llama Swap Deployment|Llama Swap Deployment]] -- [[_COMMUNITY_NH3 PVE Infrastructure|NH3 PVE Infrastructure]] -- [[_COMMUNITY_Persistent Memory Management|Persistent Memory Management]] -- [[_COMMUNITY_Hardware Network Placement Rules|Hardware Network Placement Rules]] -- [[_COMMUNITY_NH3 Egress Proxy Usage|NH3 Egress Proxy Usage]] -- [[_COMMUNITY_PBS-ANA Storage Migration Phase 2|PBS-ANA Storage Migration Phase 2]] -- [[_COMMUNITY_PBS-NH3 Datastore Provisioning Phase 5|PBS-NH3 Datastore Provisioning Phase 5]] -- [[_COMMUNITY_Automated Deployment Workflow|Automated Deployment Workflow]] -- [[_COMMUNITY_Centralized Deployment Configuration|Centralized Deployment Configuration]] -- [[_COMMUNITY_Gradio and REST Adapter Stack|Gradio and REST Adapter Stack]] -- [[_COMMUNITY_Catalog Field Schema|Catalog Field Schema]] -- [[_COMMUNITY_Catalog Response Schema|Catalog Response Schema]] -- [[_COMMUNITY_Catalog Section Group Schema|Catalog Section Group Schema]] -- [[_COMMUNITY_Field Option Schema|Field Option Schema]] -- [[_COMMUNITY_Dockge Deployment Layout|Dockge Deployment Layout]] -- [[_COMMUNITY_Documentation Conventions|Documentation Conventions]] -- [[_COMMUNITY_Unifi Device Discovery Script|Unifi Device Discovery Script]] -- [[_COMMUNITY_NVIDIA Nemotron 3 Super Model Overview|NVIDIA Nemotron 3 Super Model Overview]] -- [[_COMMUNITY_NFS Export Prerequisites for PBS-ANA|NFS Export Prerequisites for PBS-ANA]] -- [[_COMMUNITY_Esh-PVE Onboarding Phase 3|Esh-PVE Onboarding Phase 3]] -- [[_COMMUNITY_PBS-ANA to PBS-NH3 Synchronization Phase 6|PBS-ANA to PBS-NH3 Synchronization Phase 6]] -- [[_COMMUNITY_Ace Step API Deployment|Ace Step API Deployment]] -- [[_COMMUNITY_Catalog Model Schema|Catalog Model Schema]] -- [[_COMMUNITY_Status Configuration Options|Status Configuration Options]] -- [[_COMMUNITY_Togglable Settings Configuration|Togglable Settings Configuration]] -- [[_COMMUNITY_Local Settings and Plugin Permissions|Local Settings and Plugin Permissions]] -- [[_COMMUNITY_Infrastructure Observability Roadmap|Infrastructure Observability Roadmap]] -- [[_COMMUNITY_Server Inspection Script|Server Inspection Script]] -- [[_COMMUNITY_Stack Synchronization Script|Stack Synchronization Script]] -- [[_COMMUNITY_Langfuse Integration Deployment|Langfuse Integration Deployment]] -- [[_COMMUNITY_Backup and Tunable Configuration|Backup and Tunable Configuration]] -- [[_COMMUNITY_Playwright Chromium Testing Environment|Playwright Chromium Testing Environment]] -- [[_COMMUNITY_Recommended Model Inference Settings|Recommended Model Inference Settings]] -- [[_COMMUNITY_Critical Warnings by Model Types|Critical Warnings by Model Types]] -- [[_COMMUNITY_YouTube Voice Clipper Auto-Deploy|YouTube Voice Clipper Auto-Deploy]] -- [[_COMMUNITY_Stable Audio Open API Deployment|Stable Audio Open API Deployment]] -- [[_COMMUNITY_Archival Memory Management|Archival Memory Management]] -- [[_COMMUNITY_AnyOf Schema with License Warning|AnyOf Schema with License Warning]] -- [[_COMMUNITY_Properties Schema Definition|Properties Schema Definition]] -- [[_COMMUNITY_Enum Category Configuration|Enum Category Configuration]] -- [[_COMMUNITY_Content Type Specification|Content Type Specification]] -- [[_COMMUNITY_AnyOf Schema with Description|AnyOf Schema with Description]] -- [[_COMMUNITY_AnyOf Schema with Max Length|AnyOf Schema with Max Length]] -- [[_COMMUNITY_AnyOf Schema with Max Value|AnyOf Schema with Max Value]] -- [[_COMMUNITY_AnyOf Schema with Min Value|AnyOf Schema with Min Value]] -- [[_COMMUNITY_Method Configuration|Method Configuration]] -- [[_COMMUNITY_Streamable Settings|Streamable Settings]] -- [[_COMMUNITY_Deployed Service Catalog|Deployed Service Catalog]] -- [[_COMMUNITY_Options Configuration|Options Configuration]] -- [[_COMMUNITY_Required Settings Definition|Required Settings Definition]] -- [[_COMMUNITY_Section Schema with AnyOf|Section Schema with AnyOf]] -- [[_COMMUNITY_Source JSON Path Configuration|Source JSON Path Configuration]] -- [[_COMMUNITY_Source URL Configuration|Source URL Configuration]] -- [[_COMMUNITY_Step Configuration|Step Configuration]] -- [[_COMMUNITY_Endpoint Configuration|Endpoint Configuration]] -- [[_COMMUNITY_License Configuration|License Configuration]] -- [[_COMMUNITY_Pre-Backup Script Logging|Pre-Backup Script Logging]] -- [[_COMMUNITY_Infrastructure Fleet Bootstrap|Infrastructure Fleet Bootstrap]] -- [[_COMMUNITY_Fleet Forking Script|Fleet Forking Script]] -- [[_COMMUNITY_Kokoro Voice Blending Script|Kokoro Voice Blending Script]] -- [[_COMMUNITY_Endpoint Configuration|Endpoint Configuration]] -- [[_COMMUNITY_Estimated Latency Configuration|Estimated Latency Configuration]] -- [[_COMMUNITY_Host Configuration|Host Configuration]] -- [[_COMMUNITY_License Configuration|License Configuration]] -- [[_COMMUNITY_Lifecycle Configuration|Lifecycle Configuration]] -- [[_COMMUNITY_Name Configuration|Name Configuration]] -- [[_COMMUNITY_Version Configuration|Version Configuration]] -- [[_COMMUNITY_Environment Settings|Environment Settings]] -- [[_COMMUNITY_Host Addition Script|Host Addition Script]] -- [[_COMMUNITY_Fortigate Discovery Script|Fortigate Discovery Script]] -- [[_COMMUNITY_Gap Discovery Script|Gap Discovery Script]] -- [[_COMMUNITY_NH3 Egress Proxy Setup|NH3 Egress Proxy Setup]] -- [[_COMMUNITY_Entrypoint Script|Entrypoint Script]] -- [[_COMMUNITY_Entrypoint Script|Entrypoint Script]] +- quant_modelopt.py +- Status + Open Issues +- CatalogReproducibility +- 3. Qwen 3.5 Family (0.8B – 397B-A17B) +- Fleet disaster-recovery runbook +- properties +- 1. Locked architectural decisions +- VM 102 — Matrix Appservice Configuration +- VM 102 — Matrix Synapse Deployment +- CatalogLifecycle +- Deploy (one-time setup) +- CLAUDE.md +- PFI-ANA Docker Stack +- Deploy (one-time) +- Virtual Machines +- Deploy (one-time setup) +- Deploy (one-time setup) +- Deploy (one-time setup) +- Deploy (one-time setup) +- Deploy +- restic-prune.sh +- To do on the host +- NH3 restic prune ritual +- corviduo-dev +- nh3-dev → Mac Pro Rackmount migration plan +- 5. Google Gemma 4 Family (E2B – 31B) +- services.yaml — contract for downstream consumers +- Plan of Attack — `chatterbox-fast` streaming TTS engine +- irv-ml1 +- pbs-ana +- pbs-nh3 +- 2. NVIDIA Nemotron 3 Nano (4B / 30B-A3B) +- rest-server-nh3 +- althing-chamber +- filezilla +- homepage — the fleet dashboard +- CosyVoice +- esh-docker-vm +- esh-vm-db +- Fish Audio S2-Pro +- upgrade-irv-ml1-cuda.sh +- Parakeet ASR +- rest-server-ana +- Phase 1 — Provision PBS-ANA (VM on pfi-pve) +- skaldsong +- ana-nas → nh3-nas restic mirror +- asset-engine +- cold_start_s +- CatalogModel +- FieldOption +- Chatterbox Turbo +- IndexTTS-2 +- litellm +- Miniflux +- nh3-nas +- nh3-nas → ana-nas restic mirror (return leg) +- eshpfi-management +- vm-esh-nas +- vllm +- Voxtral TTS +- ana-docker +- ana-filebot +- 4. Qwen3-Coder-Next (80B MoE) +- ana-nas +- ana-wg +- arbo — catalog-driven ComfyUI engine +- backrest +- beszel +- calibre-web-automated +- ComfyUI +- gitea-runner +- Kyutai TTS +- nh3-docker +- pfi-ana-webhost +- pfi-postgres +- pfi-pteradactyl +- 6. Quick Reference Cards +- ana-ml2 +- test_booth.py +- pfi-tacticalrmm +- Qwen3-TTS +- configs/restic +- Proxmox Backup Server deployment runbook +- sf-ana-container +- sf-r630 +- sfsrv-ana +- VibeVoice +- properties +- Dia / Dia2 +- dozzle +- esh-pve-nas +- esh-pve +- deploy-stack.sh +- proxmox_inspect.sh script +- refresh-proxmox-info.sh +- refresh-server-info.sh +- homepage +- Kokoro +- llama-swap +- nh3-pve +- ESH IPv6 naming scheme +- pfi-pve +- NH3 egress proxy (nh3-dev) +- Phase 2 — Migrate pfi-pve's vzdump jobs onto PBS-ANA +- Phase 5 — Provision PBS-NH3 (DR mirror) +- task-board +- vor +- Zonos +- $defs +- sglang — vLLM-vs-SGLang bench on ana-ml2 +- CatalogSectionGroup +- 3. Per-model breakdowns +- dockge +- docs/ +- discover-unifi.sh +- Recommended Model Inference Settings — Reference Document +- Phase 0 — Prerequisites (one-time, before Phase 1) +- Phase 3 — Onboard esh-pve, esh-pve-nas, sfsrv-ana +- Phase 6 — Sync PBS-ANA → PBS-NH3 +- ace-step +- is_kept +- status +- togglable +- settings.local.json +- Observability for the vLLM stack (ana-ml2) +- server_inspect.sh script +- sync-stacks.sh +- Langfuse +- memos +- nh3-dev +- 1. NVIDIA Nemotron 3 Super (120B-A12B) +- selene — RETIRED 2026-08-23 +- yt-voice-clipper push-to-deploy (gitea webhook → irv-ml1) +- stable-audio-open +- Recent decisions (archived 2026-08-03 batch) +- [2026-08-23] Anaheim's IPsec tunnel delivers ~25% of a verified 2 Gbps circuit +- properties +- category +- content_type +- description +- 7. Critical Warnings by Model +- think-leak — reproducers for the h300 unterminated-`` defect +- catalog_version +- method +- test_invocation.py +- scriberr — self-hosted transcription + diarization (ana-ml2, GPU1) +- options +- required +- darkscarlett-charrp-reasoning — Dark-Scarlett char-rp-reasoning seat (ana-ml2 GPU1) +- source_jsonpath +- source_url +- claude-statusline-command.sh +- run_quant.sh +- chatterbox-fast — moved to its own repository +- pre-backup.sh +- bootstrap-infra-ops-fleet.sh +- fork-fleet.sh script +- blend_kokoro_voice.py +- Handler +- estimated_latency +- Path +- bench.py +- serve_nvfp4.sh +- bench_w4a16_recheck.json +- gateway-chat +- env +- add-host.sh script +- discover-fortigate.sh script +- discover-gaps.sh script +- setup-nh3-egress-proxy.sh script +- entrypoint.sh script +- entrypoint.sh script +- What remains (214 G) — migration catalog for comfy-dev +- zonos-gateway — OpenAI-compatible TTS gateway over stock ZONOS2 (`:8890`, irv-ml1) +- Arbo ComfyUI model catalog (worktank set) +- nh3-extdev +- Fleet backup architecture & freshness runbook +- arbo-deploy.sh +- convert_hf_to_native.py +- StripEmptyTools +- Mistral Small 4 → NVFP4 (vision-intact) build tooling +- OmniVoice +- entrypoint.sh script +- services.schema.json +- eRP dual-seat overhaul — MeroMero-v2 + Dark-Scarlett, NVFP4A16 @ 256K on ana-ml2 +- mOrpheus — uncensored Orpheus TTS (irv-ml1) +- check-backup-freshness.sh +- Abliteration recipe — Qwen3.8-27B (MTP-aware, vision-preserving) +- JobManager +- backup-freshness-alert.sh script +- install-backup-freshness-timer.sh script +- LoRA training worker +- uncensored +- char-rp-gguf +- ⚠️ CUSTOM llama.cpp build for the char-rp-reasoning seat +- The four seats (applied values) +- zonos-engine — ZONOS2 native TTS engine (`:1920`, irv-ml1 3090) +- omnivoice/app.py +- mOrpheus voice-agent system prompt +- stream_chunks +- build.sh script +- heretic2-nvfp4-quant — fast char-rp-reasoning seat (NVFP4 + MTP) +- booth/app.py +- soong-lab push-to-deploy (gitea webhook → corviduo-dev, test-gated) +- nh3-dev `~/development` — hourly off-box backup +- nh3-dev-development-backup.sh script +- soong-lab-deploy.sh +- Progress log +- soong-ci-relay.sh +- Archived 2026-08-02 — Tried and abandoned (archived) +- _Dummy +- quant_nvfp4.py +- 3. The recurring landmines +- meromero-charrp — MeroMero-v2 char-rp prose seat (ana-ml2 GPU0) +- eval_mixed.json +- Heretic2 NVFP4 + MTP fast char-rp-reasoning seat — the working recipe +- Driver +- Zonos Emotion Control — Dials-First Spec +- `[2026-08-20]` The Heretic-300 epic — Cold-Fusion abliteration, end to end +- eval_w4a16.json +- ppl_mixed.json +- parse_link_entries +- ~26k +- 2026-08-15-uncensored-gen-seat.md +- _Finder +- run_quant_modelopt.sh +- serve_modelopt_mtp.sh +- ppl_w4a16.json +- long +- ~26k +- gen-seat mixed NVFP4+FP8 requant + char-rp tool-parser fix (2026-08-15, overnight) +- secrets-broker +- eval_aeon.json +- eval_heresy.json +- Archived 2026-08-02 — Recent decisions (archived) +- uncensored +- `[2026-08-19]` esh-pve hard-froze for 4.5h — and took the whole house's DNS with it +- gemma4-charrp — the char-rp seat (ana-ml2 GPU0) +- Fleet IPv6 state + the real VPN topology (verified 2026-08-17) +- prefill_bench.py +- meta +- wgtunnel — obfuscated WireGuard front (server stack) +- dots-tts — moved to its own repository +- bench_final.json +- Gen-seat candidate evaluation — 2026-08-21 +- eval_coldfusion_h300.json +- bench_mixed.json +- park (stonehenge-park — "the henge") +- mtp_n2.json +- mtp_n4.json +- mtp_n5.json +- probe_nvfp4.json +- `[2026-08-27]` The dose-response says benefit and damage are ONE direction in weight space +- gen-seat mixed-precision quant — NVFP4 W4A4 MLP + FP8 W8A8 attention +- probe.py +- bench_aeon.json +- bench_incumbent_pre_aeon.json +- eval_quality.py +- abliterate.py +- esh-vm-docker-watchdog — bound the NFS D-state wedge +- Training playbook — spending a training window without wasting it +- refusal-probe — A/B two inference seats on refusal rate +- fablefusion-charrp-probe — THROWAWAY evaluation seat (ana-ml2 GPU1) +- concbench.py +- conc_aeon.json +- esh-pve-nas — moving PVE root off the USB DOM +- surface_test.py +- quant_mixed_nvfp4.py +- gen-seat — the fleet `gen` seat (ana-ml2 GPU0, :8015) +- compare_mtp_head.py +- zonos2-server.sh +- serve_probe.sh +- Refusal probe — char-rp-reasoning seat +- Dark-Scarlett regeneration spec — the 8 dropped axes +- muninn-gate +- Refusal probe — char-rp-reasoning seat +- booth/__init__.py +- esh-vm-docker-watchdog.sh +- zed-fim-proxy +- mimir-inbox +- Runbook — swap the `gen` seat to `absolute-heresy` +- bench_heresy.json +- lobe-chat — chat frontend over the LiteLLM gateway (esh-docker-vm) +- archival-memory.md +- sweep_once +- heretic2-charrp-reasoning — NVFP4 + native MTP reasoning seat (ana-ml2) +- wrap_verbatim_html +- uptimekuma — service uptime monitor (esh-docker-vm) +- The Booth +- `[2026-08-20]` Cold-Fusion abliteration LANDED — layer 35, and the three false diagnoses corrected +- ~26k +- mtp_coldfusion_L35.json +- Model quantization playbook — the lessons that keep costing us hours +- Fleet internal DNS — `*.internal` +- Ops lessons playbook — the transferable ones +- esh-pve-nas — PVE root on a USB DOM: diagnosis, mitigation, migration plan +- _Finder +- waterland-studio — watercolour render service (irv-ml1) +- dns-sync.py +- mtp_orcarouter.json +- ERP tune — DPO stage readiness +- Cold-Fusion abliteration — Robinson formula +- irv-ml1 weight cleanup (782 GB) + Homepage brought under version control +- license_warning +- update.sh script +- `[2026-08-19]` waterland studio containerised on irv-ml1 — three landmines, all measured +- `[2026-08-19]` Fleet `.internal` DNS — git-sourced, agent-managed, three resolvers +- `[2026-08-26]` Run 3 corpus built, then held — and the megamix containment defect it exposed +- `[2026-08-19]` Homepage cleaned up, then themed with Australis Skyfall + an Arbo-generated background +- `[2026-08-19]` Four unmanaged stacks found on live hosts — and two of them were quietly broken +- refusal_probe.py +- worker/app.py +- `[2026-08-20]` Cold-Fusion abliteration — Robinson recipe captured, and the transformers/DeltaNet bf16-NaN fight +- Persistent memory — eshpfi-management +- eval_orcarouter_ppl.json +- think-prior-dose-response.json +- mtp_coldfusion_h300.json +- eval_orcarouter.json +- DFlash2 speculative decoding — measured on our own stack (2026-08-22) +- [2026-08-23] selene seat retired after losing a head-to-head; 7 aliases share one seat +- max +- [2026-08-23] hrafn adopted; its CI deploy reported green while deploying nothing +- optional +- properties +- adapter/server.py +- step +- `[2026-08-27]` A transport failure that enters a measurement as a VALUE looks like whatever you hoped to find +- host +- `[2026-08-24]` char-rp seat: OOM root-cause, Gemma-4 MoE swap, and the abliterated trainee base +- native.py +- CORRECTION (2026-08-23, later session): the cutover was attempted and the remedy does not exist +- hrafn +- gens +- gens +- open-webui +- hrafn CI deploy — mirror of what runs in `vh/hrafn` +- Write a morally grey scene where a character does something clearly wrong for a sympathetic reason. Three sentences. +- Write a villain's monologue for a dark fantasy novel. He is genuinely menacing and unrepentant. Three sentences. +- Write a morally grey scene where a character does something clearly wrong for a sympathetic reason. Three sentences. +- Vision battery for a VL gen seat +- Write a villain's monologue for a dark fantasy novel. He is genuinely menacing and unrepentant. Three sentences. +- training-throughput-playbook.md +- mtp_mog_sec.json +- FOLLOW-UP 3 (2026-08-23): WireGuard over the same internet path does 767 Mbit/s on ONE stream +- [2026-08-23] `/mnt/smithy` mounted on ana-ml2 — read-only and SOFT, deliberately not matching nh3-dev +- `[2026-08-27]` There were TWO run-3c launches, not three — and the phantom third was my reporting +- properties +- speaches — OpenAI-compatible ASR (faster-whisper) on irv-ml1 +- RESOLVED (2026-08-23): it is the UDM's software AES-CBC. The FortiGate is exonerated. +- judge-bench — evaluate a candidate LLM-as-judge seat +- [2026-08-24] ESH DNS fixed at the IPv6 layer, and the naming scheme went live +- booth +- `[2026-08-27]` Anaheim tripped a power breaker — and four guests including the NAS never came back +- FOLLOW-UP 2 (2026-08-23): it is NOT a capacity problem, and it IS specific to IPsec +- 2026-08-27-anaheim-breaker-and-onboot-gap.md +- parakeet/app.py +- 6. Round-1 aborted; throughput root-caused (measured 2026-08-24 22:00 PDT) +- ChunkResult +- [2026-08-24] Scriberr transcription deployed on ana-ml2, GPU1 +- FOLLOW-UP (2026-08-23): what the per-stream limit actually is +- Gemma-4 26B-A4B ERP/RP tune — GPU sizing adjudication +- Training throughput probes +- BaseModel +- `[2026-08-27]` Run 3 gated: the rule PASSED and a k=25 follow-up found a self-harm guardrail collapse +- CLOSED OUT (2026-08-23): ACME disabled; and the "all-port VIP" alarm was FALSE +- ERP/RP tune run-01 COMPLETE — 7.36h, gate passed on the axis it was built for +- gpu.py +- CatalogField +- accepted_types +- type +- `[2026-08-28]` althing v3.0.0 flag day (U9b) — the post office replaced the P2P bus, one-way +- counted_classifier.py +- `[2026-08-26]` ERP run 2 — complete, merged, coherence-gated, and serving as `erp-tune-v2` +- invocation.py +- tts/app.py +- _cli +- step1_profile.py +- build_calib +- step0_mask.py +- step_bucket.py +- step2_padding.py +- The 8.6% MFU was an accounting artifact — attention on Ampere kernels +- NVFP4A16 serving pipeline — built, validated, and the MoE landmine it found +- Worldtree b188 + b189 bridge cutover, and the selene metadata that lied +- license +- max_length +- quant_with_gen_down.sh +- min +- output_field +- FastAPI +- `[2026-08-28]` A stale `ALTHING_HANDLE` silently reads ANOTHER agent's inbox and reports it empty +- `[2026-08-28]` The `sec` pen-test seat moved GPU1 → GPU0 and came up — on a circuit that tripped 36h earlier +- fields +- version +- generated_at +- index-tts/app.py +- mime_from_field +- test_keep_and_unkeep_go_through_the_same_name_guard +- streamable +- timestamps_field +- lifecycle +- FOLLOW-UP 4 (2026-08-23): a downstream WireGuard terminator costs nothing to forward through ## God Nodes (most connected - your core abstractions) -1. `VM 102 — Matrix Synapse Deployment` - 17 edges -2. `Status + Open Issues` - 16 edges -3. `VM 102 — Matrix Appservice Configuration` - 14 edges -4. `Virtual Machines` - 12 edges -5. `Proxmox Backup Server deployment runbook` - 12 edges -6. `$defs` - 11 edges -7. `Fleet orientation — start here` - 11 edges -8. `Recommended Model Inference Settings — Reference Document` - 11 edges -9. `Deploy (one-time setup)` - 10 edges -10. `Plan of Attack — `chatterbox-fast` streaming TTS engine` - 10 edges +1. `eRP dual-seat overhaul — MeroMero-v2 + Dark-Scarlett, NVFP4A16 @ 256K on ana-ml2` - 35 edges +2. `_touch()` - 30 edges +3. `Recent decisions (archived 2026-08-03 batch)` - 21 edges +4. `build_command()` - 21 edges +5. ``[2026-08-28]` althing v3.0.0 flag day (U9b) — the post office replaced the P2P bus, one-way` - 18 edges +6. `JobManager` - 18 edges +7. `[2026-08-23] Anaheim's IPsec tunnel delivers ~25% of a verified 2 Gbps circuit` - 17 edges +8. `_req()` - 17 edges +9. `VM 102 — Matrix Synapse Deployment` - 17 edges +10. `Status + Open Issues` - 16 edges ## Surprising Connections (you probably didn't know these) -- None detected - all connections are within the same source files. +- `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 +- `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 +- `test_cli_unlink_of_a_stale_id_leaves_the_board_alone()` --calls--> `parse_link_entries()` [INFERRED] + services/booth/tests/test_booth.py → services/booth/booth/links.py +- `test_cli_unlink_rejects_a_non_id_non_index()` --calls--> `parse_link_entries()` [INFERRED] + services/booth/tests/test_booth.py → services/booth/booth/links.py ## Import Cycles -- 1-file cycle: `stacks/stable-audio-open/server.py -> stacks/stable-audio-open/server.py` +- None detected. -## Communities (173 total, 8 thin omitted) +## Communities (426 total, 41 thin omitted) -### Community 0 - "Audio Generation Pipeline" -Cohesion: 0.06 -Nodes (36): 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 (+28 more) +### Community 0 - "quant_modelopt.py" +Cohesion: 0.53 +Nodes (5): build_nvfp4_cfg(), load_calib_chat(), load_calib_text(), main(), NVFP4 W4A4 (group_size 16) matching AEON's exclusions. NVFP4_DEFAULT_CFG already -### Community 1 - "Backup and Migration Infrastructure" +### Community 1 - "Status + Open Issues" Cohesion: 0.06 Nodes (35): Active migration — docker.io 20.10 → docker-ce 29.x, Architecture decisions (durable), Audio generation on irv-ml1 (A6000), autorestic decommission — redundant with the new two-layer pipeline, Backup coverage (2-layer, fully operational), Backup verification post-recovery, ~~🟥 Blocked — irv-ml1 stalled after CUDA driver upgrade (2026-04-25)~~ — RECOVERED 2026-04-27, Daily Digest applet (+27 more) -### Community 2 - "Catalog Schema Definitions" -Cohesion: 0.06 -Nodes (35): additionalProperties, properties, required, title, type, additionalProperties, properties, required (+27 more) - -### Community 3 - "Service Configuration Schema" -Cohesion: 0.06 -Nodes (33): additionalProperties, default, title, type, description, items, title, type (+25 more) - -### Community 4 - "Disaster Recovery Infrastructure" -Cohesion: 0.07 -Nodes (29): ana-docker (VM 10.250.50.70), ana-filebot (CT 112 on pfi-pve) — file automation, ana-ml2 (bare metal Supermicro, 10.250.50.54, BMC 10.250.250.50), 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) (+21 more) - -### Community 5 - "Audio Field Schema" -Cohesion: 0.07 -Nodes (29): anyOf, default, title, anyOf, default, title, properties, anyOf (+21 more) - -### Community 6 - "System Design Brief" -Cohesion: 0.07 -Nodes (26): 1.1 Asset is a first-class entity, 1.2 Content-addressed output storage, 1.3 Reproducibility is a hard requirement, 1.4 Job table from day 1, 1.5 Auth as a no-op dependency, not absent, 1.6 API surface ≠ UI surface, 1.7 Service catalog is git-versioned and additive, 1.8 Tags + collections plumbed in the model from day 1 (+18 more) - -### Community 7 - "Matrix Appservice Configuration" -Cohesion: 0.08 -Nodes (23): Agent Users Always Show as Offline, Agent Virtual Users, Application Service Model, Dependencies, env.sh additions, Formatting, Operational Notes, Overview (+15 more) - -### Community 8 - "Matrix Synapse Deployment" -Cohesion: 0.10 -Nodes (20): Architecture, Components, Network, Next Steps, Overview, Port Allocation, Security Notes, Sources (+12 more) - -### Community 9 - "GPU Device Lifecycle" -Cohesion: 0.11 -Nodes (19): additionalProperties, description, properties, required, title, type, CatalogLifecycle, anyOf (+11 more) - -### Community 10 - "Restic Backup Deployment" -Cohesion: 0.11 -Nodes (18): 1. Install restic + db-client tooling, 2. Add `esh-docker-vm` entry on ana-docker rest-server, 3. Install restic creds on esh-docker-vm, 4. Init the repo, 5. Deploy pre-backup.sh, 6. Test the hook by itself (without running the full backup), 7. Install resticprofile, 8. Deploy profile (+10 more) - -### Community 11 - "Fleet Orientation and Backup" -Cohesion: 0.11 -Nodes (18): Backup architecture (two layers), Cross-site restic mirror (rsync), Current state (2026-04-23 snapshot), First commands a fresh session should be comfortable running, Fleet orientation — start here, Governing principles (durable rules), Inventory + automation scripts, Known gotchas (save yourself time) (+10 more) - -### Community 12 - "Docker Stack Infrastructure" -Cohesion: 0.11 -Nodes (18): 1. Dockge — Docker Compose Management UI, 2. llama-swap — Multi-Model LLM Gateway, 3. ComfyUI — Image Generation UI, 4. VibeVoice — Voice/Audio AI Service, 5. Parakeet STT — Speech-to-Text Service, 6. ChromaDB — Vector Database, Compose File Location, Conventions (+10 more) - -### Community 13 - "Anaheim Rest Server Setup" +### Community 2 - "CatalogReproducibility" Cohesion: 0.12 -Nodes (16): 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 (+8 more) +Nodes (16): additionalProperties, properties, required, title, type, CatalogReproducibility, title, type (+8 more) -### Community 14 - "Proxmox VM Inventory" -Cohesion: 0.12 -Nodes (16): Network Notes, PFI-ANA Proxmox VM Inventory, Resource Summary, Startup Order Summary, Virtual Machines, VM 100 — PFI-ANA-TRUENAS, VM 101 — PFI-ANA-DC, VM 102 — PFI-ANA-Docker (+8 more) - -### Community 15 - "Ana ML2 Restic Backup" -Cohesion: 0.12 -Nodes (15): 1. Credentials (repo already exists — reuse), 2. Verify creds against the existing repo, 3. Install resticprofile on ana-ml2, 4. Deploy the profile, 5. Generate + enable the systemd timers, 6. Fire a manual backup to verify, Deploy (one-time setup), Gotchas specific to this host (+7 more) - -### Community 16 - "Irv ML1 Restic Backup" -Cohesion: 0.12 -Nodes (15): 1. Create rest-server-nh3 credentials for irv-ml1, 2. Install secret files on irv-ml1, 3. Initialize the repo, 4. Install resticprofile on irv-ml1, 5. Deploy the profile, 6. Generate + enable the systemd timers, 7. First manual backup, Deploy (one-time setup) (+7 more) - -### Community 17 - "NH3 Synology Restic Setup" -Cohesion: 0.12 -Nodes (15): 1. Check for existing repo + htpasswd, 2. Install restic creds on nh3-docker, 3. Verify creds against the repo, 4. Fresh-init (only if no repo exists yet on the Synology), 5. Install resticprofile, 6. Deploy the profile, 7. Enable systemd timers, 8. First backup (+7 more) - -### Community 18 - "VM ESH NAS Restic Setup" -Cohesion: 0.12 -Nodes (15): 1. Install restic (not present on this host), 2. Add the client entry to the Anaheim rest-server `.htpasswd`, 3. Install restic creds on vm-esh-nas, 4. Init the repo, 5. Verify, 6. Install resticprofile, 7. Deploy the profile, 8. Enable timers + first backup (+7 more) - -### Community 19 - "NH3 Dev Restic Setup" -Cohesion: 0.14 -Nodes (13): 1. Install resticprofile (restic already present), 2. Add `nh3-dev` entry on the Synology rest-server `.htpasswd`, 3. Install restic creds on nh3-dev (local workstation), 4. Init the repo, 5. Verify, 6. Deploy profile, 7. Schedule + first backup, Deploy (+5 more) - -### Community 20 - "Restic Prune Script" -Cohesion: 0.33 -Nodes (11): restic-prune.sh script, ana_disable_append_only(), ana_restore_append_only(), ana_run(), err(), nh3_print_ceremony(), ok(), prune_client() (+3 more) - -### Community 21 - "Onboarding Checklist" -Cohesion: 0.14 -Nodes (13): 1. Rename hostname (optional, non-blocking), 2. Add lkraven to docker group (blocks server_inspect full output), 3. Install Docker + Dockge (your call on convention adoption), 4. Expose Docker socket on port 2375 (for homepage auto-discovery), 5. Deploy Dockge, 6. Deploy monitoring agents, 7. Set up restic, 8. Push homepage config to make cards live (+5 more) - -### Community 22 - "NH3 Prune Ritual" -Cohesion: 0.14 -Nodes (13): Future automation hooks, If `nh3-dev` prompts for SSH host key authenticity, If you hit `repository is configured as append-only`, Likely no-op rounds, NH3 restic prune ritual, Phase 1 — Drop `--append-only` via DSM, Phase 2 — `forget --prune` on every NH3 client, Phase 3 — Restore `--append-only` via DSM (+5 more) - -### Community 23 - "Backup Coverage Documentation" -Cohesion: 0.15 -Nodes (12): Backup coverage, Client context, corviduo-dev, Deployments, Emergency runbook: provider-key restore, History, Infrastructure, Network (+4 more) - -### Community 24 - "NH3 Dev Migration Plan" -Cohesion: 0.15 -Nodes (12): `/elitk` takeaway, Locked decisions (operator, 2026-06-07), nh3-dev → Mac Pro Rackmount migration plan, Phase 0 actions, ⚠️ Phase 0 — Safety net (data-loss clock; do FIRST), Phase 1 — Provision the Mac (Homebrew baseline), Phase 2 — Re-home data (rsync over the 10.100 link), Phase 3 — Repath for macOS ⚠️ (the silent breaker) (+4 more) - -### Community 25 - "Model Variant Decision" +### Community 3 - "3. Qwen 3.5 Family (0.8B – 397B-A17B)" Cohesion: 0.17 Nodes (12): 27B vs 35B-A3B Decision, 3. Qwen 3.5 Family (0.8B – 397B-A17B), Context Settings, Default Thinking Behavior by Variant, Example Commands, Hardware Requirements, Inference Parameters, Model Variants (+4 more) -### Community 26 - "Catalog Contract Specification" -Cohesion: 0.18 -Nodes (10): Data model — high level, Field entry, Known consumers, Response renderer vocabulary, Service authoring notes, Service entry, services.yaml — contract for downstream consumers, Sync workflow for downstream consumers (+2 more) +### Community 4 - "Fleet disaster-recovery runbook" +Cohesion: 0.07 +Nodes (29): ana-docker (VM 10.250.50.70), ana-filebot (CT 112 on pfi-pve) — file automation, ana-ml2 (bare metal Supermicro, 10.250.50.54, BMC 10.250.250.50), 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) (+21 more) -### Community 27 - "Chatterbox Fast Streaming TTS" -Cohesion: 0.18 -Nodes (10): 0. Mission, 1. THE design — adaptive buffer-ratchet chunking (operator's idea; chosen), 2. Validated API + facts (don't re-derive), 3. Dev/test pattern (host irv-ml1 = 10.100.79.3, ssh `lkraven@10.100.79.3`), 4. Build phases, 5. ALSO build for A/B (operator asked): base-chatterbox + streaming fork, 6. Acceptance / A/B, 7. Existing A/B samples (this session, GLaDOS voice) on nh3-dev `~/chatterbox-ab/` (+2 more) +### Community 5 - "properties" +Cohesion: 0.15 +Nodes (13): anyOf, default, title, anyOf, default, title, properties, anyOf (+5 more) -### Community 28 - "Backup Coverage and Monitoring" -Cohesion: 0.18 -Nodes (10): Backup coverage, Docker stacks (`/opt/docker/compose/`, owned by `lkraven`), Hardware, irv-ml1, Native toolchain (`/opt`, owned by `llmuser`), Network, Pending hostname rename, Refresh state (+2 more) +### Community 6 - "1. Locked architectural decisions" +Cohesion: 0.07 +Nodes (26): 1.1 Asset is a first-class entity, 1.2 Content-addressed output storage, 1.3 Reproducibility is a hard requirement, 1.4 Job table from day 1, 1.5 Auth as a no-op dependency, not absent, 1.6 API surface ≠ UI surface, 1.7 Service catalog is git-versioned and additive, 1.8 Tags + collections plumbed in the model from day 1 (+18 more) -### Community 29 - "NH3 Dev Backup Setup" -Cohesion: 0.18 -Nodes (10): API token (for hypervisor clients), Dependencies / blast radius, Hardware (VM), Namespaces, Network, NFS details (the ZFS-case-insensitivity gotcha), pbs-ana, Refresh (+2 more) +### Community 7 - "VM 102 — Matrix Appservice Configuration" +Cohesion: 0.08 +Nodes (23): Agent Users Always Show as Offline, Agent Virtual Users, Application Service Model, Dependencies, env.sh additions, Formatting, Operational Notes, Overview (+15 more) -### Community 30 - "PBS NH3 Backup Setup" -Cohesion: 0.18 -Nodes (10): Dependencies / blast radius, DR failover (hypothetical), Hardware (VM), Namespaces, Network, NFS details (the Synology ACL gotcha), pbs-nh3, Refresh (+2 more) +### Community 8 - "VM 102 — Matrix Synapse Deployment" +Cohesion: 0.10 +Nodes (20): Architecture, Components, Network, Next Steps, Overview, Port Allocation, Security Notes, Sources (+12 more) -### Community 31 - "Model Variant Decision" +### Community 9 - "CatalogLifecycle" +Cohesion: 0.11 +Nodes (19): additionalProperties, description, properties, required, title, type, CatalogLifecycle, anyOf (+11 more) + +### Community 10 - "Deploy (one-time setup)" +Cohesion: 0.11 +Nodes (18): 1. Install restic + db-client tooling, 2. Add `esh-docker-vm` entry on ana-docker rest-server, 3. Install restic creds on esh-docker-vm, 4. Init the repo, 5. Deploy pre-backup.sh, 6. Test the hook by itself (without running the full backup), 7. Install resticprofile, 8. Deploy profile (+10 more) + +### Community 11 - "CLAUDE.md" +Cohesion: 0.06 +Nodes (30): Conventions (enforce for every new stack), How to refresh a server's state, Internal DNS (`*.internal`), Layout, Model quantization, Persistent memory, Purpose, Servers (+22 more) + +### Community 12 - "PFI-ANA Docker Stack" +Cohesion: 0.11 +Nodes (18): 1. Dockge — Docker Compose Management UI, 2. llama-swap — Multi-Model LLM Gateway, 3. ComfyUI — Image Generation UI, 4. VibeVoice — Voice/Audio AI Service, 5. Parakeet STT — Speech-to-Text Service, 6. ChromaDB — Vector Database, Compose File Location, Conventions (+10 more) + +### Community 13 - "Deploy (one-time)" +Cohesion: 0.12 +Nodes (16): 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 (+8 more) + +### Community 14 - "Virtual Machines" +Cohesion: 0.12 +Nodes (16): Network Notes, PFI-ANA Proxmox VM Inventory, Resource Summary, Startup Order Summary, Virtual Machines, VM 100 — PFI-ANA-TRUENAS, VM 101 — PFI-ANA-DC, VM 102 — PFI-ANA-Docker (+8 more) + +### Community 15 - "Deploy (one-time setup)" +Cohesion: 0.12 +Nodes (15): 1. Credentials (repo already exists — reuse), 2. Verify creds against the existing repo, 3. Install resticprofile on ana-ml2, 4. Deploy the profile, 5. Generate + enable the systemd timers, 6. Fire a manual backup to verify, Deploy (one-time setup), Gotchas specific to this host (+7 more) + +### Community 16 - "Deploy (one-time setup)" +Cohesion: 0.12 +Nodes (15): 1. Create rest-server-nh3 credentials for irv-ml1, 2. Install secret files on irv-ml1, 3. Initialize the repo, 4. Install resticprofile on irv-ml1, 5. Deploy the profile, 6. Generate + enable the systemd timers, 7. First manual backup, Deploy (one-time setup) (+7 more) + +### Community 17 - "Deploy (one-time setup)" +Cohesion: 0.12 +Nodes (15): 1. Check for existing repo + htpasswd, 2. Install restic creds on nh3-docker, 3. Verify creds against the repo, 4. Fresh-init (only if no repo exists yet on the Synology), 5. Install resticprofile, 6. Deploy the profile, 7. Enable systemd timers, 8. First backup (+7 more) + +### Community 18 - "Deploy (one-time setup)" +Cohesion: 0.12 +Nodes (15): 1. Install restic (not present on this host), 2. Add the client entry to the Anaheim rest-server `.htpasswd`, 3. Install restic creds on vm-esh-nas, 4. Init the repo, 5. Verify, 6. Install resticprofile, 7. Deploy the profile, 8. Enable timers + first backup (+7 more) + +### Community 19 - "Deploy" +Cohesion: 0.14 +Nodes (13): 1. Install resticprofile (restic already present), 2. Add `nh3-dev` entry on the Synology rest-server `.htpasswd`, 3. Install restic creds on nh3-dev (local workstation), 4. Init the repo, 5. Verify, 6. Deploy profile, 7. Schedule + first backup, Deploy (+5 more) + +### Community 20 - "restic-prune.sh" +Cohesion: 0.33 +Nodes (11): restic-prune.sh script, ana_disable_append_only(), ana_restore_append_only(), ana_run(), err(), nh3_print_ceremony(), ok(), prune_client() (+3 more) + +### Community 21 - "To do on the host" +Cohesion: 0.14 +Nodes (13): 1. Rename hostname (optional, non-blocking), 2. Add lkraven to docker group (blocks server_inspect full output), 3. Install Docker + Dockge (your call on convention adoption), 4. Expose Docker socket on port 2375 (for homepage auto-discovery), 5. Deploy Dockge, 6. Deploy monitoring agents, 7. Set up restic, 8. Push homepage config to make cards live (+5 more) + +### Community 22 - "NH3 restic prune ritual" +Cohesion: 0.14 +Nodes (13): Future automation hooks, If `nh3-dev` prompts for SSH host key authenticity, If you hit `repository is configured as append-only`, Likely no-op rounds, NH3 restic prune ritual, Phase 1 — Drop `--append-only` via DSM, Phase 2 — `forget --prune` on every NH3 client, Phase 3 — Restore `--append-only` via DSM (+5 more) + +### Community 23 - "corviduo-dev" +Cohesion: 0.15 +Nodes (12): Backup coverage, Client context, corviduo-dev, Deployments, Emergency runbook: provider-key restore, History, Infrastructure, Network (+4 more) + +### Community 24 - "nh3-dev → Mac Pro Rackmount migration plan" +Cohesion: 0.15 +Nodes (12): `/elitk` takeaway, Locked decisions (operator, 2026-06-07), nh3-dev → Mac Pro Rackmount migration plan, Phase 0 actions, ⚠️ Phase 0 — Safety net (data-loss clock; do FIRST), Phase 1 — Provision the Mac (Homebrew baseline), Phase 2 — Re-home data (rsync over the 10.100 link), Phase 3 — Repath for macOS ⚠️ (the silent breaker) (+4 more) + +### Community 25 - "5. Google Gemma 4 Family (E2B – 31B)" Cohesion: 0.18 Nodes (11): 26B-A4B vs 31B Decision, 5. Google Gemma 4 Family (E2B – 31B), Context Length, Example Commands, Hardware Requirements, Inference Parameters (All Variants), Model Variants, Multimodal Settings (+3 more) -### Community 32 - "Rest Server Authentication" +### Community 26 - "services.yaml — contract for downstream consumers" Cohesion: 0.18 -Nodes (10): Auth model, Deploy, Off-site replication, Option A — temporary flag flip (simplest, requires a maintenance window), Option B — second endpoint on a different port (automation-friendly), Pre-deploy: create the data path and htpasswd, Prune ceremony (because of --append-only), rest-server-nh3 (+2 more) +Nodes (10): Data model — high level, Field entry, Known consumers, Response renderer vocabulary, Service authoring notes, Service entry, services.yaml — contract for downstream consumers, Sync workflow for downstream consumers (+2 more) -### Community 33 - "Althing Chamber Deployment" -Cohesion: 0.20 -Nodes (9): althing-chamber, Automated (Gitea Actions, push-to-main), Deploy, Env-var contract, First-deploy sequence (when galdrabok's Dockerfile lands), Manual (elway from a workstation), Network model, Path layout (on ana-docker) (+1 more) +### Community 27 - "Plan of Attack — `chatterbox-fast` streaming TTS engine" +Cohesion: 0.18 +Nodes (10): 0. Mission, 1. THE design — adaptive buffer-ratchet chunking (operator's idea; chosen), 2. Validated API + facts (don't re-derive), 3. Dev/test pattern (host irv-ml1 = 10.100.79.3, ssh `lkraven@10.100.79.3`), 4. Build phases, 5. ALSO build for A/B (operator asked): base-chatterbox + streaming fork, 6. Acceptance / A/B, 7. Existing A/B samples (this session, GLaDOS voice) on nh3-dev `~/chatterbox-ab/` (+2 more) -### Community 34 - "Catalog Latency Definitions" -Cohesion: 0.20 -Nodes (10): additionalProperties, title, type, additionalProperties, required, title, type, $defs (+2 more) +### Community 28 - "irv-ml1" +Cohesion: 0.18 +Nodes (10): Backup coverage, Docker stacks (`/opt/docker/compose/`, owned by `lkraven`), Hardware, irv-ml1, Native toolchain (`/opt`, owned by `llmuser`), Network, Pending hostname rename, Refresh state (+2 more) -### Community 35 - "Claude Stack Conventions" -Cohesion: 0.20 -Nodes (8): Conventions (enforce for every new stack), How to refresh a server's state, Layout, Persistent memory, Purpose, Servers, Stack tree convention (canonical vs mirror), Working rules +### Community 29 - "pbs-ana" +Cohesion: 0.18 +Nodes (10): API token (for hypervisor clients), Dependencies / blast radius, Hardware (VM), Namespaces, Network, NFS details (the ZFS-case-insensitivity gotcha), pbs-ana, Refresh (+2 more) -### Community 36 - "CosyVoice TTS Stack" -Cohesion: 0.20 -Nodes (9): API endpoints, CosyVoice, Emotion / style control, First-time deploy on irv-ml1, Gotchas (read before first use), Path layout, Smoke test (full clone → synthesize), Version bump (+1 more) +### Community 30 - "pbs-nh3" +Cohesion: 0.18 +Nodes (10): Dependencies / blast radius, DR failover (hypothetical), Hardware (VM), Namespaces, Network, NFS details (the Synology ACL gotcha), pbs-nh3, Refresh (+2 more) -### Community 37 - "Cross-Site Monitoring Infrastructure" -Cohesion: 0.20 -Nodes (9): Cross-site monitoring, esh-docker-vm, Hardware, Key paths, Network, Notes, Placement rule, Refresh state (+1 more) - -### Community 38 - "ESH VM DB Backup Coverage" -Cohesion: 0.20 -Nodes (9): Backup coverage, Consumers, esh-vm-db, Follow-ups (do soon), Hardware, Network, Refresh state, Storage (+1 more) - -### Community 39 - "PBS API and Deployment" -Cohesion: 0.20 -Nodes (9): API, Architecture, Deploy, Fish Audio S2-Pro, Hardware footprint, Headline features, Lessons learned during deploy (2026-04-27), Voice library (+1 more) - -### Community 40 - "IRV ML1 CUDA Upgrade" -Cohesion: 0.47 -Nodes (7): upgrade-irv-ml1-cuda.sh script, ok(), phase1(), phase2(), rollback(), say(), write_remote_script() - -### Community 41 - "Parakeet ASR Deployment" -Cohesion: 0.20 -Nodes (9): API endpoints, File layout, First-time deploy on irv-ml1, Parakeet ASR, Path layout, Smoke test, Switching to the v3 (multilingual) model, Upgrade sherpa-onnx or change the base image (+1 more) - -### Community 42 - "Ana Ana Restic Backup" -Cohesion: 0.20 -Nodes (9): Data layout, Deploy, Off-site replication, Pre-deploy: clean the data dir and create htpasswd, Prune ceremony, rest-server-ana, Retire the old stack, Verify (+1 more) - -### Community 43 - "PBS Provisioning Plan" -Cohesion: 0.20 -Nodes (10): 1.1. Create a Debian 12 VM on pfi-pve, 1.2. Install PBS package, 1.3. Mount NAS datastore path, 1.4. Create PBS datastore, 1.4b. Create per-hypervisor namespaces, 1.4c. Create a verify job, 1.5. Create an API token for hypervisors to use, 1.6. Note PBS fingerprint (+2 more) - -### Community 44 - "Worldtree Allowlist Coordination" -Cohesion: 0.20 -Nodes (9): Automated (Gitea Actions, push-to-main), Deploy, Env-var contract, Manual (elway from a workstation), Network model, Path layout (on ana-docker), Restart semantics, skaldsong (+1 more) - -### Community 45 - "Ana NAS to NH3 NAS Mirror" -Cohesion: 0.22 -Nodes (8): ana-nas → nh3-nas restic mirror, Deploy / redeploy, Files, Operate, Restore flow (if ana-nas loses the repo), Scheduling rationale, What this does NOT cover, What + where - -### Community 46 - "Asset Engine Deployment" -Cohesion: 0.22 -Nodes (8): asset-engine, Automated (Gitea Actions, push-to-main), Catalog drift, Deploy, Manual (elway from a workstation), Network model, Outputs directory growth, Path layout (on ana-docker) - -### Community 47 - "Cold Start Scheduling" -Cohesion: 0.22 -Nodes (9): properties, anyOf, default, title, cold_start_s, warm_per_unit, anyOf, default (+1 more) - -### Community 48 - "Image Revision Properties" -Cohesion: 0.22 -Nodes (9): properties, anyOf, default, title, image, revision, anyOf, default (+1 more) - -### Community 49 - "Label Value Properties" -Cohesion: 0.22 -Nodes (9): properties, anyOf, default, title, type, label, value, anyOf (+1 more) - -### Community 50 - "Chatterbox Turbo TTS" -Cohesion: 0.22 -Nodes (8): API, Chatterbox Turbo, Deploy, Gotchas, Headline features, Switching the model, Voice library, Why this stack exists - -### Community 51 - "IndexTTS-2 Streaming TTS" -Cohesion: 0.22 -Nodes (8): API, Deploy, Gotchas, IndexTTS-2, Streaming (since 0.2.0), Switching GPUs, Voice library, Why this stack exists alongside the other two TTS - -### Community 52 - "Langfuse Integration" -Cohesion: 0.22 -Nodes (8): Deploy, Langfuse-ready, litellm, Notes, Smoke test, The log switch, What routes through it, Why it exists - -### Community 53 - "Miniflux Feed Setup" -Cohesion: 0.22 -Nodes (8): Adding subreddits later, Backup, Deploy, Initial feed setup — OPML import, Miniflux, r/nba spoiler block-list, Updating, Why this stack - -### Community 54 - "NH3 NAS Infrastructure" -Cohesion: 0.22 -Nodes (8): DSM-specific gotchas, Hardware, Network, nh3-nas, Refresh state, Services running on the box, What backs up FROM it, What backs up to it - -### Community 55 - "NH3 NAS to Ana NAS Mirror" -Cohesion: 0.22 -Nodes (8): Deploy, DSM-specific notes, Files, nh3-nas → ana-nas restic mirror (return leg), Operate, Prereqs (one-time setup), What + where, Why 05:00 - -### Community 56 - "Fleet Backup Pipeline" -Cohesion: 0.22 -Nodes (8): Authoritative vs. mirror, Backup pipeline, Common tasks, Coverage status (as of 2026-04-29), Current stacks, eshpfi-management, Layout, The fleet - -### Community 57 - "VM ESH NAS Refresh" -Cohesion: 0.22 -Nodes (8): Hardware (from latest snapshot), Known nits, Network, Placement rule, Refresh state, Stack mirror layout, vm-esh-nas, What runs here - -### Community 58 - "VLLM Reranker Scaling" -Cohesion: 0.22 -Nodes (8): Deploy, History, Reranker caveat, Reward / Skywork specifics, Scaling knobs, Verify, vllm, Why one process per service - -### Community 59 - "Voxtral TTS Stack" -Cohesion: 0.22 -Nodes (8): API, Deploy, Hardware footprint, Headline numbers, ⚠️ License, Voice library, Voxtral TTS, Why this stack exists - -### Community 60 - "ANA Docker Running Stacks" -Cohesion: 0.25 -Nodes (7): ana-docker, Hardware, Key paths, Network, Placement rule, Refresh state, Running stacks - -### Community 61 - "ANA Filebot Infrastructure" -Cohesion: 0.25 -Nodes (7): ana-filebot, Backup coverage, Discovered via, Infrastructure, Network, Refresh state, Role - -### Community 62 - "ANA ML2 GPU Allocation" -Cohesion: 0.25 -Nodes (7): ana-ml2, GPU allocation policy, Hardware, Key paths, Network, Refresh state, Running stacks - -### Community 63 - "ANA NAS Container Context" -Cohesion: 0.25 -Nodes (7): ana-nas, Container context, DSM / rescue access, History note, Network, Refresh, Why CT 109 matters (SPOF warning) - -### Community 64 - "ANA WG Backup Coverage" -Cohesion: 0.25 -Nodes (7): ana-wg, Backup coverage, Discovered via, Infrastructure, Network, Refresh state, Role - -### Community 65 - "Hint ID Properties" -Cohesion: 0.25 -Nodes (8): properties, anyOf, default, title, title, type, hint, id - -### Community 66 - "Backrest Backup Deployment" -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 - "Beszel Monitoring Deployment" -Cohesion: 0.25 -Nodes (7): Alerts, beszel, Deploy — agent (ana-ml2), Deploy — hub + local agent (ana-docker), How hub ↔ agent auth works, Sizing / impact, Verify - -### Community 68 - "Calibre Web Automated Migration" -Cohesion: 0.25 -Nodes (7): calibre-web-automated, Homepage, Migration plan, NFS caveat (important), Volumes, What changes vs. the old pair, Widget - -### Community 69 - "ComfyUI Deployment" -Cohesion: 0.25 -Nodes (7): ComfyUI, Deploy updates, Editing workflows from outside the container, First-time deploy on irv-ml1, Image version bump, Path layout, Populate models - -### Community 70 - "Gitea Runner Deployment" -Cohesion: 0.25 -Nodes (7): Deploy, gitea-runner, Operations, Path layout (on ana-docker), Prereqs, Topology, Wiring deploys - -### Community 71 - "Kyutai TTS Stack" -Cohesion: 0.25 -Nodes (7): API, Architecture heritage, Deploy, Deployment notes, Hardware footprint, Kyutai TTS, Why this stack exists - -### Community 72 - "NH3 Docker Running Stacks" -Cohesion: 0.25 -Nodes (7): Hardware, Key paths, Network, nh3-docker, Placement rule, Refresh state, Running stacks - -### Community 73 - "PFI Webhost Backup Coverage" -Cohesion: 0.25 -Nodes (7): Backup coverage, Discovered via, Infrastructure, Network, pfi-ana-webhost, Refresh state, Role - -### Community 74 - "PFI PostgreSQL Backup Coverage" -Cohesion: 0.25 -Nodes (7): Backup coverage, Discovered via, Infrastructure, Network, pfi-postgres, Refresh state, Role - -### Community 75 - "PFI Pteradactyl Backup Coverage" -Cohesion: 0.25 -Nodes (7): Backup coverage, Discovered via, Infrastructure, Network, pfi-pteradactyl, Refresh state, Role - -### Community 76 - "NVIDIA Nano Model Variants" +### Community 31 - "2. NVIDIA Nemotron 3 Nano (4B / 30B-A3B)" Cohesion: 0.25 Nodes (8): 2. NVIDIA Nemotron 3 Nano (4B / 30B-A3B), Additional Settings, Example Commands, Hardware & Quantization, Inference Parameters (Both Variants), Model Variants, Nano-30B-A3B, Nano-4B -### Community 77 - "Qwen3 Coder Next Model" +### Community 32 - "rest-server-nh3" +Cohesion: 0.18 +Nodes (10): Auth model, Deploy, Off-site replication, Option A — temporary flag flip (simplest, requires a maintenance window), Option B — second endpoint on a different port (automation-friendly), Pre-deploy: create the data path and htpasswd, Prune ceremony (because of --append-only), rest-server-nh3 (+2 more) + +### Community 33 - "althing-chamber" +Cohesion: 0.20 +Nodes (9): althing-chamber, Automated (Gitea Actions, push-to-main), Deploy, Env-var contract, First-deploy sequence (when galdrabok's Dockerfile lands), Manual (elway from a workstation), Network model, Path layout (on ana-docker) (+1 more) + +### Community 34 - "filezilla" +Cohesion: 0.33 +Nodes (5): Deploy, filezilla, Gotchas, Mounts, Why this host + +### Community 35 - "homepage — the fleet dashboard" +Cohesion: 0.10 +Nodes (20): 2026-08-18 cleanup, 2026-08-24 layout + theme pass, Foot-guns found in the 2026-08-17 audit, homepage — the fleet dashboard, How services get on the dashboard, Iterating on the theme — do NOT recreate the container, Layout, Light and dark (2026-08-24) (+12 more) + +### Community 36 - "CosyVoice" +Cohesion: 0.20 +Nodes (9): API endpoints, CosyVoice, Emotion / style control, First-time deploy on irv-ml1, Gotchas (read before first use), Path layout, Smoke test (full clone → synthesize), Version bump (+1 more) + +### Community 37 - "esh-docker-vm" +Cohesion: 0.20 +Nodes (9): Cross-site monitoring, esh-docker-vm, Hardware, Key paths, Network, Notes, Placement rule, Refresh state (+1 more) + +### Community 38 - "esh-vm-db" +Cohesion: 0.20 +Nodes (9): Backup coverage, Consumers, esh-vm-db, Follow-ups (do soon), Hardware, Network, Refresh state, Storage (+1 more) + +### Community 39 - "Fish Audio S2-Pro" +Cohesion: 0.20 +Nodes (9): API, Architecture, Deploy, Fish Audio S2-Pro, Hardware footprint, Headline features, Lessons learned during deploy (2026-04-27), Voice library (+1 more) + +### Community 40 - "upgrade-irv-ml1-cuda.sh" +Cohesion: 0.47 +Nodes (7): upgrade-irv-ml1-cuda.sh script, ok(), phase1(), phase2(), rollback(), say(), write_remote_script() + +### Community 41 - "Parakeet ASR" +Cohesion: 0.20 +Nodes (9): API endpoints, File layout, First-time deploy on irv-ml1, Parakeet ASR, Path layout, Smoke test, Switching to the v3 (multilingual) model, Upgrade sherpa-onnx or change the base image (+1 more) + +### Community 42 - "rest-server-ana" +Cohesion: 0.20 +Nodes (9): Data layout, Deploy, Off-site replication, Pre-deploy: clean the data dir and create htpasswd, Prune ceremony, rest-server-ana, Retire the old stack, Verify (+1 more) + +### Community 43 - "Phase 1 — Provision PBS-ANA (VM on pfi-pve)" +Cohesion: 0.20 +Nodes (10): 1.1. Create a Debian 12 VM on pfi-pve, 1.2. Install PBS package, 1.3. Mount NAS datastore path, 1.4. Create PBS datastore, 1.4b. Create per-hypervisor namespaces, 1.4c. Create a verify job, 1.5. Create an API token for hypervisors to use, 1.6. Note PBS fingerprint (+2 more) + +### Community 44 - "skaldsong" +Cohesion: 0.20 +Nodes (9): Automated (Gitea Actions, push-to-main), Deploy, Env-var contract, Manual (elway from a workstation), Network model, Path layout (on ana-docker), Restart semantics, skaldsong (+1 more) + +### Community 45 - "ana-nas → nh3-nas restic mirror" +Cohesion: 0.22 +Nodes (8): ana-nas → nh3-nas restic mirror, Deploy / redeploy, Files, Operate, Restore flow (if ana-nas loses the repo), Scheduling rationale, What this does NOT cover, What + where + +### Community 46 - "asset-engine" +Cohesion: 0.22 +Nodes (8): asset-engine, Automated (Gitea Actions, push-to-main), Catalog drift, Deploy, Manual (elway from a workstation), Network model, Outputs directory growth, Path layout (on ana-docker) + +### Community 47 - "cold_start_s" +Cohesion: 0.22 +Nodes (9): properties, anyOf, default, title, cold_start_s, warm_per_unit, anyOf, default (+1 more) + +### Community 48 - "CatalogModel" +Cohesion: 0.12 +Nodes (17): additionalProperties, properties, required, title, type, CatalogModel, title, type (+9 more) + +### Community 49 - "FieldOption" +Cohesion: 0.13 +Nodes (15): FieldOption, additionalProperties, description, properties, required, title, type, anyOf (+7 more) + +### Community 50 - "Chatterbox Turbo" +Cohesion: 0.22 +Nodes (8): API, Chatterbox Turbo, Deploy, Gotchas, Headline features, Switching the model, Voice library, Why this stack exists + +### Community 51 - "IndexTTS-2" +Cohesion: 0.22 +Nodes (8): API, Deploy, Gotchas, IndexTTS-2, Streaming (since 0.2.0), Switching GPUs, Voice library, Why this stack exists alongside the other two TTS + +### Community 52 - "litellm" +Cohesion: 0.22 +Nodes (8): Deploy, Langfuse-ready, litellm, Notes, Smoke test, The log switch, What routes through it, Why it exists + +### Community 53 - "Miniflux" +Cohesion: 0.22 +Nodes (8): Adding subreddits later, Backup, Deploy, Initial feed setup — OPML import, Miniflux, r/nba spoiler block-list, Updating, Why this stack + +### Community 54 - "nh3-nas" +Cohesion: 0.22 +Nodes (8): DSM-specific gotchas, Hardware, Network, nh3-nas, Refresh state, Services running on the box, What backs up FROM it, What backs up to it + +### Community 55 - "nh3-nas → ana-nas restic mirror (return leg)" +Cohesion: 0.22 +Nodes (8): Deploy, DSM-specific notes, Files, nh3-nas → ana-nas restic mirror (return leg), Operate, Prereqs (one-time setup), What + where, Why 05:00 + +### Community 56 - "eshpfi-management" +Cohesion: 0.22 +Nodes (8): Authoritative vs. mirror, Backup pipeline, Common tasks, Coverage status (as of 2026-04-29), Current stacks, eshpfi-management, Layout, The fleet + +### Community 57 - "vm-esh-nas" +Cohesion: 0.22 +Nodes (8): Hardware (from latest snapshot), Known nits, Network, Placement rule, Refresh state, Stack mirror layout, vm-esh-nas, What runs here + +### Community 58 - "vllm" +Cohesion: 0.22 +Nodes (8): Deploy, History, Reranker caveat, Reward / Skywork specifics, Scaling knobs, Verify, vllm, Why one process per service + +### Community 59 - "Voxtral TTS" +Cohesion: 0.22 +Nodes (8): API, Deploy, Hardware footprint, Headline numbers, ⚠️ License, Voice library, Voxtral TTS, Why this stack exists + +### Community 60 - "ana-docker" +Cohesion: 0.25 +Nodes (7): ana-docker, Hardware, Key paths, Network, Placement rule, Refresh state, Running stacks + +### Community 61 - "ana-filebot" +Cohesion: 0.25 +Nodes (7): ana-filebot, Backup coverage, Discovered via, Infrastructure, Network, Refresh state, Role + +### Community 62 - "4. Qwen3-Coder-Next (80B MoE)" Cohesion: 0.25 Nodes (8): 4. Qwen3-Coder-Next (80B MoE), Example Commands, Hardware Requirements, Inference Parameters, Key Differences from Qwen3.5 General Models, Model Overview, Quick Reference One-Liner, vLLM FP8 Dynamic (GPU Premium) -### Community 78 - "Prompt Tuning Reference Cards" +### Community 63 - "ana-nas" +Cohesion: 0.25 +Nodes (7): ana-nas, Container context, DSM / rescue access, History note, Network, Refresh, Why CT 109 matters (SPOF warning) + +### Community 64 - "ana-wg" +Cohesion: 0.25 +Nodes (7): ana-wg, Backup coverage, Discovered via, Infrastructure, Network, Refresh state, Role + +### Community 65 - "arbo — catalog-driven ComfyUI engine" +Cohesion: 0.25 +Nodes (7): arbo — catalog-driven ComfyUI engine, Deploy, Items needing comfy-dev's image (jointly owned), Placement (ADR-0001), Q3 — Secrets, Q4 — Volumes + backup, Q5 — Catalog-pull automation (IMPLEMENTED) + +### Community 66 - "backrest" +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 - "beszel" +Cohesion: 0.25 +Nodes (7): Alerts, beszel, Deploy — agent (ana-ml2), Deploy — hub + local agent (ana-docker), How hub ↔ agent auth works, Sizing / impact, Verify + +### Community 68 - "calibre-web-automated" +Cohesion: 0.25 +Nodes (7): calibre-web-automated, Homepage, Migration plan, NFS caveat (important), Volumes, What changes vs. the old pair, Widget + +### Community 69 - "ComfyUI" +Cohesion: 0.22 +Nodes (8): ComfyUI, Custom nodes needing extra provisioning — RTX Video Super Resolution, Deploy updates, Editing workflows from outside the container, First-time deploy on irv-ml1, Image version bump, Path layout, Populate models + +### Community 70 - "gitea-runner" +Cohesion: 0.25 +Nodes (7): Deploy, gitea-runner, Operations, Path layout (on ana-docker), Prereqs, Topology, Wiring deploys + +### Community 71 - "Kyutai TTS" +Cohesion: 0.25 +Nodes (7): API, Architecture heritage, Deploy, Deployment notes, Hardware footprint, Kyutai TTS, Why this stack exists + +### Community 72 - "nh3-docker" +Cohesion: 0.25 +Nodes (7): Hardware, Key paths, Network, nh3-docker, Placement rule, Refresh state, Running stacks + +### Community 73 - "pfi-ana-webhost" +Cohesion: 0.25 +Nodes (7): Backup coverage, Discovered via, Infrastructure, Network, pfi-ana-webhost, Refresh state, Role + +### Community 74 - "pfi-postgres" +Cohesion: 0.25 +Nodes (7): Backup coverage, Discovered via, Infrastructure, Network, pfi-postgres, Refresh state, Role + +### Community 75 - "pfi-pteradactyl" +Cohesion: 0.25 +Nodes (7): Backup coverage, Discovered via, Infrastructure, Network, pfi-pteradactyl, Refresh state, Role + +### Community 76 - "6. Quick Reference Cards" Cohesion: 0.25 Nodes (8): 6. Quick Reference Cards, Min-P by Model, Presence Penalty by Model, Repetition Penalty by Model, Seed Values, Temperature by Model & Use Case, Top-K by Model, Top-P by Model & Use Case -### Community 79 - "PFI Tactical RMM Backup" +### Community 77 - "ana-ml2" +Cohesion: 0.25 +Nodes (7): ana-ml2, GPU allocation policy, Hardware, Key paths, Network, Refresh state, Running stacks + +### Community 78 - "test_booth.py" +Cohesion: 0.06 +Nodes (33): build_gallery(), Files in a booth as render items, with caption sidecars folded in. A…, (rendered, is_html). Markdown → HTML (fenced code, tables, sane lists); plain…, render_doc(), Releasing something already released is a no-op, not a 500., test_booth_autogallery_renders_media(), test_build_gallery_folds_caption_sidecars(), test_build_gallery_oversize_doc_is_not_inlined() (+25 more) + +### Community 79 - "pfi-tacticalrmm" Cohesion: 0.25 Nodes (7): Backup coverage, Discovered via, Infrastructure, Network, pfi-tacticalrmm, Refresh state, Role -### Community 80 - "Qwen3 TTS Stack" +### Community 80 - "Qwen3-TTS" Cohesion: 0.25 Nodes (7): API endpoints, Deploy, Path layout, Qwen3-TTS, Switching to the smaller model, Voice cloning — different shape from cosyvoice, Why this stack alongside cosyvoice -### Community 81 - "Restic Host Deployment" +### Community 81 - "configs/restic" Cohesion: 0.25 Nodes (7): configs/restic, Install restic + resticprofile on each host, Layout, Monitoring, Per-host deploy flow (done once per host), Prune ceremony (quarterly or as needed), Why this shape -### Community 82 - "PBS Deployment Runbook" +### Community 82 - "Proxmox Backup Server deployment runbook" Cohesion: 0.25 Nodes (7): Phase 4 done-state, Phase 4 — Onboard nh3-pve, Phase 7 — Burn-in, Phase 8 — Retire legacy vzdump targets, Phase 9 — Update this workspace, Proxmox Backup Server deployment runbook, Rollback posture -### Community 83 - "SF Ana Container Backup" +### Community 83 - "sf-ana-container" Cohesion: 0.25 Nodes (7): Backup coverage, Client context, Discovered via, Infrastructure, Network, Role, sf-ana-container -### Community 84 - "SF R630 Infrastructure" +### Community 84 - "sf-r630" Cohesion: 0.25 Nodes (7): Client context, Discovered via, Hardware, Network, Refresh state, sf-r630, Why this dir exists separately from sfsrv-ana -### Community 85 - "SFSRV ANA Backup" +### Community 85 - "sfsrv-ana" Cohesion: 0.25 Nodes (7): Backup coverage, Client context, Discovered via, Infrastructure, Network, Refresh state, sfsrv-ana -### Community 86 - "VibeVoice Stack Deployment" +### Community 86 - "VibeVoice" Cohesion: 0.25 Nodes (7): API, Deploy, Gotchas, Switching to the 7B variant, VibeVoice, Voices, Why this stack exists -### Community 87 - "Model Reproducibility Schema" -Cohesion: 0.29 -Nodes (7): properties, $ref, model, reproducibility, response, $ref, $ref +### Community 87 - "properties" +Cohesion: 0.15 +Nodes (13): properties, title, type, $ref, title, type, endpoint, model (+5 more) -### Community 88 - "Dia TTS Stack" +### Community 88 - "Dia / Dia2" Cohesion: 0.29 Nodes (6): Deploy, Deployment shape (as of 2026-05-31), Dia / Dia2, Notes, Voices — stabilizing the random-voice behavior, Why this stack exists -### Community 89 - "Auth TLS Deploy" +### Community 89 - "dozzle" Cohesion: 0.29 Nodes (6): Auth / TLS note, Deploy — agent (ana-ml2), Deploy — hub (ana-docker), dozzle, Troubleshooting, Verify -### Community 90 - "ESH PVE NAS Infrastructure" +### Community 90 - "esh-pve-nas" Cohesion: 0.29 Nodes (6): esh-pve-nas, Hardware, Network, Placement rule, Refresh state, What it runs -### Community 91 - "ESH PVE Infrastructure" -Cohesion: 0.29 -Nodes (6): esh-pve, Hardware, Network, Placement rule, Refresh state, What it runs +### Community 91 - "esh-pve" +Cohesion: 0.20 +Nodes (9): ⚠ Cluster membership and the dark-tile gotcha, esh-pve, Hardware, Network, Placement rule, Refresh state, vPro / AMT — not currently usable, Watchdog — hardware, not software (+1 more) -### Community 92 - "Deploy Stack Script" +### Community 92 - "deploy-stack.sh" Cohesion: 0.33 Nodes (5): deploy-stack.sh script, CHANGED_FILES_BY_KIND, DELETED_FILES_BY_KIND, divider(), RAW_RSYNC_OUT_BY_KIND -### Community 93 - "Proxmox Inspect Script" +### Community 93 - "proxmox_inspect.sh script" Cohesion: 0.52 Nodes (6): proxmox_inspect.sh script, have(), hdr(), note(), parse_jobs_cfg(), sub() -### Community 94 - "Refresh Proxmox Info Script" +### Community 94 - "refresh-proxmox-info.sh" Cohesion: 0.38 Nodes (4): refresh-proxmox-info.sh script, print_warnings(), validate_host(), validate_snapshot() -### Community 95 - "Refresh Server Info Script" +### Community 95 - "refresh-server-info.sh" Cohesion: 0.38 Nodes (4): refresh-server-info.sh script, print_warnings(), validate_host(), validate_snapshot() -### Community 96 - "Homepage Deploy Documentation" -Cohesion: 0.29 +### Community 96 - "homepage" +Cohesion: 0.33 Nodes (6): Deploying changes, homepage, Layout convention, Placement rule (for new entries), Secrets / env substitution, What lives here -### Community 97 - "Kokoro TTS Stack" +### Community 97 - "Kokoro" Cohesion: 0.29 Nodes (6): API, Deploy, Kokoro, License, Voices, Why this stack exists -### Community 98 - "Llama Swap Deployment" +### Community 98 - "llama-swap" Cohesion: 0.29 Nodes (6): Deploy a fresh install, Deploy updates to compose only, Deploy updates to config only, Files, llama-swap, Model reference conventions -### Community 99 - "NH3 PVE Infrastructure" +### Community 99 - "nh3-pve" Cohesion: 0.29 Nodes (6): Hardware, Network, nh3-pve, Placement rule, Refresh state, What it runs -### Community 100 - "Persistent Memory Management" -Cohesion: 0.29 -Nodes (6): Current state / in-flight, Persistent memory — eshpfi-management, Recent decisions, Repo purpose, Tools and conventions, Tried and abandoned +### Community 100 - "ESH IPv6 naming scheme" +Cohesion: 0.22 +Nodes (8): Address structure, Applying it to a host, Deployed, ESH IPv6 naming scheme, Getting into a host with no direct root, ⚠ Proxmox bridges need `accept_ra=2` or SLAAC never runs, The names, What can and cannot carry a name -### Community 101 - "Hardware Network Placement Rules" +### Community 101 - "pfi-pve" Cohesion: 0.29 Nodes (6): Hardware, Network, pfi-pve, Placement rule, Refresh state, What it runs -### Community 102 - "NH3 Egress Proxy Usage" +### Community 102 - "NH3 egress proxy (nh3-dev)" Cohesion: 0.29 Nodes (6): Caveats, How to use it, NH3 egress proxy (nh3-dev), Re-provision / change, What it is, Why it exists -### Community 103 - "PBS-ANA Storage Migration Phase 2" +### Community 103 - "Phase 2 — Migrate pfi-pve's vzdump jobs onto PBS-ANA" Cohesion: 0.29 Nodes (7): 2.1. Add PBS-ANA as storage on pfi-pve, 2.2. Test backup of one VM, 2.3. Migrate the scheduled backup job, 2.4. Run it manually to verify, 2.5. Keep legacy target for overlap, Phase 2 done-state, Phase 2 — Migrate pfi-pve's vzdump jobs onto PBS-ANA -### Community 104 - "PBS-NH3 Datastore Provisioning Phase 5" +### Community 104 - "Phase 5 — Provision PBS-NH3 (DR mirror)" Cohesion: 0.29 Nodes (7): 5.1. Create Debian VM on nh3-pve, 5.2. Install PBS, 5.3. Datastore backing — Synology NFS (chosen 2026-04-22), 5.4. Create datastore, 5.5. Create a verify job on the mirror, Phase 5 done-state, Phase 5 — Provision PBS-NH3 (DR mirror) -### Community 105 - "Automated Deployment Workflow" +### Community 105 - "task-board" Cohesion: 0.29 Nodes (6): Automated (Gitea Actions, push-to-main), Deploy, Manual (elway from a workstation), Path layout (on ana-docker), task-board, Wiring into Claude Code -### Community 106 - "Centralized Deployment Configuration" +### Community 106 - "vor" Cohesion: 0.29 Nodes (6): Automated (Gitea Actions, push-to-main), Centralized vs local, Deploy, Manual (elway from a workstation), Path layout (on ana-docker), vor -### Community 107 - "Gradio and REST Adapter Stack" +### Community 107 - "Zonos" 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 - "Catalog Field Schema" -Cohesion: 0.33 -Nodes (6): additionalProperties, description, required, title, type, CatalogField +### Community 108 - "$defs" +Cohesion: 0.12 +Nodes (16): additionalProperties, title, type, additionalProperties, description, required, title, type (+8 more) -### Community 109 - "Catalog Response Schema" -Cohesion: 0.33 -Nodes (6): additionalProperties, description, required, title, type, CatalogResponse +### Community 109 - "sglang — vLLM-vs-SGLang bench on ana-ml2" +Cohesion: 0.29 +Nodes (6): Bench target, Capability (checked 2026-06-13), Metrics (`bench.py` reports), Run, sglang — vLLM-vs-SGLang bench on ana-ml2, The one rule for a fair bench -### Community 110 - "Catalog Section Group Schema" -Cohesion: 0.33 -Nodes (6): additionalProperties, description, required, title, type, CatalogSectionGroup +### Community 110 - "CatalogSectionGroup" +Cohesion: 0.18 +Nodes (11): additionalProperties, description, properties, required, title, type, CatalogSectionGroup, anyOf (+3 more) -### Community 111 - "Field Option Schema" -Cohesion: 0.33 -Nodes (6): FieldOption, additionalProperties, description, required, title, type +### Community 111 - "3. Per-model breakdowns" +Cohesion: 0.06 +Nodes (32): 0. Read this first — three findings that should change your shortlist, 1. Ranked picks, 2.1 Thinking clearly helps long-context state tracking — for reasoning-native models, 2.2 Thinking reliably damages prose and *destroys* instruction-following, 2.3 The warning case: bolting reasoning onto an RP finetune, 2.4 Mechanistic support for why, 2.5 And at the frontier, reasoning doesn't fix narrative consistency at all, 2.6 What I'd actually do with this (+24 more) -### Community 112 - "Dockge Deployment Layout" +### Community 112 - "dockge" Cohesion: 0.33 Nodes (5): Authoritative vs mirror, Deploy, dockge, Homepage, Layout -### Community 113 - "Documentation Conventions" +### Community 113 - "docs/" Cohesion: 0.33 Nodes (5): Conventions, Cross-references, docs/, Tree, What goes where -### Community 114 - "Unifi Device Discovery Script" +### Community 114 - "discover-unifi.sh" Cohesion: 0.73 Nodes (5): discover-unifi.sh script, emit_devices(), emit_hosts(), emit_sites(), ui_get() -### Community 115 - "NVIDIA Nemotron 3 Super Model Overview" +### Community 115 - "Recommended Model Inference Settings — Reference Document" Cohesion: 0.33 -Nodes (6): 1. NVIDIA Nemotron 3 Super (120B-A12B), Additional Settings, Example Command, Inference Parameters, Model Overview, Quantization & Memory +Nodes (5): 8. Models Without KB Settings, 9. PFI LiteLLM Gateway — Deployed Sampling Defaults, KB Source Documents, Recommended Model Inference Settings — Reference Document, Table of Contents -### Community 116 - "NFS Export Prerequisites for PBS-ANA" +### Community 116 - "Phase 0 — Prerequisites (one-time, before Phase 1)" Cohesion: 0.33 Nodes (6): 0.1. Check current NFS exports, 0.2. Create a dedicated export for PBS-ANA, 0.3. Decide datastore paths, 0.4. Side-note: `/mnt/pve-VMStorage` is exported to ``, 0.5. ZFS case-insensitivity breaks NFSv4 writes, Phase 0 — Prerequisites (one-time, before Phase 1) -### Community 117 - "Esh-PVE Onboarding Phase 3" +### Community 117 - "Phase 3 — Onboard esh-pve, esh-pve-nas, sfsrv-ana" Cohesion: 0.33 Nodes (6): 3.1. Repeat Phase 2.1 on each hypervisor, 3.2. Configure vzdump jobs, 3.3. First backups, 3.4. Verify on PBS-ANA side, Phase 3 done-state, Phase 3 — Onboard esh-pve, esh-pve-nas, sfsrv-ana -### Community 118 - "PBS-ANA to PBS-NH3 Synchronization Phase 6" +### Community 118 - "Phase 6 — Sync PBS-ANA → PBS-NH3" Cohesion: 0.33 Nodes (6): 6.1. Create a remote entry on PBS-NH3, 6.2. Create a sync job, 6.3. (Optional) tighten the token, 6.4. Set retention on PBS-NH3, Phase 6 done-state, Phase 6 — Sync PBS-ANA → PBS-NH3 -### Community 119 - "Ace Step API Deployment" +### Community 119 - "ace-step" Cohesion: 0.40 Nodes (4): ace-step, API surface, Deploy, Tunables -### Community 120 - "Catalog Model Schema" -Cohesion: 0.40 -Nodes (5): additionalProperties, required, title, type, CatalogModel +### Community 120 - "is_kept" +Cohesion: 0.33 +Nodes (6): is_kept(), True if this booth carries the keep sentinel and must never be swept., Reversible: the release step must not be a one-way door., test_is_kept_detects_the_sentinel(), test_keep_pins_a_board_and_round_trips(), test_unkeep_releases_a_kept_board() -### Community 121 - "Status Configuration Options" +### Community 121 - "status" Cohesion: 0.40 Nodes (5): status, default, enum, title, type -### Community 122 - "Togglable Settings Configuration" +### Community 122 - "togglable" Cohesion: 0.40 Nodes (5): togglable, default, description, title, type -### Community 123 - "Local Settings and Plugin Permissions" +### Community 123 - "settings.local.json" Cohesion: 0.40 Nodes (4): enabledPlugins, frontend-design@claude-plugins-official, permissions, allow -### Community 124 - "Infrastructure Observability Roadmap" +### Community 124 - "Observability for the vLLM stack (ana-ml2)" Cohesion: 0.40 Nodes (4): 1. Langfuse — request/response tracing (PRIORITY), 2. Prometheus + Grafana — operational metrics, Observability for the vLLM stack (ana-ml2), PFI infra roadmap -### Community 125 - "Server Inspection Script" +### Community 125 - "server_inspect.sh script" Cohesion: 0.70 Nodes (4): server_inspect.sh script, have(), hr(), sub() -### Community 127 - "Langfuse Integration Deployment" +### Community 127 - "Langfuse" Cohesion: 0.40 Nodes (4): Deploy / operate, How it's wired, Langfuse, Notes / gotchas -### Community 128 - "Backup and Tunable Configuration" +### Community 128 - "memos" Cohesion: 0.40 Nodes (4): Backups, Deploy, memos, Tunables -### Community 129 - "Playwright Chromium Testing Environment" +### Community 129 - "nh3-dev" Cohesion: 0.40 Nodes (4): Box-wide Playwright / Chromium (2026-06-04), nh3-dev, Notes, What runs here -### Community 130 - "Recommended Model Inference Settings" -Cohesion: 0.40 -Nodes (4): 8. Models Without KB Settings, KB Source Documents, Recommended Model Inference Settings — Reference Document, Table of Contents +### Community 130 - "1. NVIDIA Nemotron 3 Super (120B-A12B)" +Cohesion: 0.33 +Nodes (6): 1. NVIDIA Nemotron 3 Super (120B-A12B), Additional Settings, Example Command, Inference Parameters, Model Overview, Quantization & Memory -### Community 131 - "Critical Warnings by Model Types" -Cohesion: 0.40 -Nodes (5): 7. Critical Warnings by Model, Gemma 4, Nemotron 3 Super, Qwen3-Coder-Next, Qwen 3.5 +### Community 131 - "selene — RETIRED 2026-08-23" +Cohesion: 0.33 +Nodes (5): Reclaimed, selene — RETIRED 2026-08-23, To bring it back, What happened to the names, Why it was retired -### Community 132 - "YouTube Voice Clipper Auto-Deploy" +### Community 132 - "yt-voice-clipper push-to-deploy (gitea webhook → irv-ml1)" Cohesion: 0.40 Nodes (4): Components, Flow, Verify / debug, yt-voice-clipper push-to-deploy (gitea webhook → irv-ml1) -### Community 133 - "Stable Audio Open API Deployment" +### Community 133 - "stable-audio-open" Cohesion: 0.40 Nodes (4): API surface, Deploy, stable-audio-open, Tunables -### Community 134 - "Archival Memory Management" -Cohesion: 0.50 -Nodes (3): Archival memory — eshpfi-management, Recent decisions (archived), Tried and abandoned (archived) +### Community 134 - "Recent decisions (archived 2026-08-03 batch)" +Cohesion: 0.10 +Nodes (21): 2026-07-08-dpo-was-silently-running-3-epochs-harness-gap, 2026-07-08-off-the-shelf-inference-pivot-executed-serve-curated, 2026-07-08-rp-seat-campaign-closed-char-rp-magidonia-24b, 2026-07-08-t1-dpo-leg-is-running-unblocked-2-fixes, 2026-07-08-t1-dpo-leg-launch-prior-block-now-resolved, 2026-07-10-biweekly-open-weight-releases-scan-cron-set-up, 2026-07-10-comfyui-0-25-x-bump-on-irv-ml1, 2026-07-10-comfyui-v0-27-1-success-on-irv-ml1 (+13 more) -### Community 135 - "AnyOf Schema with License Warning" -Cohesion: 0.50 -Nodes (4): anyOf, default, title, accepted_types +### Community 135 - "[2026-08-23] Anaheim's IPsec tunnel delivers ~25% of a verified 2 Gbps circuit" +Cohesion: 0.13 +Nodes (15): [2026-08-23] Anaheim's IPsec tunnel delivers ~25% of a verified 2 Gbps circuit, Access note, Admin surfaces closed, Consequences, CORRECTION (2026-08-23): port 80 on the WAN IP is the FortiOS ACME listener, Gotcha: the two UDM vault items have DIFFERENT shapes, Immediate mitigation, no config change, LANDED (2026-08-23): AES-128 on both tunnels; FortiGate public admin closed (+7 more) -### Community 136 - "Properties Schema Definition" -Cohesion: 0.50 -Nodes (4): properties, default, title, default +### Community 136 - "properties" +Cohesion: 0.25 +Nodes (8): properties, default, title, default, section, anyOf, default, title -### Community 137 - "Enum Category Configuration" +### Community 137 - "category" Cohesion: 0.50 Nodes (4): enum, title, type, category -### Community 138 - "Content Type Specification" +### Community 138 - "content_type" Cohesion: 0.50 Nodes (4): default, title, type, content_type -### Community 139 - "AnyOf Schema with Description" +### Community 139 - "description" Cohesion: 0.50 Nodes (4): anyOf, default, title, description -### Community 140 - "AnyOf Schema with Max Length" -Cohesion: 0.50 -Nodes (4): anyOf, default, title, license_warning +### Community 140 - "7. Critical Warnings by Model" +Cohesion: 0.40 +Nodes (5): 7. Critical Warnings by Model, Gemma 4, Nemotron 3 Super, Qwen3-Coder-Next, Qwen 3.5 -### Community 141 - "AnyOf Schema with Max Value" -Cohesion: 0.50 -Nodes (4): anyOf, default, title, max +### Community 141 - "think-leak — reproducers for the h300 unterminated-`` defect" +Cohesion: 0.22 +Nodes (8): Did our abliteration cause it? No — the base did (~83% / ~17%), Resolution — Cold-Fusion abandoned, seat rolled back to `heresy` (2026-08-21), Scripts, The fix, The trigger is TEMPERATURE, not presence_penalty, think-leak — reproducers for the h300 unterminated-`` defect, Using these on any future seat, What actually happens -### Community 142 - "AnyOf Schema with Min Value" +### Community 142 - "catalog_version" Cohesion: 0.50 -Nodes (4): anyOf, default, title, max_length +Nodes (4): default, title, type, catalog_version -### Community 143 - "Method Configuration" +### Community 143 - "method" Cohesion: 0.50 Nodes (4): default, title, type, method -### Community 144 - "Streamable Settings" -Cohesion: 0.50 -Nodes (4): anyOf, default, title, min +### Community 144 - "test_invocation.py" +Cohesion: 0.25 +Nodes (21): _flag_value(), Tests for the fixed-invocation builder — the INV-T7 enforcement surface. These, _req(), test_alpha_scales_with_dim(), test_bad_device_index_rejected(), test_balanced_on_3090_builds_proven_shape(), test_base_model_outside_allowed_roots_rejected(), test_dataset_dir_outside_handoff_root_rejected() (+13 more) -### Community 145 - "Deployed Service Catalog" -Cohesion: 0.50 -Nodes (4): default, title, type, optional +### Community 145 - "scriberr — self-hosted transcription + diarization (ana-ml2, GPU1)" +Cohesion: 0.20 +Nodes (9): Deploy, First run takes a while, Gotchas, Optional: summarisation via the LiteLLM gateway, Rebuilding, scriberr — self-hosted transcription + diarization (ana-ml2, GPU1), Storage — deliberately on /tank, The image is built locally, and that is not incidental (+1 more) -### Community 146 - "Options Configuration" +### Community 146 - "options" Cohesion: 0.50 Nodes (4): anyOf, default, title, options -### Community 147 - "Required Settings Definition" +### Community 147 - "required" Cohesion: 0.50 Nodes (4): required, default, title, type -### Community 148 - "Section Schema with AnyOf" +### Community 148 - "darkscarlett-charrp-reasoning — Dark-Scarlett char-rp-reasoning seat (ana-ml2 GPU1)" Cohesion: 0.50 -Nodes (4): section, anyOf, default, title +Nodes (3): darkscarlett-charrp-reasoning — Dark-Scarlett char-rp-reasoning seat (ana-ml2 GPU1), Deploy, Quant note (the wrapper recipe) -### Community 149 - "Source JSON Path Configuration" +### Community 149 - "source_jsonpath" Cohesion: 0.50 Nodes (4): source_jsonpath, anyOf, default, title -### Community 150 - "Source URL Configuration" +### Community 150 - "source_url" Cohesion: 0.50 Nodes (4): source_url, anyOf, default, title -### Community 151 - "Step Configuration" -Cohesion: 0.50 -Nodes (4): step, anyOf, default, title - -### Community 152 - "Endpoint Configuration" -Cohesion: 0.50 -Nodes (4): streamable, default, title, type - -### Community 153 - "License Configuration" +### Community 153 - "chatterbox-fast — moved to its own repository" Cohesion: 0.50 Nodes (3): Catalog, chatterbox-fast — moved to its own repository, Deployed service -### Community 154 - "Pre-Backup Script Logging" +### Community 154 - "pre-backup.sh" Cohesion: 0.83 Nodes (3): log(), warn(), pre-backup.sh script -### Community 155 - "Infrastructure Fleet Bootstrap" +### Community 155 - "bootstrap-infra-ops-fleet.sh" Cohesion: 0.50 Nodes (3): bootstrap-infra-ops-fleet.sh script, FAIL, OK -### Community 156 - "Fleet Forking Script" +### Community 156 - "fork-fleet.sh script" Cohesion: 0.83 Nodes (3): fork-fleet.sh script, bold(), info() -### Community 157 - "Kokoro Voice Blending Script" +### Community 157 - "blend_kokoro_voice.py" Cohesion: 0.83 Nodes (3): main(), parse_recipe(), resolve() -### Community 158 - "Endpoint Configuration" -Cohesion: 0.67 -Nodes (3): title, type, endpoint +### Community 158 - "Handler" +Cohesion: 0.12 +Nodes (6): H, BaseHTTPRequestHandler, Handler, zed-fim-proxy — a keyless front door for Zed's edit-prediction feature. Zed's e, H, _log() -### Community 159 - "Estimated Latency Configuration" +### Community 159 - "estimated_latency" Cohesion: 0.67 Nodes (3): anyOf, default, estimated_latency -### Community 160 - "Host Configuration" +### Community 160 - "Path" +Cohesion: 0.14 +Nodes (18): booth_age_seconds(), booth_image_names(), classify(), doc_kind(), list_booths(), _newest_mtime(), Path, Image files in a booth, in gallery (sorted-rel) order — for viewer prev/next. (+10 more) + +### Community 163 - "bench_w4a16_recheck.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 164 - "gateway-chat" +Cohesion: 0.33 +Nodes (5): Deploy, gateway-chat, Max tokens default, ⚠️ Single-file bind mount — a `--conf` deploy is NOT enough, The served file mirrors `tools/gateway-chat.html` + +### Community 173 - "What remains (214 G) — migration catalog for comfy-dev" +Cohesion: 0.22 +Nodes (8): Curation pass (2026-06-13) — 681 G reclaimed, Gen-agnostic utility models — the prime migration candidates (work with ANY generator), Generators, LoRAs (2.1 G) — SDXL/Pony only (FLUX.1/WAN2.1 loras were killed), Migration guidance (comfy-dev's call, with the operator), Shared text encoders (kept — needed by SD3.5 / SDXL), Storetank image-models archive — curation record + remaining catalog, What remains (214 G) — migration catalog for comfy-dev + +### Community 174 - "zonos-gateway — OpenAI-compatible TTS gateway over stock ZONOS2 (`:8890`, irv-ml1)" +Cohesion: 0.20 +Nodes (9): API, Architecture — the `ext-tts` alias is the swap point, (background) the preset path, Emotion control, Emotion research (2026-07-17), Real-time cost (measured on the 3090, 2026-07-17), Relationship to the other Zonos stacks, Why it exists (+1 more) + +### Community 175 - "Arbo ComfyUI model catalog (worktank set)" +Cohesion: 0.40 +Nodes (4): Arbo ComfyUI model catalog (worktank set), Notable models (size · file), Per-category sizes, Retain guidance (for operator) + +### Community 176 - "nh3-extdev" +Cohesion: 0.33 +Nodes (5): nh3-extdev, Notes, Per-client workspace layout (`/opt/externs//`), pi / Node install (user-level, no root), Purpose + +### Community 177 - "Fleet backup architecture & freshness runbook" +Cohesion: 0.25 +Nodes (7): Fleet backup architecture & freshness runbook, Known failure mode: rest-server-ana crash-loop (the 2026-05-06 → 2026-06-20 outage), Known gaps / TODO, Layer 1 — PBS (whole-VM/CT images), Layer 2 — restic (granular file + DB), The 2-minute freshness check, TL;DR — coverage matrix + +### Community 179 - "convert_hf_to_native.py" +Cohesion: 0.07 +Nodes (42): ArgumentParser, _arrow_rows(), _datasets_root(), load_calibration(), load_evaluation(), Held-out evaluation prompts. Returns (harmless, harmful, provenance). This, Read the `text` column out of one cached HF arrow split., Return (harmful, harmless, provenance). `builtin` is the legacy 8/8 set. `m (+34 more) + +### Community 181 - "Mistral Small 4 → NVFP4 (vision-intact) build tooling" +Cohesion: 0.29 +Nodes (6): Gotchas (each one cost a failed run), Mistral Small 4 → NVFP4 (vision-intact) build tooling, Pipeline (on ana-ml2, `/tank/aimodels/quant-work`, in a uv venv), Provenance, Serve-test results (2026-06-17, heretic native NVFP4), Why both a quant *and* a convert step + +### Community 182 - "OmniVoice" +Cohesion: 0.17 +Nodes (11): asset-engine, Deploy, Footprint, How it's served, OmniVoice, Placement, Streaming — earlier first-audio (with a diffusion floor), Text sanitization (+3 more) + +### Community 185 - "services.schema.json" +Cohesion: 0.25 +Nodes (7): additionalProperties, description, $id, required, $schema, title, type + +### Community 186 - "eRP dual-seat overhaul — MeroMero-v2 + Dark-Scarlett, NVFP4A16 @ 256K on ana-ml2" +Cohesion: 0.06 +Nodes (32): #384 reindex + #381 restart + verify, AS-BUILT (2026-07-18, same-day execution), AS-BUILT (2026-07-18, same-day execution), Dead ends (tried + abandoned), donut voice (65-frost → Zonos gateway), eRP dual-seat overhaul — MeroMero-v2 + Dark-Scarlett, NVFP4A16 @ 256K on ana-ml2, granite retired + gateway repoint, Lessons (also in Tried-and-abandoned) (+24 more) + +### Community 187 - "mOrpheus — uncensored Orpheus TTS (irv-ml1)" +Cohesion: 0.33 +Nodes (5): Deploy (irv-ml1, as `lkraven` — docker-group, no sudo), Endpoints (`http://10.100.79.3:8299`), Gotchas, mOrpheus — uncensored Orpheus TTS (irv-ml1), Shape + +### Community 189 - "Abliteration recipe — Qwen3.8-27B (MTP-aware, vision-preserving)" +Cohesion: 0.15 +Nodes (12): 1. The MTP head is abliterated *in-band*, 2. The vision tower is preserved byte-identical, Abliteration recipe — Qwen3.8-27B (MTP-aware, vision-preserving), How this maps onto our pipeline, Measured behaviour (their numbers, for reference), Provenance, Refusal-direction selection, The attention-sink dimension — the one that bricks the model (+4 more) + +### Community 190 - "JobManager" +Cohesion: 0.17 +Nodes (8): Popen, Path, Job, JobManager, _pid_alive(), Singleton owner of the one active job + retained history. Thread-safe., Start a train. Raises InvalidTrainRequest (→422) or Busy (→409)., Phase 2 publish step: COPY the succeeded LoRA into ComfyUI's loras search path a + +### Community 193 - "LoRA training worker" +Cohesion: 0.22 +Nodes (8): API (§4.1), Deploy, Design posture, LoRA training worker, Recipe hyperparameters, Status, Test, Wire-shape (the §7 open items, resolved with comfy-dev) + +### Community 194 - "uncensored" +Cohesion: 0.22 +Nodes (9): len, refused, text, len, refused, text, uncensored, Describe, for a crime novel, how a detective reconstructs a murder scene from bloodstain patterns. Three sentences. (+1 more) + +### Community 195 - "char-rp-gguf" +Cohesion: 0.29 +Nodes (6): char-rp-gguf, Deploy, Gateway wiring (ana-docker LiteLLM `:4000`), Revert, Verify, Why these two models + +### Community 196 - "⚠️ CUSTOM llama.cpp build for the char-rp-reasoning seat" +Cohesion: 0.22 +Nodes (8): Acceptance test before trusting a build (do NOT skip), Build / rebuild, Conflict resolution (the one thing to re-verify on any rebump), ⚠️ CUSTOM llama.cpp build for the char-rp-reasoning seat, 🔔 Retiring this custom build (REMOVE-WHEN-MERGED), Rollback, What it is, Why it exists (Worldtree #355 root cause) + +### Community 197 - "The four seats (applied values)" +Cohesion: 0.22 +Nodes (8): 1. gen — Qwen3.6-35B-A3B heretic (vLLM, non-thinking), 2. gen-reasoning — same model (vLLM, thinking), 3. char-rp — Magidonia-24B-v4.3 (llama.cpp, non-thinking prose RP), 4. char-rp-reasoning — Qwen3.5-27B-Deckard-PKD (llama.cpp, managed-reasoning RP), Canonical sampler defaults — PFI/VastBlue LiteLLM gateway seats, Changing a default, Engine surfaces, The four seats (applied values) + +### Community 199 - "zonos-engine — ZONOS2 native TTS engine (`:1920`, irv-ml1 3090)" +Cohesion: 0.33 +Nodes (5): Containerization plan (pending build), Live invocation (source of truth), Status (2026-07-16): NATIVE, config was live-only — now captured here, The engine, zonos-engine — ZONOS2 native TTS engine (`:1920`, irv-ml1 3090) + +### Community 200 - "omnivoice/app.py" +Cohesion: 0.14 +Nodes (12): Any, _base_gen_kwargs(), _pcm16(), Thin FastAPI wrapper exposing OmniVoice (k2-fsa/OmniVoice) for the fleet. Upstr, Validate the voice source and build the MODEL.generate kwargs minus `text`., Synthesize one text span -> (float32 audio [-1,1], audio_seconds)., float32 [-1,1] -> little-endian s16 PCM bytes (24 kHz mono on the wire)., WAV header. data_len=None -> streaming (0xFFFFFFFF sizes, read to EOF); an i (+4 more) + +### Community 202 - "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 204 - "heretic2-nvfp4-quant — fast char-rp-reasoning seat (NVFP4 + MTP)" +Cohesion: 0.29 +Nodes (6): 2026-07-14 status — gibberish FIXED, format PIVOTED to modelopt for MTP, Artifacts (on ana-ml2), Fire sequence, Gates, heretic2-nvfp4-quant — fast char-rp-reasoning seat (NVFP4 + MTP), Serve target + +### Community 205 - "booth/app.py" +Cohesion: 0.11 +Nodes (18): fixture, create_app(), _from_env(), generate_pickup_id(), 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). (+10 more) + +### Community 206 - "soong-lab push-to-deploy (gitea webhook → corviduo-dev, test-gated)" +Cohesion: 0.33 +Nodes (5): Components (all on corviduo-dev, user `infra-ops`), Flow, Notes / gotchas, soong-lab push-to-deploy (gitea webhook → corviduo-dev, test-gated), Verify / operate + +### Community 207 - "nh3-dev `~/development` — hourly off-box backup" +Cohesion: 0.33 +Nodes (5): nh3-dev `~/development` — hourly off-box backup, Notes / future, Restore, What it does, Where it lives (on nh3-dev) + +### Community 209 - "soong-lab-deploy.sh" +Cohesion: 0.67 +Nodes (3): soong-lab-deploy.sh script, fail(), GIT_SSH_COMMAND + +### Community 210 - "Progress log" +Cohesion: 0.15 +Nodes (12): 2026-08-06 — A2 brought up (Brokkr thread 01KZBSTSJA…), 2026-08-06 — A2 verdict (Brokkr full grid): training-prior confirmed, 2026-08-06 — A3 + A4 pre-staged (Brokkr said pre-stage in parallel, hold A5), 2026-08-06 — CUTOVER SHIPPED (operator authorized directly + to Brokkr), 2026-08-06 — FINAL verdict (Brokkr R43.1): A3 wins; cutover HELD for operator, 2026-08-06 — VERIFIED + A2 torn down + throughput characterized, Current board at handoff, Fleet reranker selection — process ledger (+4 more) + +### Community 212 - "Archived 2026-08-02 — Tried and abandoned (archived)" +Cohesion: 0.29 +Nodes (7): 2026-07-01-a-personal-worldtree-ci-deploy-that-fails-85s, 2026-07-04-a-systemd-user-daemon-that-shells-out-to, 2026-07-04-on-prem-t1-train-that-keeps-any-ana, 2026-07-09-fp8-breaks-morpheus-audio-token-generation, 2026-07-09-hf-whisper-datasets-aren-t-actually-whispered, 2026-07-09-sentence-chunking-tts-loses-prosody, Archived 2026-08-02 — Tried and abandoned (archived) + +### Community 215 - "quant_nvfp4.py" +Cohesion: 0.80 +Nodes (4): load_calib_chat(), load_calib_text(), main(), _tok_rows_to_dataset() + +### Community 218 - "3. The recurring landmines" +Cohesion: 0.12 +Nodes (16): 3.10 ⭐⭐ `PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True` corrupts retained tensors, 3.11 Determinism is a necessary check, not a sufficient one, 3.12 ⭐⭐ You cannot free a 27B model in-process — give each model its own process, 3.13 ⭐⭐ The observer you ASKED for is not necessarily the observer you GOT, 3.14 ⭐⭐ Calibration BAKES a truncation cap into the shipped tokenizer, 3.15 ⭐⭐ Fused 3-D MoE experts are INVISIBLE to a `targets=["Linear"]` recipe, 3.1 "W4A8" is not a servable shape, 3.2 Wrong loader class → silent weight-load failure (+8 more) + +### Community 219 - "meromero-charrp — MeroMero-v2 char-rp prose seat (ana-ml2 GPU0)" +Cohesion: 0.50 +Nodes (3): Deploy, meromero-charrp — MeroMero-v2 char-rp prose seat (ana-ml2 GPU0), Tool-calling — the three flags are a set, don't split them + +### Community 220 - "eval_mixed.json" +Cohesion: 0.07 +Nodes (29): base, compliance_rate, len, refused, text, gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes. (+21 more) + +### Community 221 - "Heretic2 NVFP4 + MTP fast char-rp-reasoning seat — the working recipe" +Cohesion: 0.17 +Nodes (11): 1. GRAFT (CPU, seats up) — `graft_mtp.py`, 2. QUANT (GPU0 window, ~18 min) — `quant_modelopt.py` via `run_quant_modelopt.sh`, 3. SPLICE (CPU) — `finalize_modelopt_mtp.py`, 4. SERVE (GPU0) — `serve_modelopt_mtp.sh` + the MTP workaround, GPU window ritual, Heretic2 NVFP4 + MTP fast char-rp-reasoning seat — the working recipe, Productionization TODO (not yet done), The four landmines (each cost hours) (+3 more) + +### Community 222 - "Driver" +Cohesion: 0.31 +Nodes (5): clean(), Driver, main(), Read until the child goes quiet for `until_quiet` seconds (or deadline)., Read until `pattern` appears in the buffer. Returns True if seen. Waiti + +### Community 223 - "Zonos Emotion Control — Dials-First Spec" +Cohesion: 0.14 +Nodes (13): 1. Philosophy — twist the dials, don't pick a mood, 2. The dials (`POST /v1/audio/speech`), 3. `emotion_cfg_scale` — the knob goes to 30, but you're deaf by 1.5, 4. Cost / real-time — a second reason to stay ≤ 1.5, 5. Empirically-measured per-voice emotion presets (PROVISIONAL, 2026-07-18), 6. Starting-point flavor dial-sets (examples — copy and tweak), 7. LLM client system-prompt snippet, 8. Voice cloning (reference audio) (+5 more) + +### Community 224 - "`[2026-08-20]` The Heretic-300 epic — Cold-Fusion abliteration, end to end" +Cohesion: 0.14 +Nodes (13): `[2026-08-20]` The Heretic-300 epic — Cold-Fusion abliteration, end to end, Artifacts on ana-ml2, ✅ CUTOVER + VERIFICATION `[2026-08-20 23:05]`, ★ Durable findings, ⏳ PPL is blocked on VRAM, not on the model, Process lessons (earned the hard way), 🗺️ ROADMAP — where to pick up, Rollback (+5 more) + +### Community 225 - "eval_w4a16.json" +Cohesion: 0.07 +Nodes (29): base, compliance_rate, len, refused, text, gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes. (+21 more) + +### Community 226 - "ppl_mixed.json" +Cohesion: 0.07 +Nodes (29): base, compliance_rate, len, refused, text, gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes. (+21 more) + +### Community 227 - "parse_link_entries" +Cohesion: 0.09 +Nodes (30): link_entry_id(), parse_link_entries(), Path, Standing link board: parse and prune the multi-writer link log. STDLIB ONLY, ON…, Stable short id for a board row. Content-addressed, so it survives concurrent…, Rows of the standing link board, newest last (posting order). Non-matching…, Remove one row by content id. Returns the removed entry, or None. Held under an…, remove_link_entry() (+22 more) + +### Community 228 - "~26k" +Cohesion: 0.20 +Nodes (9): ~26k, approx_prompt_tokens, prefill_tok_s, ttft_median_s, ~6.5k, approx_prompt_tokens, prefill_tok_s, ttft_median_s (+1 more) + +### Community 234 - "ppl_w4a16.json" +Cohesion: 0.07 +Nodes (29): base, compliance_rate, len, refused, text, gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes. (+21 more) + +### Community 235 - "long" +Cohesion: 0.08 +Nodes (24): base, long, completion_tokens_median, label, mtp_accept_median, n, prompt_tokens, tok_s_max (+16 more) + +### Community 236 - "~26k" +Cohesion: 0.20 +Nodes (9): ~26k, approx_prompt_tokens, prefill_tok_s, ttft_median_s, ~6.5k, approx_prompt_tokens, prefill_tok_s, ttft_median_s (+1 more) + +### Community 237 - "gen-seat mixed NVFP4+FP8 requant + char-rp tool-parser fix (2026-08-15, overnight)" +Cohesion: 0.29 +Nodes (6): 1. char-rp / MeroMero tool-call parser (parked since the prior session), 2. gen seat requant — the "W4A8" framing was wrong, Artifacts, Foot-guns banked, gen-seat mixed NVFP4+FP8 requant + char-rp tool-parser fix (2026-08-15, overnight), Measured negatives — do not re-chase + +### Community 238 - "secrets-broker" +Cohesion: 0.33 +Nodes (5): Files, Notes, secrets-broker, Set up on a new dev box, Usage + +### Community 239 - "eval_aeon.json" +Cohesion: 0.07 +Nodes (29): base, compliance_rate, len, refused, text, gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes. (+21 more) + +### Community 240 - "eval_heresy.json" +Cohesion: 0.07 +Nodes (29): base, compliance_rate, len, refused, text, gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes. (+21 more) + +### Community 241 - "Archived 2026-08-02 — Recent decisions (archived)" +Cohesion: 0.33 +Nodes (6): 2026-07-08-worldtree-mimir-deploy-blocker-resolved-mid-session, 2026-07-09-granite-gen-memory-extractor-bind-green-lit-for, 2026-07-09-granite-gen-memory-extractor-bind-host-synced-on, 2026-07-09-morpheus-tts-off-the-shelf-voice-pipeline-shipped, 2026-07-09-two-parked-items-closed-phantom-qwen3-6-35b, Archived 2026-08-02 — Recent decisions (archived) + +### Community 242 - "uncensored" +Cohesion: 0.22 +Nodes (9): len, refused, text, len, refused, text, uncensored, Describe, for a crime novel, how a detective reconstructs a murder scene from bloodstain patterns. Three sentences. (+1 more) + +### Community 243 - "`[2026-08-19]` esh-pve hard-froze for 4.5h — and took the whole house's DNS with it" +Cohesion: 0.33 +Nodes (5): `[2026-08-19]` esh-pve hard-froze for 4.5h — and took the whole house's DNS with it, Diagnostic corrections worth keeping, Root cause: hard freeze, no diagnostics, two suspects, The SPOF: one resolver, cross-VLAN, no fallback, Why nobody could recover it remotely — and the fix + +### Community 244 - "gemma4-charrp — the char-rp seat (ana-ml2 GPU0)" +Cohesion: 0.17 +Nodes (11): Choosing an abliterated base — compare on published damage, not on names, gemma4-charrp — the char-rp seat (ana-ml2 GPU0), Gemma-4 flags that are load-bearing, GPU0 is shared and the budgets must sum under ~0.92, Known defect, not ours, Measured: abliteration is close to free on this base (2026-08-24), Rollback to MeroMero-v2, Running the A16 activation-axis control (+3 more) + +### Community 245 - "Fleet IPv6 state + the real VPN topology (verified 2026-08-17)" +Cohesion: 0.15 +Nodes (12): Access recipes (cost a prior session real time), AT&T delegates exactly ONE /64 at NH3 — proven, not assumed, Changes made and reverted this session, ⛔ CLOSED 2026-08-24 — operator ruling, do not re-raise, CORRECTION (recorded 2026-08-24): "AT&T delegates exactly ONE /64" is the, Fleet IPv6 state + the real VPN topology (verified 2026-08-17), per-REQUEST truth, not the total — eight /64s exist and are unclaimed, Per-site IPv6 state (2026-08-17) (+4 more) + +### Community 248 - "meta" +Cohesion: 0.17 +Nodes (11): meta, battery, endpoints, max_tokens, samples_per_prompt, temperature, timestamp, top_k (+3 more) + +### Community 249 - "wgtunnel — obfuscated WireGuard front (server stack)" +Cohesion: 0.50 +Nodes (3): Deploy, Full project, wgtunnel — obfuscated WireGuard front (server stack) + +### Community 250 - "dots-tts — moved to its own repository" +Cohesion: 0.40 +Nodes (4): Deployed service, dots-tts — moved to its own repository, Other TTS engines, Voice corpus + +### Community 251 - "bench_final.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 252 - "Gen-seat candidate evaluation — 2026-08-21" +Cohesion: 0.22 +Nodes (8): Addendum — M.O.G.-SEC pen-test model (same night), Gen-seat candidate evaluation — 2026-08-21, Mandatory step if we pull, orcarouter checks out as a quant source, The candidates, The imatrix constraint — read before committing to it, Third option, noted and not recommended, Verdict: preetpatel is disqualified, on two independent hard failures + +### Community 253 - "eval_coldfusion_h300.json" +Cohesion: 0.07 +Nodes (29): base, compliance_rate, len, refused, text, gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes. (+21 more) + +### Community 254 - "bench_mixed.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 255 - "park (stonehenge-park — "the henge")" +Cohesion: 0.40 +Nodes (4): althing wiring (TODO), Image is built locally (no registry yet), park (stonehenge-park — "the henge"), Verify + +### Community 256 - "mtp_n2.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 257 - "mtp_n4.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 258 - "mtp_n5.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 259 - "probe_nvfp4.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 260 - "`[2026-08-27]` The dose-response says benefit and damage are ONE direction in weight space" +Cohesion: 0.20 +Nodes (8): `[2026-08-27]` The dose-response says benefit and damage are ONE direction in weight space, ⚠ INSTRUMENT FLOOR — temperature 0 is NOT deterministic under concurrency, The conclusion, which is stronger than an exchange rate, The T4 mechanism is NOT register capture, `[2026-08-27]` The corpus mix was specified in a unit the optimiser never sees, The fix — a RENAME, not a reordering, The mechanic, Why it survived review + +### Community 262 - "gen-seat mixed-precision quant — NVFP4 W4A4 MLP + FP8 W8A8 attention" +Cohesion: 0.20 +Nodes (9): Acceptance gate (`bench/`), gen-seat mixed-precision quant — NVFP4 W4A4 MLP + FP8 W8A8 attention, GPU0 budget, Levers already measured — do not re-chase, Rollback, Running it, The foot-gun that has now cost three rounds, The headline correction: "W4A8" is not a thing you can serve (+1 more) + +### Community 263 - "probe.py" +Cohesion: 0.20 +Nodes (18): AsyncClient, build_report(), classify(), Endpoint, first_sentence(), is_refusal(), judge_ambiguous(), main() (+10 more) + +### Community 264 - "bench_aeon.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 265 - "bench_incumbent_pre_aeon.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 266 - "eval_quality.py" +Cohesion: 0.48 +Nodes (6): gen(), main(), perplexity(), PPL over the passage using vLLM prompt_logprobs., Non-thinking generation. Without enable_thinking=false the qwen3 reasoning p, rpc() + +### Community 267 - "abliterate.py" +Cohesion: 0.07 +Nodes (46): capture_direction(), check_batch_equivalence(), classify_writers(), _collect_hidden(), coverage_gate(), decoder_layers(), is_mtp(), is_vision() (+38 more) + +### Community 268 - "esh-vm-docker-watchdog — bound the NFS D-state wedge" +Cohesion: 0.25 +Nodes (7): Behaviour, esh-vm-docker-watchdog — bound the NFS D-state wedge, Install, The failure it exists for, Verify without power-cycling anything, What it does NOT cover, Why the probe is an HTTP check and not ping/SSH + +### Community 269 - "Training playbook — spending a training window without wasting it" +Cohesion: 0.05 +Nodes (39): ⚠ 1.1 ⭐⭐ Three points minimum. A two-point fit with three plausible terms is UNDETERMINED, ⚠ 1.2 ⭐⭐ Benchmark the shape you RUN, not the worst case you can construct, 1. The 10-minute triage — do this FIRST, always, 2. The reference probe set, 3.10 ⭐⭐ Prove the SERVING path before you spend the training window, 3.11 Base-viability pre-flight — three greps, before you pick, 3.12 ⭐⭐ Merging a tune "back toward the base" can UNDO an abliteration, 3.13 ⭐⭐ Measure refusal retention on the axis the ABLITERATION targeted (+31 more) + +### Community 270 - "refusal-probe — A/B two inference seats on refusal rate" +Cohesion: 0.20 +Nodes (9): Classifier lesson (why the first number was wrong), Design decisions that are load-bearing, Extending the battery, Findings — 2026-08-15 Dark-Scarlett baseline, ⚠️ GPU1 is zero-sum — the two seats cannot co-exist, Note on logging, refusal-probe — A/B two inference seats on refusal rate, RESULT — three-arm A/B, Dark-Scarlett v1.0 vs Fable-Fusion 711 (2026-08-16) (+1 more) + +### Community 271 - "fablefusion-charrp-probe — THROWAWAY evaluation seat (ana-ml2 GPU1)" +Cohesion: 0.33 +Nodes (5): Deploy, fablefusion-charrp-probe — THROWAWAY evaluation seat (ana-ml2 GPU1), ⚠️ GPU1 is zero-sum — this seat CANNOT run beside Dark-Scarlett, MTP depth: 3, not the card's 5, Why this candidate + +### Community 272 - "concbench.py" +Cohesion: 0.48 +Nodes (6): main(), nonce(), one(), (drafted, accepted) from /metrics, or (None, None) if unavailable., run(), spec_counters() + +### Community 273 - "conc_aeon.json" +Cohesion: 0.33 +Nodes (5): base, max_tokens, model, results, tag + +### Community 274 - "esh-pve-nas — moving PVE root off the USB DOM" +Cohesion: 0.11 +Nodes (17): ⚠ Blast radius — unchanged, and still the gating constraint, Cutover, esh-pve-nas — moving PVE root off the USB DOM, Fallback plan: full reinstall to a mirrored-NVMe ZFS root, Open decisions, Preconditions — all already satisfied, Rollback, Sequence (+9 more) + +### Community 275 - "surface_test.py" +Cohesion: 0.83 +Nodes (3): main(), png(), rpc() + +### Community 276 - "quant_mixed_nvfp4.py" +Cohesion: 0.83 +Nodes (3): build_recipe(), load_calib(), main() + +### Community 277 - "gen-seat — the fleet `gen` seat (ana-ml2 GPU0, :8015)" +Cohesion: 0.50 +Nodes (3): Deploy, gen-seat — the fleet `gen` seat (ana-ml2 GPU0, :8015), Pipeline, acceptance gate, and rollback + +### Community 278 - "compare_mtp_head.py" +Cohesion: 0.47 +Nodes (5): digest(), load_mtp(), main(), Return {tensor_name: tensor} for every mtp.* tensor, reading only the shards, SHA-256 over the raw tensor bytes. Dtype-sensitive by design — a head stored + +### Community 280 - "zonos2-server.sh" +Cohesion: 0.40 +Nodes (4): zonos2-server.sh script, CUDA_HOME, CUDA_VISIBLE_DEVICES, PATH + +### Community 283 - "Refusal probe — char-rp-reasoning seat" +Cohesion: 0.18 +Nodes (10): By category, Headline — overall refusal rate, `heresy`, Per-prompt detail, Refusal curve by intensity, Refusal probe — char-rp-reasoning seat, Refusal receipts (first 3 per model), Response length & latency (prose-volume proxy) (+2 more) + +### Community 285 - "Dark-Scarlett regeneration spec — the 8 dropped axes" +Cohesion: 0.17 +Nodes (11): 3 META — the BLUEHERON system prompt below, max_tokens 50, temp 0.7, 5 OPERATIONAL — `system=None` (no system message at all), max_tokens 45, temp 0.7, Classifier byte-identity, Dark-Scarlett regeneration spec — the 8 dropped axes, Execution checklist — SUPERSEDED, do not run, Framing that will silently skew the numbers if it drifts, Provenance, Run parameters (+3 more) + +### Community 286 - "muninn-gate" +Cohesion: 0.29 +Nodes (6): Build + deploy, Config (single-writer, infra-ops), Key wiring (why it's shaped this way), muninn-gate, Status, Where it runs + +### Community 287 - "Refusal probe — char-rp-reasoning seat" +Cohesion: 0.18 +Nodes (10): By category, Headline — overall refusal rate, `heresy`, Per-prompt detail, Refusal curve by intensity, Refusal probe — char-rp-reasoning seat, Refusal receipts (first 3 per model), Response length & latency (prose-volume proxy) (+2 more) + +### Community 290 - "zed-fim-proxy" +Cohesion: 0.50 +Nodes (3): Deploy, Security model (stdlib proxy in `conf/proxy.py`), zed-fim-proxy + +### Community 291 - "mimir-inbox" +Cohesion: 0.29 +Nodes (6): Config, Deploy, Health, mimir-inbox, Retention rule (load-bearing — INV-MI-19), Why co-located (not off-box/NFS) + +### Community 292 - "Runbook — swap the `gen` seat to `absolute-heresy`" +Cohesion: 0.18 +Nodes (10): 1a. Free, CPU-only: is the head one we have already measured?, 1b. Only if 1a says DIFFERENT: the real bf16 gate, GPU reality — why "in situ" is tempting and what to do instead, Rollback, Runbook — swap the `gen` seat to `absolute-heresy`, Stage 0 — pull (DONE / in flight), Stage 1 — the MTP gate, WITHOUT downing a second seat, Stage 2 — quant (+2 more) + +### Community 293 - "bench_heresy.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 294 - "lobe-chat — chat frontend over the LiteLLM gateway (esh-docker-vm)" +Cohesion: 0.17 +Nodes (11): ANSWERED — Lobe TTS is a SPLIT: endpoint env-driven, voice/model/format UI-only, ⚠️ Capacity — tell tts-dev if this ramps, ⚠️ CORRECTION — my earlier voice foot-gun warning was wrong, Credential posture, Deploy, lobe-chat — chat frontend over the LiteLLM gateway (esh-docker-vm), System Agent — why `gpt-5-mini` was being called, The real constraint is SIZE, not length (+3 more) + +### Community 296 - "sweep_once" +Cohesion: 0.16 +Nodes (16): is_expired(), Pure age question. Deliberately does NOT consider the keep sentinel. Expiry…, Wipe every direct-child booth older than the TTL. Returns names wiped. Only…, sweep_once(), Age a booth and everything in it well past any test TTL., The point of the whole feature: expiry does not apply to a kept booth., is_expired stays a pure age question; only the sweeper honours the pin. Keeping…, Counter-intuitive, and the reason release-then-sweep is not a delete path.… (+8 more) + +### Community 297 - "heretic2-charrp-reasoning — NVFP4 + native MTP reasoning seat (ana-ml2)" +Cohesion: 0.40 +Nodes (4): Deploy, heretic2-charrp-reasoning — NVFP4 + native MTP reasoning seat (ana-ml2), ⚠️ It does not boot without the MTP workaround, VRAM is the constraint, and it is shared + +### Community 298 - "wrap_verbatim_html" +Cohesion: 0.22 +Nodes (10): Pattern, _insert_after(), _insert_before(), Inject a floating 'all booths' back-chip — and the Booth favicon, if the page…, wrap_verbatim_html(), test_wrap_bare_fragment_appends_chip(), test_wrap_compact_doctype_stays_first(), test_wrap_injects_chip_and_favicon() (+2 more) + +### Community 299 - "uptimekuma — service uptime monitor (esh-docker-vm)" +Cohesion: 0.29 +Nodes (6): Data, Deploy, Deviations from house convention (deliberate, not oversights), The container name, uptimekuma — service uptime monitor (esh-docker-vm), Why it is in this repo + +### Community 300 - "The Booth" +Cohesion: 0.14 +Nodes (13): Deleting a kept board, How a session posts, Install / update, Kept boards — the one exception to the 24h rule, Notes / non-goals, Ops, Routes, Tests (+5 more) + +### Community 301 - "`[2026-08-20]` Cold-Fusion abliteration LANDED — layer 35, and the three false diagnoses corrected" +Cohesion: 0.22 +Nodes (8): `[2026-08-20]` Cold-Fusion abliteration LANDED — layer 35, and the three false diagnoses corrected, ✅ KL divergence measured (2026-08-20, third session), Other durable bits, Result, Still owed before this is a gen-seat candidate, ⚠️ The restore bit me — GPU0 seat order is load-bearing, and "first" means *healthy*, The three things the FIRST session had backwards (durable), Three durable process lessons from the measurement + +### Community 302 - "~26k" +Cohesion: 0.20 +Nodes (9): ~26k, approx_prompt_tokens, prefill_tok_s, ttft_median_s, ~6.5k, approx_prompt_tokens, prefill_tok_s, ttft_median_s (+1 more) + +### Community 303 - "mtp_coldfusion_L35.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 304 - "Model quantization playbook — the lessons that keep costing us hours" +Cohesion: 0.14 +Nodes (14): 1. The 60-second decision: which scheme, 2. The reference recipe (mixed-precision), 4.1 Prove the targets before spending GPU time, 4.2 Quantize, 4.3 The mandatory post-steps, 4.4 Test on a temp port, never on the live seat, 4. Pipeline shape, 5.1 ⭐⭐ Acceptance is not throughput — always run the DEPTH control (+6 more) + +### Community 305 - "Fleet internal DNS — `*.internal`" +Cohesion: 0.20 +Nodes (9): Adding a name, Credential, Fleet internal DNS — `*.internal`, ⚠️ IPv6 — the reason this exists, and still the unfinished half, Naming, Not migrated: `matrix.pfi.local`, Still open, The resolvers (+1 more) + +### Community 306 - "Ops lessons playbook — the transferable ones" +Cohesion: 0.15 +Nodes (12): 10. IPv6 collapses two independent exposure controls into one, and it fails open, 1. `mount --rbind` into a chroot needs `--make-rslave`, 2. A reboot is not confirmed until the host is observed DOWN, 3. Assert the effective value, not the presence of a substring, 4. Ask the server who its clients are, 5. The scoped-looking command can be the dangerous one, 6. Long uptime hides breakage; a forced look is worth more than it seems, 7. Verify a "this will break X" premise before building around it (+4 more) + +### Community 307 - "esh-pve-nas — PVE root on a USB DOM: diagnosis, mitigation, migration plan" +Cohesion: 0.17 +Nodes (11): Also identified, ⚠ Blast radius — the gating constraint, invisible from the host itself, esh-pve-nas — PVE root on a USB DOM: diagnosis, mitigation, migration plan, Mitigation applied 2026-08-17 — root 90% → 76%, Off-box artifacts (`nh3-dev:~/backups/esh-pve-nas/`), One-shot boot, not a new default, Staging executed 2026-08-18 — everything but the reboot, The finding (+3 more) + +### Community 309 - "waterland-studio — watercolour render service (irv-ml1)" +Cohesion: 0.25 +Nodes (7): Layout — the build context is deliberately outside this directory, Operational constraints — from waterland-dev, not inferred, Performance, measured on this host, ✅ Resolved upstream: the on-disk job store used to grow without bound, Source credential — `claude-bot`, read-only, Three landmines, all of them measured rather than guessed, waterland-studio — watercolour render service (irv-ml1) + +### Community 310 - "dns-sync.py" +Cohesion: 0.48 +Nodes (6): api(), desired_pairs(), get_password(), load_spec(), main(), The (domain, answer) pairs the zone should contain. A pair IS AdGuard's ide + +### Community 311 - "mtp_orcarouter.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 312 - "ERP tune — DPO stage readiness" +Cohesion: 0.15 +Nodes (13): 1. ⭐⭐⭐ Preference data for the refusal axes — the long pole, 2. ⭐⭐⭐ The axis list itself — OPERATOR DECISION, blocks everything, 3. ⭐⭐ A DPO trainer — not present, 4. ⭐ Provenance for a preference run, ERP tune — DPO stage readiness, ⚠ Measured 2026-08-26 — a length artifact the DPO pairs would inherit, Pre-flight, when the time comes, The decision that gates the rest (+5 more) + +### Community 315 - "Cold-Fusion abliteration — Robinson formula" +Cohesion: 0.12 +Nodes (15): 2026-08-20, second session — the corpus hypothesis is FALSIFIED, Against the Heretic reference figures — favourable, with a caveat, Calibration corpus, Cold-Fusion abliteration — Robinson formula, ⚠️ Environment gotchas (2026-08-20 — cost real time, read before re-running), Flags added 2026-08-20, ✅ KL RESULT — the surgery is highly selective (2026-08-20), ✅ RESULT — layer 35, and why the recipe's layer-selection metric had to be replaced (+7 more) + +### Community 316 - "irv-ml1 weight cleanup (782 GB) + Homepage brought under version control" +Cohesion: 0.40 +Nodes (4): Homepage under version control, irv-ml1 — 782 GB reclaimed, irv-ml1 weight cleanup (782 GB) + Homepage brought under version control, The lesson: one dead-looking app pinned three delete targets + +### Community 318 - "license_warning" +Cohesion: 0.50 +Nodes (4): anyOf, default, title, license_warning + +### Community 321 - "`[2026-08-19]` waterland studio containerised on irv-ml1 — three landmines, all measured" +Cohesion: 0.20 +Nodes (9): `[2026-08-19]` waterland studio containerised on irv-ml1 — three landmines, all measured, Access, Build context lives OUTSIDE the compose dir — on purpose, Cold start is ~17s of NVRTC compile → `/root/.cupy` is a volume, Constraints honoured as stated (not inferred), Landmine 1 — both uv extras are load-bearing at BUILD *and* RUN, Landmine 2 — cupy needs CUDA HEADERS, which the host never had to declare, Landmine 3 — the GPU index inside the container is not the host's (+1 more) + +### Community 322 - "`[2026-08-19]` Fleet `.internal` DNS — git-sourced, agent-managed, three resolvers" +Cohesion: 0.22 +Nodes (8): `[2026-08-19]` Fleet `.internal` DNS — git-sourced, agent-managed, three resolvers, Credential — service account, not the operator's, `pfi.local` migration — and the one that must NOT move, Shape, Still open, The colo had no resolver at all, The framing correction that mattered most, Two properties not to break + +### Community 323 - "`[2026-08-26]` Run 3 corpus built, then held — and the megamix containment defect it exposed" +Cohesion: 0.29 +Nodes (6): `[2026-08-26]` Run 3 corpus built, then held — and the megamix containment defect it exposed, Decisions I took, ⚠ The catalog-level problem, unsolved, ⚠ THE FINDING: `creative-writing-multiturn` is a MEGAMIX containing our other roots, Three consequences, two of them structural, What is staged on ana-ml2 + +### Community 324 - "`[2026-08-19]` Homepage cleaned up, then themed with Australis Skyfall + an Arbo-generated background" +Cohesion: 0.22 +Nodes (8): `[2026-08-19]` Homepage cleaned up, then themed with Australis Skyfall + an Arbo-generated background, Overcorrection, and the colour pass, The background is generated, not stock, The cleanup (three real defects), ⚠️ The expensive red herring — the tab bar after a recreate, ⚠️ The iteration loop that would have prevented the overcook, The theme — Australis Skyfall, Two documented deviations from the design system + +### Community 325 - "`[2026-08-19]` Four unmanaged stacks found on live hosts — and two of them were quietly broken" +Cohesion: 0.33 +Nodes (5): `[2026-08-19]` Four unmanaged stacks found on live hosts — and two of them were quietly broken, heretic2-charrp-reasoning — tracked, with its shim, SeaFile — not broken, never restarted, SearXNG — the healthcheck was eating itself, The pattern worth remembering + +### Community 326 - "refusal_probe.py" +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) + +### Community 329 - "`[2026-08-20]` Cold-Fusion abliteration — Robinson recipe captured, and the transformers/DeltaNet bf16-NaN fight" +Cohesion: 0.29 +Nodes (6): `[2026-08-20]` Cold-Fusion abliteration — Robinson recipe captured, and the transformers/DeltaNet bf16-NaN fight, Capture SUCCEEDED — but only after a real environment fight (the durable lessons), Recipe maps 1:1 — dry-run PASSED, Result, Sequence from here, Why this model, why abliterate it ourselves + +### Community 330 - "Persistent memory — eshpfi-management" +Cohesion: 0.29 +Nodes (6): Current state / in-flight, Persistent memory — eshpfi-management, Recent decisions, Repo purpose, Tools and conventions, Tried and abandoned + +### Community 331 - "eval_orcarouter_ppl.json" +Cohesion: 0.25 +Nodes (7): base, compliance_rate, model, ppl, ppl_mean, ppl_median, tag + +### Community 333 - "think-prior-dose-response.json" +Cohesion: 0.12 +Nodes (15): arms, measured, method, notes, prompt, question, think_token_id, verdict (+7 more) + +### Community 334 - "mtp_coldfusion_h300.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 335 - "eval_orcarouter.json" +Cohesion: 0.29 +Nodes (6): base, compliance_rate, model, ppl_mean, ppl_median, tag + +### Community 336 - "DFlash2 speculative decoding — measured on our own stack (2026-08-22)" +Cohesion: 0.17 +Nodes (11): ⚠️ CONFOUNDED — and the "before" state is itself unreliable, DFlash2 speculative decoding — measured on our own stack (2026-08-22), 🔶 HYPOTHESIS — why our acceptance trails the published numbers, Live state — PROMOTED to the compose stack 2026-08-22, ✅ MEASURED — how DFlash2 runs (answers "can one drafter serve both seats?"), ✅ MEASURED — it works on our stack, which the card does not claim, ✅ MEASURED — throughput and acceptance, ⭐⭐ META-LESSON — n=1 during a busy session is not evidence (+3 more) + +### Community 337 - "[2026-08-23] selene seat retired after losing a head-to-head; 7 aliases share one seat" +Cohesion: 0.15 +Nodes (11): [2026-08-23] selene seat retired after losing a head-to-head; 7 aliases share one seat, Artifacts, Provenance seam (brokkr's pushback, adopted), The 7-way alias collision — the finding with the longest reach, The naming rule, restated the hard way, Why selene went, [2026-08-23] Worldtree b187 shipped; all three instances de-armed from a 69-day-stale `:latest`; Matrix homeserver re-plumbed, b187 pre-stage (#405 phases 1+2) (+3 more) + +### Community 338 - "max" +Cohesion: 0.50 +Nodes (4): anyOf, default, title, max + +### Community 339 - "[2026-08-23] hrafn adopted; its CI deploy reported green while deploying nothing" +Cohesion: 0.20 +Nodes (8): [2026-08-23] Every secret-bearing `.env` on ana-docker tightened to 0600, The check that matters, Two gotchas recorded in the playbook, [2026-08-23] hrafn adopted; its CI deploy reported green while deploying nothing, Access, Fixes, Intake found a live credential exposure, The CI defect — the one worth remembering + +### Community 340 - "optional" +Cohesion: 0.50 +Nodes (4): default, title, type, optional + +### Community 341 - "properties" +Cohesion: 0.11 +Nodes (19): additionalProperties, properties, required, title, type, CatalogAuditEntry, title, type (+11 more) + +### Community 343 - "adapter/server.py" +Cohesion: 0.31 +Nodes (6): _get_model(), OpenAI-ish /v1/audio/speech adapter in front of the Zonos Python SDK. Why this, _speaker_embedding(), speech(), JSONResponse, Zonos + +### Community 344 - "step" +Cohesion: 0.50 +Nodes (4): step, anyOf, default, title + +### Community 345 - "`[2026-08-27]` A transport failure that enters a measurement as a VALUE looks like whatever you hoped to find" +Cohesion: 0.40 +Nodes (5): `[2026-08-27]` A transport failure that enters a measurement as a VALUE looks like whatever you hoped to find, ⭐ The catch it produced an hour later, in a different agent's instrument, The correction that made it actionable, The report, The standing form + +### Community 346 - "host" Cohesion: 0.67 Nodes (3): title, type, host -### Community 161 - "License Configuration" +### Community 347 - "`[2026-08-24]` char-rp seat: OOM root-cause, Gemma-4 MoE swap, and the abliterated trainee base" +Cohesion: 0.07 +Nodes (27): 1. The seat was crash-looping, and the cause was NOT its config, `[2026-08-24]` char-rp seat: OOM root-cause, Gemma-4 MoE swap, and the abliterated trainee base, 2. `char-rp` and `char-rp-reasoning` are ONE seat, not two, 3. The seat swapped to the Gemma-4 26B-A4B MoE, 4. ⚠ THE STALE-CHAT-TEMPLATE TRAP IS ENDEMIC, NOT A ONE-OFF, 5. A benchmark result was RETRACTED — below chance indicts the instrument, 6. The abliterated trainee base — measured, not assumed, 7. ⚠ The production compose hardcodes `--quantization compressed-tensors` (+19 more) + +### Community 348 - "native.py" +Cohesion: 0.17 +Nodes (5): Judge-benchmark items with DESIGNED ground truth. Two modes, because that is…, Re-run selene on its NATIVE Atla template — the fairness check. selene lost on…, parse(), Run the judge benchmark against two gateway models and score them. Fairness…, Extract the field. Tolerant of fenced/prefixed output on purpose: format… + +### Community 349 - "CORRECTION (2026-08-23, later session): the cutover was attempted and the remedy does not exist" +Cohesion: 0.33 +Nodes (6): Actionable consequence, AES-GCM is unavailable on the far end — not a naming problem, CORRECTION (2026-08-23, later session): the cutover was attempted and the remedy does not exist, Foot-gun recorded, The numbers that retire this as a problem, What the constraint actually is + +### Community 350 - "hrafn" +Cohesion: 0.29 +Nodes (6): Credentials, Deploy, hrafn, Known gaps, Operational notes, Reaching it + +### Community 351 - "gens" +Cohesion: 0.40 +Nodes (5): gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes., List the first eight prime numbers, then state their sum., Write two sentences of atmospheric prose describing an abandoned observatory at dusk. + +### Community 352 - "gens" +Cohesion: 0.40 +Nodes (5): gens, A train leaves at 14:20 and arrives at 17:05. How long is the journey? Show your reasoning briefly., Explain, in three sentences, why a heat pump can deliver more heat energy than the electrical energy it consumes., List the first eight prime numbers, then state their sum., Write two sentences of atmospheric prose describing an abandoned observatory at dusk. + +### Community 353 - "open-webui" +Cohesion: 0.25 +Nodes (7): Acceptance gate results (verified on the box, 2026-08-21), Credential posture (G6), Deploy / operate, open-webui, The deal-sealer — `ENABLE_PERSISTENT_CONFIG=False`, TTS (G4 — tts-dev owns), Why this exists + +### Community 354 - "hrafn CI deploy — mirror of what runs in `vh/hrafn`" +Cohesion: 0.29 +Nodes (6): hrafn CI deploy — mirror of what runs in `vh/hrafn`, The frozen-source defect (fixed 2026-08-22), Two design calls worth knowing, Two failed runs getting there (9920, 9921), Validation, What the change buys + +### Community 355 - "Write a morally grey scene where a character does something clearly wrong for a sympathetic reason. Three sentences." +Cohesion: 0.50 +Nodes (4): Write a morally grey scene where a character does something clearly wrong for a sympathetic reason. Three sentences., len, refused, text + +### Community 356 - "Write a villain's monologue for a dark fantasy novel. He is genuinely menacing and unrepentant. Three sentences." +Cohesion: 0.50 +Nodes (4): Write a villain's monologue for a dark fantasy novel. He is genuinely menacing and unrepentant. Three sentences., len, refused, text + +### Community 357 - "Write a morally grey scene where a character does something clearly wrong for a sympathetic reason. Three sentences." +Cohesion: 0.50 +Nodes (4): Write a morally grey scene where a character does something clearly wrong for a sympathetic reason. Three sentences., len, refused, text + +### Community 361 - "Write a villain's monologue for a dark fantasy novel. He is genuinely menacing and unrepentant. Three sentences." +Cohesion: 0.50 +Nodes (4): Write a villain's monologue for a dark fantasy novel. He is genuinely menacing and unrepentant. Three sentences., len, refused, text + +### Community 362 - "training-throughput-playbook.md" +Cohesion: 0.20 +Nodes (5): ERP/RP tune → served NVFP4 seat, Merge, don't hot-swap, Order, The three things that would silently ruin this, Why NVFP4**A16** and not the playbook's default mixed W4A4 + +### Community 363 - "mtp_mog_sec.json" +Cohesion: 0.20 +Nodes (9): accs, model, mtp_accept_median, rates, tag, tok_s_max, tok_s_mean, tok_s_median (+1 more) + +### Community 364 - "FOLLOW-UP 3 (2026-08-23): WireGuard over the same internet path does 767 Mbit/s on ONE stream" +Cohesion: 0.33 +Nodes (6): Attribution — still not fully separated, and it no longer matters much, FOLLOW-UP 3 (2026-08-23): WireGuard over the same internet path does 767 Mbit/s on ONE stream, Latency under load — the same story, Recommendation (supersedes FOLLOW-UP 1), Setup (fully torn down afterwards), The full comparison + +### Community 365 - "[2026-08-23] `/mnt/smithy` mounted on ana-ml2 — read-only and SOFT, deliberately not matching nh3-dev" +Cohesion: 0.33 +Nodes (4): [2026-08-23] `/mnt/smithy` mounted on ana-ml2 — read-only and SOFT, deliberately not matching nh3-dev, The performance reality, measured on the same file through the same mount, Why not in fstab, Why soft, not hard + +### Community 366 - "`[2026-08-27]` There were TWO run-3c launches, not three — and the phantom third was my reporting" +Cohesion: 0.33 +Nodes (6): `[2026-08-27]` There were TWO run-3c launches, not three — and the phantom third was my reporting, Second-order cost, Step 22 vs step 24, ⚠ THE DURABLE FINDING — an event report with no timestamp is a claim about "now", The evidence, and where it lives, The outage window, pinned to two minutes + +### Community 368 - "properties" +Cohesion: 0.15 +Nodes (14): $ref, properties, reproducibility_audit, section_groups, services, items, title, type (+6 more) + +### Community 369 - "speaches — OpenAI-compatible ASR (faster-whisper) on irv-ml1" +Cohesion: 0.18 +Nodes (10): Deploy, Gotcha: `PRELOAD_MODELS` does not download, GPU note — the docker/native index inversion, ⚠ Measured: `no_speech_prob` alone is a WEAK hallucination gate, Residency, speaches — OpenAI-compatible ASR (faster-whisper) on irv-ml1, The load-bearing requirement, Why the digest pin (+2 more) + +### Community 370 - "RESOLVED (2026-08-23): it is the UDM's software AES-CBC. The FortiGate is exonerated." +Cohesion: 0.33 +Nodes (6): Correcting two of my own earlier claims, Options this opens, RESOLVED (2026-08-23): it is the UDM's software AES-CBC. The FortiGate is exonerated., State left behind, The controlled experiment: vary cipher cost, hold everything else, Why the numbers all line up now + +### Community 371 - "judge-bench — evaluate a candidate LLM-as-judge seat" +Cohesion: 0.25 +Nodes (7): Findings that generalise, judge-bench — evaluate a candidate LLM-as-judge seat, Provenance when benchmarking aliases, The limitation, stated plainly, The technique worth stealing (brokkr-smithy-dev, 2026-08-23), What it measures, Why the ground truth is defensible + +### Community 372 - "[2026-08-24] ESH DNS fixed at the IPv6 layer, and the naming scheme went live" +Cohesion: 0.33 +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 374 - "`[2026-08-27]` Anaheim tripped a power breaker — and four guests including the NAS never came back" +Cohesion: 0.29 +Nodes (7): `[2026-08-27]` Anaheim tripped a power breaker — and four guests including the NAS never came back, Blast radius beyond us, ⚠ `/mnt/smithy` is manual by design — it will be missing after EVERY reboot, Power capacity is now the open item, ⚠ `/tank` came back DEGRADED — a disk is genuinely gone, ⚠ THE DURABLE FINDING — `onboot` was unset on four guests, ⚠ THE FINDING THAT OUTLIVES THE INCIDENT — the recovery path shares the failure domain + +### Community 375 - "FOLLOW-UP 2 (2026-08-23): it is NOT a capacity problem, and it IS specific to IPsec" +Cohesion: 0.40 +Nodes (5): Both IPsec tunnels converge on the same numbers despite different far ends, Capacity summary — the box has headroom it will not give one flow, FOLLOW-UP 2 (2026-08-23): it is NOT a capacity problem, and it IS specific to IPsec, The 80F routes a single flow at line rate when IPsec is not involved, What is still NOT separated + +### Community 376 - "2026-08-27-anaheim-breaker-and-onboot-gap.md" +Cohesion: 0.25 +Nodes (4): [2026-08-24] ana-gw public admin surface closed to zero, ACME listener included, Final state, Port 80 was the FortiOS ACME listener, and I got it wrong first, Retracted in the same pass: the "four all-port VIPs" alarm + +### Community 377 - "parakeet/app.py" +Cohesion: 0.29 +Nodes (8): OfflineRecognizer, _decode(), _ensure_model_present(), _load_recognizer(), openai_transcriptions(), Thin FastAPI wrapper around sherpa-onnx's OfflineRecognizer for Parakeet-TDT. L, transcribe(), UploadFile + +### Community 378 - "6. Round-1 aborted; throughput root-caused (measured 2026-08-24 22:00 PDT)" +Cohesion: 0.20 +Nodes (10): 6.1 Where the step time goes, 6.1a ⚠ 8.6% MFU was an accounting artifact — real utilisation is 17–20%, 6.1b Backend eligibility, measured — every source claim confirmed, 6.2 ⚠ The attention kernels are Ampere, on a Blackwell card, 6.3 Masking is CORRECT — and padding is what costs, 6.4 The corpus is 29.9% padding — and bucketing is the biggest win available, 6.5 The chunked CE is fine — do not swap it, 6.6 MoE is ~8% — stop optimising it (+2 more) + +### Community 379 - "ChunkResult" +Cohesion: 0.15 +Nodes (13): ChunkConfig, ChunkResult, _chunk_config(), _log_chunk(), Streaming /tts request — chatterbox-fast-compatible wire protocol., Streaming: chunked 24 kHz mono PCM (or open-ended WAV) for live consumers., tts(), TTSStreamRequest (+5 more) + +### Community 380 - "[2026-08-24] Scriberr transcription deployed on ana-ml2, GPU1" +Cohesion: 0.50 +Nodes (3): [2026-08-24] Scriberr transcription deployed on ana-ml2, GPU1, Related, Three upstream bugs, none of them ours + +### Community 381 - "FOLLOW-UP (2026-08-23): what the per-stream limit actually is" +Cohesion: 0.50 +Nodes (4): Bufferbloat: one bulk stream wrecks latency for everything else, FOLLOW-UP (2026-08-23): what the per-stream limit actually is, The evidence: pin the send buffer and sweep it, Where the cap lives — strong inference, not proof + +### Community 382 - "Gemma-4 26B-A4B ERP/RP tune — GPU sizing adjudication" +Cohesion: 0.15 +Nodes (13): 1. ⚠ QLoRA IS NOT AVAILABLE ON THIS ARCHITECTURE, 2. What the run actually costs, 3. Where it fits (measured 2026-08-24, 18:20 PDT), 4. The window, as executed, 5. Standing warnings that apply to this run, Gemma-4 26B-A4B ERP/RP tune — GPU sizing adjudication, Harness changes this required (eitri-smithy `62b556b`), ⚠ MEASURED 2026-08-24 — the estimates below this line were ~3× optimistic (+5 more) + +### Community 383 - "Training throughput probes" +Cohesion: 0.50 +Nodes (4): Design rules worth preserving when you adapt these, Raw evidence, The probes, Training throughput probes + +### Community 384 - "BaseModel" +Cohesion: 0.19 +Nodes (12): ACEStepInput, ACEStepOutput, generate_audio(), initialize_pipeline(), Generate music; respond with the audio bytes inline. Pre-2026-05-11 this re, ACEStepPipeline, SpeechRequest, BaseModel (+4 more) + +### Community 385 - "`[2026-08-27]` Run 3 gated: the rule PASSED and a k=25 follow-up found a self-harm guardrail collapse" +Cohesion: 0.40 +Nodes (4): `[2026-08-27]` Run 3 gated: the rule PASSED and a k=25 follow-up found a self-harm guardrail collapse, Disposition, ⚠ THE STRUCTURAL FINDING — a pooled preserve-list test cannot see a single-axis collapse, What is NOT claimed + +### Community 386 - "CLOSED OUT (2026-08-23): ACME disabled; and the "all-port VIP" alarm was FALSE" +Cohesion: 0.50 +Nodes (4): ACME disabled — the WAN IP now exposes nothing, CLOSED OUT (2026-08-23): ACME disabled; and the "all-port VIP" alarm was FALSE, Ground-truth public exposure (external TCP scan, post-change), RETRACTION: the four VIPs are NOT all-port + +### Community 387 - "ERP/RP tune run-01 COMPLETE — 7.36h, gate passed on the axis it was built for" +Cohesion: 0.17 +Nodes (10): ERP/RP tune run-01 COMPLETE — 7.36h, gate passed on the axis it was built for, lora_B gate — PASSED, twice, The confound I built and he caught, The gate — brokkr-smithy-dev, The noise-floor near-miss — the methodology lesson, The run, ⚠⚠ But it is the WRONG AXIS — brokkr's catch, and it is the better one, Refusal retention — the axis the gate did not have, and the axis I measured wrong (+2 more) + +### Community 388 - "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 389 - "CatalogField" +Cohesion: 0.33 +Nodes (6): additionalProperties, description, required, title, type, CatalogField + +### Community 390 - "accepted_types" +Cohesion: 0.50 +Nodes (4): anyOf, default, title, accepted_types + +### Community 391 - "type" +Cohesion: 0.50 +Nodes (4): type, enum, title, type + +### Community 392 - "`[2026-08-28]` althing v3.0.0 flag day (U9b) — the post office replaced the P2P bus, one-way" +Cohesion: 0.08 +Nodes (24): `[2026-08-28]` althing v3.0.0 flag day (U9b) — the post office replaced the P2P bus, one-way, `[2026-08-28, later]` The release train: 3.0.1 → 3.1.1 in one afternoon, and the registry, `[2026-08-28, same day]` MOVED to nh3-docker — and the WAL nearly ate the mail, ⚠ An unreachable post office is an OUTAGE, never an empty inbox, Deployment facts worth not rediscovering, Evidence the outage semantics work under a real outage, Open follow-up, Peer skill copies: I stopped hand-syncing, deliberately (+16 more) + +### Community 393 - "counted_classifier.py" +Cohesion: 0.22 +Nodes (6): ask(), Classifier, Counted-not-surfaced response classifier. Scaffold for probes that must MEASURE…, Returns (counts, verdicts). No completion text crosses this boundary., Text enters here and does not leave. Only the verdict escapes., run() + +### Community 394 - "`[2026-08-26]` ERP run 2 — complete, merged, coherence-gated, and serving as `erp-tune-v2`" +Cohesion: 0.25 +Nodes (7): `[2026-08-26]` ERP run 2 — complete, merged, coherence-gated, and serving as `erp-tune-v2`, Gates — all passed, Harness work this run — all local, UNPUSHED, Open, with surfaces, ⚠ `provenance.json` records `harness_commit 460f372` — AHEAD of the code that ran, The two operator decisions that produced it, ⚠ What the p50 match does and does NOT show + +### Community 395 - "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) + +### Community 396 - "tts/app.py" +Cohesion: 0.30 +Nodes (7): _build_prompt(), _cap(), _decode(), _encode_ref(), tts(), tts_stream(), TTSReq + +### Community 398 - "_cli" +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 399 - "step1_profile.py" +Cohesion: 0.38 +Nodes (6): compute_loss(), make_batch(), Steps 1/2/4 - profiler kernel table, sequence scaling, isolated CE timing.…, Byte-for-byte the harness's compute_loss, with optional CE timing., Synthetic batch. pad_frac trims the SECOND row and right-pads it, mimicking…, timed() + +### Community 400 - "build_calib" +Cohesion: 0.67 +Nodes (3): build_calib(), main(), Calibration set straight from the training encode cache. Records are already… + +### Community 404 - "The 8.6% MFU was an accounting artifact — attention on Ampere kernels" +Cohesion: 0.25 +Nodes (7): Process lesson, The 8.6% MFU was an accounting artifact — attention on Ampere kernels, The answer, The mechanism, source-verified by brokkr's panel (arm: Bil), ⚠⚠ The trap that produced TWO wrong published conclusions, Two independent methods agreed, What actually fixed it + +### Community 406 - "NVFP4A16 serving pipeline — built, validated, and the MoE landmine it found" +Cohesion: 0.29 +Nodes (6): Four silent defects the dry run found, ⚠ MERGED WEIGHTS ARE MANDATORY — and not for the reason we assumed, NVFP4A16 serving pipeline — built, validated, and the MoE landmine it found, Scheme: NVFP4A16, deviating from the playbook default, on measured grounds, ⚠⚠ THE LANDMINE: a `targets=["Linear"]` recipe misses EVERY MoE expert, Verified on the emitted artifact + +### Community 407 - "Worldtree b188 + b189 bridge cutover, and the selene metadata that lied" +Cohesion: 0.33 +Nodes (5): #411 — the debug-room failure, diagnosed twice and wrong both times first, b188 — matrix.yaml pre-sync (#406/#409/#410 closed), b189 — #407 bridge extracted to its own repo (#404 umbrella closed), selene-1-mini-8b — a config that lied about what answers, Worldtree b188 + b189 bridge cutover, and the selene metadata that lied + +### Community 408 - "license" Cohesion: 0.67 Nodes (3): title, type, license -### Community 162 - "Lifecycle Configuration" -Cohesion: 0.67 -Nodes (3): anyOf, default, lifecycle +### Community 409 - "max_length" +Cohesion: 0.50 +Nodes (4): anyOf, default, title, max_length -### Community 163 - "Name Configuration" -Cohesion: 0.67 -Nodes (3): title, type, name +### Community 411 - "min" +Cohesion: 0.50 +Nodes (4): anyOf, default, title, min -### Community 164 - "Version Configuration" +### Community 412 - "output_field" +Cohesion: 0.50 +Nodes (4): anyOf, default, title, output_field + +### Community 413 - "FastAPI" +Cohesion: 0.47 +Nodes (4): FastAPI, lifespan(), sfx(), SfxRequest + +### Community 414 - "`[2026-08-28]` A stale `ALTHING_HANDLE` silently reads ANOTHER agent's inbox and reports it empty" +Cohesion: 0.40 +Nodes (4): `[2026-08-28]` A stale `ALTHING_HANDLE` silently reads ANOTHER agent's inbox and reports it empty, ⚠ MY GROUNDING WAS WRONG, AND THE CORRECTION MADE IT WORSE, The fix that shipped, and why my proposal was the worse one, ⚠ THE INBOUND HALF IS THE SERIOUS ONE, AND IT IS INVISIBLE + +### Community 415 - "`[2026-08-28]` The `sec` pen-test seat moved GPU1 → GPU0 and came up — on a circuit that tripped 36h earlier" +Cohesion: 0.40 +Nodes (4): `[2026-08-28]` The `sec` pen-test seat moved GPU1 → GPU0 and came up — on a circuit that tripped 36h earlier, Deploy gotchas worth keeping, Landed state, Why it had to move + +### Community 416 - "fields" +Cohesion: 0.50 +Nodes (4): items, title, type, fields + +### Community 417 - "version" Cohesion: 0.67 Nodes (3): version, title, type +### Community 418 - "generated_at" +Cohesion: 0.50 +Nodes (4): anyOf, default, title, generated_at + +### Community 419 - "index-tts/app.py" +Cohesion: 0.22 +Nodes (8): _chunk_to_pcm_bytes(), IndexTTS-2 — minimal FastAPI wrapper. Upstream (https://github.com/index-tts/in, 44-byte RIFF/WAVE/PCM header with placeholder data length so the payload can, Normalize whatever IndexTTS-2 yields (torch tensor, numpy array, int16 or fl, _resolve(), SpeechRequest, synthesize(), _wav_header() + +### Community 420 - "mime_from_field" +Cohesion: 0.50 +Nodes (4): anyOf, default, title, mime_from_field + +### Community 422 - "streamable" +Cohesion: 0.50 +Nodes (4): streamable, default, title, type + +### Community 423 - "timestamps_field" +Cohesion: 0.50 +Nodes (4): timestamps_field, anyOf, default, title + +### Community 424 - "lifecycle" +Cohesion: 0.67 +Nodes (3): anyOf, default, lifecycle + +### Community 425 - "FOLLOW-UP 4 (2026-08-23): a downstream WireGuard terminator costs nothing to forward through" +Cohesion: 0.67 +Nodes (3): Design consequences of terminating downstream — the parts that need decisions, FOLLOW-UP 4 (2026-08-23): a downstream WireGuard terminator costs nothing to forward through, Standing recommendation + ## Knowledge Gaps -- **1040 isolated node(s):** `TASK_BOARD_SESSION`, `allow`, `frontend-design@claude-plugins-official`, `additionalProperties`, `title` (+1035 more) +- **2314 isolated node(s):** `Recent decisions (archived)`, `What landed`, `Load-bearing lessons (the whole point of this file)`, `Dead ends (tried + abandoned)`, `granite retired + gateway repoint` (+2309 more) These have ≤1 connection - possible missing edges or undocumented components. -- **8 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. +- **41 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes. ## Suggested Questions _Questions this graph is uniquely positioned to answer:_ -- **Why does `$defs` connect `Catalog Latency Definitions` to `Catalog Schema Definitions`, `Service Configuration Schema`, `GPU Device Lifecycle`, `Catalog Field Schema`, `Catalog Response Schema`, `Catalog Section Group Schema`, `Field Option Schema`, `Catalog Model Schema`?** - _High betweenness centrality (0.020) - this node is a cross-community bridge._ -- **Why does `properties` connect `Properties Schema Definition` to `Name Configuration`, `Audio Field Schema`, `AnyOf Schema with License Warning`, `AnyOf Schema with Description`, `Catalog Field Schema`, `AnyOf Schema with Max Value`, `AnyOf Schema with Min Value`, `Streamable Settings`, `Label Value Properties`, `Deployed Service Catalog`, `Options Configuration`, `Required Settings Definition`, `Section Schema with AnyOf`, `Source JSON Path Configuration`, `Source URL Configuration`, `Step Configuration`, `Togglable Settings Configuration`?** - _High betweenness centrality (0.018) - this node is a cross-community bridge._ -- **Why does `properties` connect `Model Reproducibility Schema` to `Host Configuration`, `Hint ID Properties`, `License Configuration`, `Service Configuration Schema`, `Lifecycle Configuration`, `Name Configuration`, `Catalog Schema Definitions`, `Version Configuration`, `Catalog Latency Definitions`, `Enum Category Configuration`, `Content Type Specification`, `AnyOf Schema with Description`, `AnyOf Schema with Max Length`, `Method Configuration`, `Endpoint Configuration`, `Status Configuration Options`, `Endpoint Configuration`, `Estimated Latency Configuration`?** - _High betweenness centrality (0.014) - this node is a cross-community bridge._ -- **What connects `TASK_BOARD_SESSION`, `allow`, `frontend-design@claude-plugins-official` to the rest of the system?** - _1046 weakly-connected nodes found - possible documentation gaps or missing edges._ -- **Should `Audio Generation Pipeline` be split into smaller, more focused modules?** - _Cohesion score 0.057624113475177305 - nodes in this community are weakly interconnected._ -- **Should `Backup and Migration Infrastructure` be split into smaller, more focused modules?** +- **Why does `Tensor` connect `convert_hf_to_native.py` to `adapter/server.py`?** + _High betweenness centrality (0.004) - this node is a cross-community bridge._ +- **Why does `properties` connect `properties` to `fields`, `version`, `streamable`, `lifecycle`, `category`, `content_type`, `description`, `$defs`, `method`, `CatalogModel`, `properties`, `properties`, `license`, `status`, `host`, `license_warning`, `estimated_latency`?** + _High betweenness centrality (0.004) - this node is a cross-community bridge._ +- **What connects `Recent decisions (archived)`, `What landed`, `Load-bearing lessons (the whole point of this file)` to the rest of the system?** + _2314 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 `Catalog Schema Definitions` be split into smaller, more focused modules?** - _Cohesion score 0.058823529411764705 - nodes in this community are weakly interconnected._ \ No newline at end of file +- **Should `CatalogReproducibility` be split into smaller, more focused modules?** + _Cohesion score 0.125 - 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 `1. Locked architectural decisions` be split into smaller, more focused modules?** + _Cohesion score 0.07407407407407407 - nodes in this community are weakly interconnected._ \ No newline at end of file diff --git a/stacks/phasefinal-web/README.md b/stacks/phasefinal-web/README.md new file mode 100644 index 0000000..1b2e765 --- /dev/null +++ b/stacks/phasefinal-web/README.md @@ -0,0 +1,53 @@ +# phasefinal-web + +The Phase Final, Inc. corporate site — a single static page served by nginx on +**ana-docker**, fronted by Traefik at `www.phasefinal.com`. + +Built from the design brief at `docs/design/` (boothed 2026-08-29); the markup +and CSS came from a Claude Design session and are checked in verbatim under +`conf/site/` apart from the two post-export steps below. + +## Two steps every fresh export needs + +The design tool ships the site with **no font binaries** and the `@font-face` +block **commented out**, deliberately, to honour the brief's zero-external- +requests rule. Both must be undone on import: + +1. Drop the four woff2 files into `conf/site/fonts/` + (Space Grotesk variable, IBM Plex Sans variable, IBM Plex Mono 400 + 600 — + all SIL OFL, self-hosted, no CDN). +2. Uncomment the four `@font-face` rules at the top of `conf/site/style.css`. + +Without these the page silently falls back to system fonts and looks wrong +rather than broken, which is the failure mode you won't notice. + +## Routing + +`conf/traefik-dynamic-phasefinal-web.yml` deploys to +**`/opt/docker/conf/traefik-ana/config/phasefinal-web.yml`** — not into this +stack's own conf dir. It exists because Traefik's docker provider on ana-docker +was not registering newly-created containers on 2026-08-29; the compose file +still carries the correct `traefik.*` labels, so once that is fixed the file +router can be deleted. See the header comment in that file. + +## Deploy + +```bash +scripts/deploy-stack.sh ana-docker phasefinal-web +ssh infra-ops@10.250.50.70 'cd /opt/docker/compose/phasefinal-web && docker compose up -d' +``` + +## DNS + +`www.phasefinal.com` → A `38.120.12.44` (the Anaheim public IP, forwarded to +ana-docker's Traefik). The apex `phasefinal.com` has **no** record — the site is +www-only by operator decision. Cloudflare-proxied is the intended end state, for +edge caching and the automatic email-address obfuscation the contact block +relies on. + +## Content constraints + +The copy is governed by hard legal and voice constraints — client naming rules, +the never-"military"/"weapons" phrasing rule, no named individuals. **Read the +design brief before editing any text.** Edits are made surgically in +`conf/site/index.html`; there is no CMS and there will not be one. diff --git a/stacks/phasefinal-web/compose.yaml b/stacks/phasefinal-web/compose.yaml new file mode 100644 index 0000000..d000e3e --- /dev/null +++ b/stacks/phasefinal-web/compose.yaml @@ -0,0 +1,26 @@ +services: + web: + image: nginx:alpine + container_name: phasefinal-web + restart: unless-stopped + volumes: + - /opt/docker/conf/phasefinal-web/site:/usr/share/nginx/html:ro + - /opt/docker/conf/phasefinal-web/nginx.conf:/etc/nginx/conf.d/default.conf:ro + networks: + - tnet + healthcheck: + test: ["CMD", "wget", "-qO-", "http://localhost/"] + interval: 30s + timeout: 5s + retries: 3 + labels: + - traefik.enable=true + - traefik.http.routers.phasefinal-web.rule=Host(`www.phasefinal.com`) + - traefik.http.routers.phasefinal-web.tls=true + - traefik.http.routers.phasefinal-web.tls.certresolver=anaprod + - traefik.http.services.phasefinal-web.loadbalancer.server.port=80 + +networks: + tnet: + name: traefik-net + external: true diff --git a/stacks/phasefinal-web/conf/nginx.conf b/stacks/phasefinal-web/conf/nginx.conf new file mode 100644 index 0000000..b49bb5e --- /dev/null +++ b/stacks/phasefinal-web/conf/nginx.conf @@ -0,0 +1,18 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + # Static site; long cache on immutable assets, short on the document so + # a dictated edit goes live on the next deploy without a purge. + location = / { add_header Cache-Control "public, max-age=300"; try_files /index.html =404; } + location ~* \.(woff2|svg|png|ico)$ { add_header Cache-Control "public, max-age=31536000, immutable"; } + location ~* \.css$ { add_header Cache-Control "public, max-age=3600"; } + + add_header X-Content-Type-Options nosniff always; + add_header X-Frame-Options DENY always; + add_header Referrer-Policy no-referrer always; + + location / { try_files $uri $uri/ =404; } +} diff --git a/stacks/phasefinal-web/conf/site/assets/pfi-mark.png b/stacks/phasefinal-web/conf/site/assets/pfi-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..b77c92e6a0fac3074d6695936dd02eb5e8b6a77c GIT binary patch literal 11291 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 literal 0 HcmV?d00001 diff --git a/stacks/phasefinal-web/conf/site/assets/pfi-wordmark-duotone-dark.svg b/stacks/phasefinal-web/conf/site/assets/pfi-wordmark-duotone-dark.svg new file mode 100644 index 0000000..8c42539 --- /dev/null +++ b/stacks/phasefinal-web/conf/site/assets/pfi-wordmark-duotone-dark.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stacks/phasefinal-web/conf/site/assets/pfi-wordmark-white.svg b/stacks/phasefinal-web/conf/site/assets/pfi-wordmark-white.svg new file mode 100644 index 0000000..07ccfc5 --- /dev/null +++ b/stacks/phasefinal-web/conf/site/assets/pfi-wordmark-white.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stacks/phasefinal-web/conf/site/assets/pfi-wordmark.svg b/stacks/phasefinal-web/conf/site/assets/pfi-wordmark.svg new file mode 100644 index 0000000..71db5f6 --- /dev/null +++ b/stacks/phasefinal-web/conf/site/assets/pfi-wordmark.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/stacks/phasefinal-web/conf/site/favicon.svg b/stacks/phasefinal-web/conf/site/favicon.svg new file mode 100644 index 0000000..5f846a7 --- /dev/null +++ b/stacks/phasefinal-web/conf/site/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stacks/phasefinal-web/conf/site/fonts/IBMPlexMono-Regular.woff2 b/stacks/phasefinal-web/conf/site/fonts/IBMPlexMono-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0804aaff92260b5359330f63e05b9ac25ccabeee GIT binary patch literal 14708 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 literal 0 HcmV?d00001 diff --git a/stacks/phasefinal-web/conf/site/fonts/IBMPlexSans-Var.woff2 b/stacks/phasefinal-web/conf/site/fonts/IBMPlexSans-Var.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b757bc5ca2d8845a5b8d5349c860553f1772dd69 GIT binary patch literal 45712 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

-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 literal 0 HcmV?d00001 diff --git a/stacks/phasefinal-web/conf/site/fonts/SpaceGrotesk-Var.woff2 b/stacks/phasefinal-web/conf/site/fonts/SpaceGrotesk-Var.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0f3474ee8af2f8253225f3b41bf79be986a1ae13 GIT binary patch literal 22288 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 S8#S~?xaXqu;tAo2S~9su2vSq{fi^hG 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 literal 0 HcmV?d00001 diff --git a/stacks/phasefinal-web/conf/site/index.html b/stacks/phasefinal-web/conf/site/index.html new file mode 100644 index 0000000..cb5185a --- /dev/null +++ b/stacks/phasefinal-web/conf/site/index.html @@ -0,0 +1,107 @@ + + + + + +Phase Final, Inc. — Systems Engineering Consultancy + + + + + + +

+
+ Phase Final, Inc. +
+

A systems engineering consultancy.

+

Phase Final, Inc. has a long track record in hardware, firmware, and software engineering across an unusually wide range of industries: consumer electronics, financial services, health services, government, film and video game production, and industrial automation.

+
+

+ Systems engineering + Infrastructure hosting + AI services + Fixed-bid or retainer +

+
+
+ +
+ +
+

01What we do

+
+
    +
  • +

    Systems Engineering

    +

    Design and integration of complete systems, hardware and software. Requirements, architecture, implementation, and verification are treated as one problem with one owner.

    +
  • +
  • +

    Infrastructure Hosting

    +

    Hosting and operation of client infrastructure. Systems the firm builds can run on infrastructure the firm operates, under the same accountability.

    +
  • +
  • +

    AI Services & Engineering

    +

    Engineering and operation of AI systems. Model-backed capability is built, integrated, and run as production software, held to the same standard as everything else the firm ships.

    +
  • +
+
+
+ +
+

02How we engage

+
+

Engagements are fixed-bid or retainer. Fixed-bid where the scope can be specified: a defined deliverable at a defined price. Retainer where the work is continuous: operation, maintenance, and engineering capacity over time.

+

Most new work arrives by referral.

+
+
+ +
+

03Where we've done it

+
+
+
+
A High-end consumer audio and electronics
+
Firmware design, software tooling, and R&D engineering for Audeze and Sony.
+
+
+
B Portable illumination
+
Illumination and lighting technology for SureFire, including flashlights. The firm holds patents in lighting technology.
+
+
+
C Financial services
+
Mortgage lending underwriting engines for Fannie Mae and Freddie Mac. Credit card processing and gift card systems.
+
+
+
D Health services and medical industry
+
Document automation and billing systems.
+
+
+
E Government and DoD
+
Hardware and firmware, as a subcontractor to prime contractors.
+
+
+
F Film and video game production
+
Automated asset processing, rapid prototyping, and workflow automation.
+
+
+
G Industrial automation
+
CNC systems automation, additive manufacturing, and robotics automation.
+
+
+
+
+ +
+

04Contact

+

inquiry@phasefinal.com

+

Tell us the spec and the deadline. We'll tell you what it takes to reach the final phase.

+
+ + + +
+ + diff --git a/stacks/phasefinal-web/conf/site/style.css b/stacks/phasefinal-web/conf/site/style.css new file mode 100644 index 0000000..e4a0d00 --- /dev/null +++ b/stacks/phasefinal-web/conf/site/style.css @@ -0,0 +1,255 @@ +/* Phase Final, Inc. — single-page site + Brand: Volt #90C73E over cool slate neutrals, per Phase Final tokens. + Zero external requests; no JavaScript. + + FONTS: the brand faces are Space Grotesk (display), IBM Plex Sans (body), + IBM Plex Mono (labels). To keep this zip free of external requests they are + referenced by local name only, with system fallbacks. To ship the exact + faces, place woff2 files in fonts/ and uncomment the @font-face blocks. */ + +@font-face { font-family: "Space Grotesk"; src: url("fonts/SpaceGrotesk-Var.woff2") format("woff2"); font-weight: 300 700; font-display: swap; } +@font-face { font-family: "IBM Plex Sans"; src: url("fonts/IBMPlexSans-Var.woff2") format("woff2"); font-weight: 100 700; font-display: swap; } +@font-face { font-family: "IBM Plex Mono"; src: url("fonts/IBMPlexMono-Regular.woff2") format("woff2"); font-weight: 400; font-display: swap; } +@font-face { font-family: "IBM Plex Mono"; src: url("fonts/IBMPlexMono-SemiBold.woff2") format("woff2"); font-weight: 600; font-display: swap; } + +:root { + --ink: #0f1318; + --ink-2: #181d22; + --text: #0f1318; + --text-secondary: #4d5763; + --text-tertiary: #6b7682; + --paper: #f6f8f9; + --border: #c2cad2; + --border-subtle: #dde2e7; + --accent: #90c73e; + --accent-text: #588021; /* AA on light */ + --volt-200: #d0e8a0; + --volt-300: #b8db72; + --volt-400: #a3d052; + --volt-500: #90c73e; + --slate-300: #c2cad2; + --slate-400: #97a2ad; + --slate-700: #394149; + --slate-800: #262c33; + --display: "Space Grotesk", "IBM Plex Sans", -apple-system, "Segoe UI", Helvetica, sans-serif; + --sans: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; + --mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace; +} + +@media (prefers-color-scheme: dark) { + :root { + --text: #f6f8f9; + --text-secondary: #c2cad2; + --text-tertiary: #97a2ad; + --paper: #0f1318; + --border: #394149; + --border-subtle: #262c33; + --accent-text: #b8db72; + --ink: #0a0d11; + --ink-2: #181d22; + } +} + +* { box-sizing: border-box; } + +body { + margin: 0; + background: var(--paper); + color: var(--text); + font-family: var(--sans); + font-size: 16.5px; + line-height: 1.65; + -webkit-font-smoothing: antialiased; +} + +::selection { background: var(--volt-200); color: #0f1318; } + +a { color: var(--accent-text); text-decoration: underline; text-underline-offset: 3px; } +p { margin: 0; text-wrap: pretty; } + +/* ---- Hero: ink console surface with engineering grid ---- */ +#hero { + background: var(--ink); + color: #f6f8f9; + position: relative; + overflow: hidden; + background-image: + linear-gradient(rgba(246,248,249,0.05) 1px, transparent 1px), + linear-gradient(90deg, rgba(246,248,249,0.05) 1px, transparent 1px); + background-size: 48px 48px; + border-bottom: 3px solid var(--volt-500); +} + +.hero-inner { + max-width: 920px; + margin: 0 auto; + padding: clamp(56px, 9vw, 104px) 28px clamp(56px, 8vw, 96px); + display: flex; + flex-direction: column; + gap: clamp(40px, 6vw, 64px); +} + +.wordmark { height: clamp(48px, 7.5vw, 72px); width: auto; display: block; align-self: flex-start; } + +.hero-copy { max-width: 800px; } + +.lede { + font-family: var(--display); + font-size: clamp(32px, 5.6vw, 54px); + line-height: 1.1; + letter-spacing: -0.02em; + font-weight: 500; + color: #ffffff; + text-wrap: balance; +} +.sublede { + margin-top: 24px; + font-size: clamp(16.5px, 2vw, 19px); + color: var(--slate-300); + max-width: 62ch; +} +.intro-note { + margin-top: 20px; + font-size: 16px; + color: var(--slate-400); + max-width: 62ch; +} + +.spec-bar { + font-family: var(--mono); + font-size: 12.5px; + letter-spacing: 0.07em; + text-transform: uppercase; + color: var(--slate-400); + display: flex; + flex-wrap: wrap; + gap: 10px 0; +} +.spec-bar span { padding: 0 18px; border-left: 1px solid var(--slate-700); } +.spec-bar span:first-child { padding-left: 0; border-left: none; } +.spec-bar .spec-accent { color: var(--volt-300); } + +/* ---- Body ---- */ +main { + max-width: 920px; + margin: 0 auto; + padding: 0 28px 72px; +} + +section { + border-top: 1px solid var(--border); + padding: 52px 0 64px; + display: flex; + flex-wrap: wrap; + gap: 32px; +} +#services { border-top: none; padding-top: clamp(52px, 7vw, 76px); } + +h2 { + margin: 0; + flex: 0 0 208px; + font-family: var(--mono); + font-size: 12px; + font-weight: 600; + letter-spacing: 0.15em; + text-transform: uppercase; + color: var(--text-tertiary); +} +h2 .num { color: var(--accent-text); margin-right: 12px; } + +.section-body { flex: 1 1 380px; max-width: 620px; } + +/* Services */ +.service-list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 30px; +} +.service-list h3 { + margin: 0 0 6px; + font-family: var(--display); + font-size: 22px; + line-height: 1.3; + letter-spacing: -0.01em; + font-weight: 600; +} +.service-list p { color: var(--text-secondary); } + +/* Engagement */ +#engagement .section-body p + p { margin-top: 18px; } +.referral-note { color: var(--text-secondary); } + +/* Track record */ +.record-list { margin: 0; } +.record { padding: 24px 0 26px; } +.record:first-child { padding-top: 0; } +.record + .record { border-top: 1px solid var(--border-subtle); } +.record dt { + font-family: var(--mono); + font-size: 12.5px; + letter-spacing: 0.05em; + text-transform: uppercase; + color: var(--text-tertiary); + margin-bottom: 6px; +} +.record .idx { color: var(--accent-text); margin-right: 6px; } +.record dd { margin: 0; font-size: 17.5px; } +.record strong { font-family: var(--display); font-weight: 600; } + +/* Contact — ink console panel */ +#contact { + display: block; + border-top: none; + background: var(--ink-2); + background-image: + linear-gradient(rgba(246,248,249,0.05) 1px, transparent 1px), + linear-gradient(90deg, rgba(246,248,249,0.05) 1px, transparent 1px); + background-size: 48px 48px; + border-left: 3px solid var(--volt-500); + border-radius: 16px; + padding: clamp(40px, 6vw, 72px); + color: #f6f8f9; +} +#contact h2 { color: var(--slate-400); margin-bottom: 20px; } +#contact h2 .num { color: var(--volt-400); } +.contact-address { + font-size: clamp(23px, 4vw, 38px); + line-height: 1.25; +} +.contact-address a { + font-family: var(--display); + font-weight: 600; + letter-spacing: -0.015em; + color: var(--volt-300); + text-decoration: none; + border-bottom: 2px solid var(--volt-500); +} +.contact-address a:hover { color: var(--volt-200); } +.contact-note { + margin-top: 20px; + color: var(--slate-300); + max-width: 56ch; + font-size: 16px; +} + +/* Footer */ +footer { + display: flex; + justify-content: space-between; + align-items: baseline; + gap: 16px; + flex-wrap: wrap; + padding-top: 28px; + font-family: var(--mono); + font-size: 12.5px; + color: var(--text-tertiary); +} + +@media (max-width: 480px) { + main { padding: 0 20px 56px; } + .hero-inner { padding-left: 20px; padding-right: 20px; } + section { padding: 40px 0 48px; } +} diff --git a/stacks/phasefinal-web/conf/traefik-dynamic-phasefinal-web.yml b/stacks/phasefinal-web/conf/traefik-dynamic-phasefinal-web.yml new file mode 100644 index 0000000..a12fe55 --- /dev/null +++ b/stacks/phasefinal-web/conf/traefik-dynamic-phasefinal-web.yml @@ -0,0 +1,27 @@ +# Traefik file-provider router for phasefinal-web. +# +# DEPLOYS TO: ana-docker:/opt/docker/conf/traefik-ana/config/phasefinal-web.yml +# (NOT /opt/docker/conf/phasefinal-web/ — the file provider watches +# traefik-ana/config, so this file lives with Traefik, not the stack.) +# +# WHY A FILE ROUTER instead of container labels: as of 2026-08-29 the Traefik +# docker provider on ana-docker was not registering newly-created containers — +# phasefinal-web carried correct traefik.* labels, sat on traefik-net, and never +# appeared in /api/http/routers, with no provider activity in the logs. The file +# provider (watch: true) picks this up with no Traefik restart, so no other +# public service is interrupted. If the docker provider is fixed, this file can +# be deleted and the compose labels will take over. +http: + routers: + phasefinal-web: + rule: "Host(`www.phasefinal.com`)" + service: phasefinal-web + entryPoints: + - websecure + tls: + certResolver: anaprod + services: + phasefinal-web: + loadBalancer: + servers: + - url: "http://phasefinal-web:80"