chore(memory): snapshot auto-learned memory and renamed workstation skills

--home-blank-.omp--: MEMORY.md +140 / learned.md / memory_summary.md /
raw_memories.md +1002 rewritten by auto-learn after the model rename,
frank-medium split-balance and bottleneck studies. Skills renamed to
single-topic buckets: dotfile-git-workflow -> ghostty-text-aa +
niri-display-rotation + noctalia-theme, handy-service-mgmt ->
handy-flm-inference, inference-runtime -> llama-cpp-parallelism.

--home-blank-Projects-serverAppConfig--: 38 new rollout summaries,
raw_memories.md/MEMORY.md refreshed, skills re-bucketed (bench-protocol,
llm-fleet-model-swap, rootless-quadlet-log-retrieval, orchestration-quadlet).

Per-worktree bucket (wt-20261006-122204) is now gitignored, not committed.
This commit is contained in:
Frank committed 2026-10-09 13:17:53 -07:00
1 parent a34322aeb0
commit 5b08896e4e
72 files changed
+1461 -175

No files matched your search

+25 -19
View File
@@ -1,22 +1,28 @@
## System & Desktop Environment
- **Noctalia (Niri) DE**: Bin `/usr/bin/noctalia`. Configs: `~/.config/noctalia/config.toml`, `noctalia.kdl`. IPC: `noctalia msg <cmd>` (replaces `qs -c noctalia-shell ipc`). Key cmds: `panel-toggle`, `session`, `lock`, `launcher`. App templates: `/usr/share/noctalia/assets/templates/`. Palette gen: `noctalia theme [image]`. GTK accent: `#b267e4`.
- **Fonts & AA**: Ghostty (`font-subpixel-render=off`), Alacritty (`font.antialias=false`). Ghostty fix: replace `font-hinting = hinting` with `freetype-load-flags = hinting,light` (line 10).
- **Frank Desktop**: Cursor size 36 (`gsettings`, `settings.ini`, `XCURSOR_SIZE=36`). Theme: `capitaine-cursors`.
- **Authenik (2026.8)**: Outpost caches claims per session (1-24h TTL). Pitfall: silent 403s post-group-add despite correct membership.
# Environment & Tooling Memory (Frank workstation / blankpad)
## Inference & Runtime
- **Frank-Large**: Sampler defaults overridden from halogen/greedy: `temp=1.0, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0, repetition_penalty=1.0`. Added `preserve_thinking=true` (retains thinking blocks across turns). Config: `agent/models.yml`. Deployed to `dank/command-center` (dankclaw). Live effect on next config read (no restart).
- **Frank-Small**: Uses checkpoint's fixed Qwen3.6 template. `deploy-plan.py` mapping is vestigial.
- **Halogen Runtime**: Baked-in chat template (no file swap). Accepts `chat_template_kwargs`: `enable_thinking`, `preserve_thinking`, `reasoning_effort`.
- **FLM NPU (Dankclaw)**: `gemma4-it:e4b` on port 7771. FIFO queue (~7-11s switch). Supports PNG/JPEG; rejects WebP (convert first). Requires `thinkingLevelMap` in `models.json`. Pitfall: missing `.xclbin` symlinks under `~/.config/flm/xclbins/`.
## Persistent facts
- User: `blank`. Home: `/home/blank`. Dotfiles repo: `~/.omp` (Gitea `dank/command-center` at 192.168.0.143:3000, local `git push` pattern). `serverAppConfig` cloned to `~/Projects/serverAppConfig`.
- Desktop: Noctalia (Niri-based DE at `/usr/bin/noctalia`). Configs `~/.config/noctalia/config.toml` + `noctalia.kdl`; IPC via `noctalia msg <cmd>` (panel-toggle, session, lock, launcher). App templates in `/usr/share/noctalia/assets/templates/`. Palette generated via `noctalia theme [image]`. GTK accent #b267e4.
- Ghostty: `theme = noctalia`; text AA via `freetype-load-flags` (not `font-hinting`). Alacritty: `font.antialias=false`.
- Niri display config: `~/.config/niri/cfg/display.kdl`. Transform values are absolute; in portrait, a 180° flip = swap 90° ↔ 270°.
- Hardware: Lenovo laptop eDP-1 (1920x1080, scale 1.25) + two PNP(XYM) PM1601 externals (1920x1200, scale 1, portrait). Current blankpad layout: DP-2@x=0 → HDMI-A-1@x=1200 → eDP-1@x=2400.
- Frank desktop: cursor size 36, capitaine-cursors theme, Authenik 2026.8. Authenik caches claims per session (1-24h TTL) → silent 403s after group add.
- Inference: `handy` app (`/usr/bin/handy`, hub op=start, application=/usr/bin/handy, pty=true, persist=true) with 69 catalog models. FLM NPU gemma4-it on port 7771 — PNG/JPEG only (no WebP), needs `thinkingLevelMap` in models.json, `.xclbin` symlinks under `~/.config/flm/xclbins/`.
- Halogen runtime (frank-large): baked-in chat template, no file swap; accepts `chat_template_kwargs` (enable_thinking, preserve_thinking, reasoning_effort). Sampler defaults: temp=1.0, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0, repetition_penalty=1.0. `preserve_thinking=true` in `agent/models.yml`.
- `sudo usermod -aG input blank` was required for `/dev/input` device access (660 root:input).
- Compositor AA in niri 26.04 is limited to corner rounding via `niri_rounding_alpha()`; blur/noise settings cause softness, not AA. Client-side text AA is not controlled by niri.
## Configuration & Repository
- **OMP Harness**: Repo at `~/.omp`. Cloned `serverAppConfig` to `~/Projects/serverAppConfig` (local singular vs remote plural `serverAppConfigs`). HTTP transport with embedded dank token (no SSH keys). HEAD: 701ab14 (main tracks origin/main).
- **Structure**: 308 files, 4.2 MB. Includes `dankclaw/`, `dankserver/`, `frankbook-pro/` (7 quadlets), `shared/` (Homepage, alloy, loki, prometheus, searxng), `tests/` (47 E2E), `serverAppConfigs-docs/` (115). Legacy: `old/`, `report/`, `scripts/`, `.githooks/`, `AGENTS.md`.
- **Recent**: Observability quadlet cutover (loki/alloy/comfyui images, grafana OAuth secret per-service env seeding).
- **Git Workflow**: Branch `main`. Untracked: `.pre-pull-backup/`, `home/`. LFS locking notice is advisory. Mitigate via `git config lfs.http://<repo>/info/lfs.locksverify true`. Pattern: `git add <file> && git commit -m "<msg>" && git push`.
## Durable workflows
1. **Noctalia theme change**: edit generated palette/theme source before hardcoding per-app colors; terminal text color must match accent in both palette and terminal override. `noctalia msg` for IPC; `git add && git commit && git push` in dotfiles repo.
2. **Niri display rotation**: `niri msg outputs` → read `display.kdl` → edit transforms → `niri validate -c <path>` → `niri msg action load-config-file` → verify → git commit/push.
3. **Ghostty AA fix**: replace `font-hinting = hinting` with `freetype-load-flags = hinting,light`. Reload via USR1: `pgrep ghostty | while read pid; do kill -USR1 "$pid"; done`.
4. **Handy restart**: `pkill -f handy`, then hub daemon start with pty=true, persist=true, ready timeout 10s.
5. **llama.cpp parallelism**: layer (default) = pipeline; tensor (experimental) = true tensor parallelism requiring flash attention + non-quantized KV; row (deprecated); none = single GPU. `--parallel` is serving-level concurrency, not model parallelism. No context/sequence parallelism mode.
## Operations & Services
- **Handy App**: Binary `/usr/bin/handy`. Kill: `pkill -f handy`. Start: `hub op=start, application=/usr/bin/handy, pty=true, persist=true, ready={log:'.*', timeout:10}`. Status: Up, 69 catalog models seeded.
- **Device Permissions**: `/dev/input/*` are `root:input` (660). User `blank` must be in `input` group (`sudo usermod -aG input blank`). Pitfall: `usermod` without sudo fails to lock `/etc/passwd`; `sudo` password entry in this CLI environment requires PTY.
- **Ghostty Reload**: `pgrep ghostty | while read pid; do /usr/bin/kill -USR1 "$pid"; done`.
## Pitfalls
- Portrait 180° rotation in niri is 90°↔270° swap, NOT adding 180°.
- Tensor mode: flash attention required, KV cache non-quantized, MoE/Mamba/SSM unsupported, `--fit` disabled.
- Authenik session claim caching causes silent 403s post-group-add.
- Local dir `serverAppConfig` vs remote repo `serverAppConfigs` name mismatch (trivial, pull/push unaffected).
- Git LFS lock warnings: mitigate with `git config lfs.http://<repo>/info/lfs.locksverify true`.
- Noctalia crispness: no single compositor-AA switch; scoped options only (hard corners; hard corners + no blur/noise; full crispness with opacity 1.0/blur 0/fontconfig AA off; terminal-only).
@@ -1 +1 @@
Context: OMP repo at ~/.omp with serverAppConfig (local) <-> serverAppConfigs (remote). Frank-large uses temp=1.0, preserve_thinking=true; frank-small uses Qwen3.6. FLM NPU (port 7771) needs .xclbin symlinks and WebP conversion. Authenik caches claims (1-24h), watch for post-group-add 403s. Handy daemon runs via hub (pty:true); ensure user 'blank' is in 'input' group for /dev/input access. Git LFS locks are advisory; use USR1 for Ghostty reload. Current shift: noctalia theme & font-hinting fixes.
Frank workstation (user blank) facts and reusable workflows: Noctalia/Niri DE config and display rotation (portrait 180° = 90°↔270° swap), Ghostty/Alacritty text-AA fixes, niri compositor-AA limits, handy/FLM inference constraints, llama.cpp split modes, and dotfile git workflow. Dotfiles repo is ~/.omp (Gitea dank/command-center). Current layout: DP-2@0 → HDMI-A-1@1200 → eDP-1@2400. Repository state wins over this memory.
@@ -1 +0,0 @@
Standardized workflow for dotfile configuration management, Git state verification, LFS-aware pushing, and application reloading.
@@ -1 +0,0 @@
Updated niri layouts to match noctalia palette and IPC commands.
@@ -1 +0,0 @@
git add $1 && git commit -m "$2" && git push
@@ -1 +0,0 @@
pgrep ghostty | while read pid; do /usr/bin/kill -USR1 "$pid"; done
@@ -1 +0,0 @@
freetype-load-flags = hinting,light
@@ -1 +0,0 @@
:root { --accent: #b267e4; }
@@ -0,0 +1,13 @@
# Ghostty Text AA Fix
Ghostty font AA is controlled by `freetype-load-flags`, NOT `font-hinting`.
## Fix
- Replace `font-hinting = hinting` with `freetype-load-flags = hinting,light` in `~/.config/ghostty/config`.
## Reload
- Send USR1 to all ghostty processes: `pgrep ghostty | while read pid; do kill -USR1 "$pid"; done`
## Related
- Alacritty text AA: `font.antialias=false` in its config.
- Noctalia crispness: niri compositor AA only affects corner rounding (`niri_rounding_alpha()`); text AA is client-side. No nearest-neighbor resample knob in this build.
@@ -0,0 +1,17 @@
# Handy + FLM NPU Inference
## Handy app
- Binary: `/usr/bin/handy`
- Start: `hub op=start` with `application=/usr/bin/handy`, `pty=true`, `persist=true`, `ready={log:'.*', timeout:10}`
- Result: persistent daemon, 69 catalog models seeded
- Restart: `pkill -f handy`, then re-run hub op=start
## FLM NPU (Dankclaw)
- gemma4-it:e4b on port 7771
- Accepts PNG/JPEG; rejects WebP (convert first with ImageMagick `convert`)
- Requires `thinkingLevelMap` in models.json
- FIFO queue; ~7-11s model switch
- Pitfall: missing `.xclbin` symlinks under `~/.config/flm/xclbins/` cause failures
## Related
- Dotfile repo: `~/.omp` (Gitea `dank/command-center`, 192.168.0.143:3000)
@@ -1 +0,0 @@
Lifecycle and dependency management for the handy daemon, covering hub deployment, model seeding, and /dev/input permission fixes.
@@ -1 +0,0 @@
Resolved 'permission denied opening device node(s)' by adding user to 'input' group (660 perms). Sudo requires PTY.
@@ -1 +0,0 @@
sudo usermod -aG input blank
@@ -1 +0,0 @@
pkill -f handy; hub op=start, application=/usr/bin/handy, pty=true, persist=true, ready={log:'.*', timeout:10}
@@ -1 +0,0 @@
application: /usr/bin/handy\npty: true\npersist: true\nready: {log: '.*', timeout: 10}
@@ -1 +0,0 @@
Manages frank-large/small inference routing, FLM NPU constraints, and Halogen runtime kwargs for thinking block preservation.
@@ -1 +0,0 @@
Pinned sampler: temp=1.0, top_p=0.95, top_k=20. Live config read on next cycle.
@@ -1 +0,0 @@
ls -l ~/.config/flm/xclbins/ | grep -E '\.xclbin' || echo 'Missing symlinks'
@@ -1 +0,0 @@
curl -s localhost:7771/status | jq .queue
@@ -1 +0,0 @@
enable_thinking: true\npreserve_thinking: true\nreasoning_effort: medium
@@ -1 +0,0 @@
{"thinkingLevelMap": true, "gemma4-it": "e4b"}
@@ -0,0 +1,23 @@
# llama.cpp Multi-GPU Parallelism
## Split modes (--split-mode / -sm)
- **layer** (default): Pipeline parallelism. Each GPU holds a contiguous layer slice. Token flows sequentially through GPUs. Minimizes inter-GPU data movement; tolerates slow interconnects (PCIe fine). Best for prefill and fitting large models. Weakness: needs many tokens to keep pipeline full, poor low-batch latency.
- **tensor** (experimental): True tensor parallelism. Splits each layer's weights AND KV cache across all GPUs via 'meta device', doing cross-GPU all-reduce per layer (NCCL). Minimizes latency, parallelizes any workload size. Heavily bottlenecked by interconnect speed (wants NVLink + NCCL). Best for fast token generation.
- **row** (deprecated): Row-split dense weights only. Predecessor to tensor; comparatively poor performance.
- **none**: Single GPU, selected via --main-gpu.
## Key constraints on tensor mode
- Requires flash attention ON (-fa on)
- KV cache must be non-quantized: f32/f16/bf16 only
- NOT implemented for: MoE/hybrid, Mamba/SSM, and several other architectures (hard-fails with SPLIT_MODE_TENSOR not implemented)
- --fit is disabled; must size --ctx-size / --parallel manually
## Separate axis (NOT model parallelism)
- **--parallel / -np**: Number of concurrent server slots (each with own KV cache). Serving-level concurrency/batch parallelism. On single GPU this is the main throughput knob.
- **CPU+GPU offload** (--n-gpu-layers, --n-cpu-moe): Hybrid inference when model exceeds VRAM. Device-distribution strategy, not 'parallelism' in the strict sense.
## What does NOT exist in llama.cpp
- No first-class context/sequence parallelism mode (unlike vLLM/TensorRT-LLM). If that term is applied to llama.cpp, it's loose third-party language.
## Hardware context (this environment)
- Single RTX 4070 Max-Q (~12 GB VRAM). Multi-GPU split modes do not apply. Relevant knobs: --parallel for concurrency, CPU+GPU offloading for models >12 GB.
@@ -0,0 +1,26 @@
# Niri Display Rotation Workflow
Used to rotate/flip external monitors in portrait mode.
## Workflow
1. `niri msg outputs` — capture current transform, logical size, scale, position.
2. Read `~/.config/niri/cfg/display.kdl`.
3. Edit `transform` values.
4. `niri validate -c ~/.config/niri/cfg/display.kdl` — dry-run validation.
5. `niri msg action load-config-file` — hot-reload (no restart).
6. `niri msg outputs | grep -E '^Output|Transform|Logical|Scale'` — verify.
7. `git add && git commit && git push` in dotfiles repo (`~/.omp`).
## Critical pitfall
- In portrait, "flip 180°" = swap `90° counter-clockwise` ↔ `270° counter-clockwise`.
- Setting `transform "180"` on a portrait monitor kicks it to landscape-upside-down.
- Niri transform values are absolute, NOT modular arithmetic.
## Verified layout (blankpad, 83c9c92)
- DP-2: x=0, portrait 1200x1920, transform 90° CCW, scale 1
- HDMI-A-1: x=1200, portrait 1200x1920, transform 270° CCW, scale 1
- eDP-1: x=2400, 1536x864, scale 1.25
## Config split
- `~/.config/niri/cfg/*.kdl` (Noctalia-style includes).
- Display config lives in `~/.config/niri/cfg/display.kdl`.
@@ -0,0 +1,21 @@
# Noctalia Theme Editing
Noctalia is a Niri-based DE (`/usr/bin/noctalia`).
## Config locations
- Main config: `~/.config/noctalia/config.toml`
- Niri config: `~/.config/niri/cfg/noctalia.kdl`
- IPC: `noctalia msg <command>` (direct, not qs wrapper). Key cmds: panel-toggle, session, lock, launcher.
- App templates: `/usr/share/noctalia/assets/templates/` (gtk, ghostty, alacritty, wezterm, helix, btop, starship, qt, cava, scroll, mango, umbriel, foot, emacs, kitty, etc.)
- Palette generation: `noctalia theme [image]`
- GTK accent default: #b267e4
## Changing an accent (e.g. yellow → red)
1. Locate and edit the generated Noctalia palette/theme source BEFORE hardcoding per-app colors.
2. If Ghostty is set to `theme = noctalia`, direct terminal color overrides are less durable than updating the theme itself.
3. Terminal text color must match the chosen accent in BOTH the Noctalia palette and any terminal-specific override.
4. Hot-reload: `noctalia msg action load-config-file` (or equivalent config load action).
## Related
- Niri display config: `~/.config/niri/cfg/display.kdl`.
- Dotfile git workflow: `git add && git commit && git push` in `~/.omp`.