diff --git a/memory-systems/agent-os/00_Raw/Incoming/2026-09-18_Session_Summary.md b/memory-systems/agent-os/00_Raw/Incoming/2026-09-18_Session_Summary.md new file mode 100644 index 0000000..7133214 --- /dev/null +++ b/memory-systems/agent-os/00_Raw/Incoming/2026-09-18_Session_Summary.md @@ -0,0 +1,30 @@ +# Session Summary: 2026-09-18 +**Date**: 2026-09-18 +**Source**: jimmy +**Status**: Infrastructure Stabilized + +## Infrastructure & Model Optimization +- **Context Window Expansion**: Identified gemma12 server crashing due to context overflow (~150K tokens vs 65K limit). +- **VRAM Audit**: Verified RTX 3060 12GB headroom (~3,152 MiB free). +- **Server Upgrade**: Increased gemma12 server (port :1923) `n_ctx` to **131,072**. +- **Model Migration**: Flipped default model to `route-flash-0731` (DeepSeek-v4-flash-0731 via RouteAPI) for high-reasoning reliability. + +## Vault Architecture & Crew Setup +- **Vault Map**: Created `Meta/vault-map.md` to establish a "Vault Role" system (mapping roles like `{{inbox}}`, `{{projects}}` to physical folders). +- **Folder Standardization**: Provisioned new directories: `02_areas`, `03_resources`, `03_templates`. +- **Crew Integration**: Activated the My-Brain-Is-Full-Crew (8 core agents) and established a "Skill-First" routing priority. + +## Procedural Automation (Skills) +- **`obsidian-refinement`**: Created to automate raw note processing from `00_Raw/Incoming`. +- **`decision-record-logger`**: Created to ensure all architectural/project changes are documented as Decision Records (DRs). + +## Documentation & Governance +- **Decision Records (DRs)**: Drafted and saved three critical records in `04_projects/veripath/docs/decisions/`: + - `DR-20260917-ContextExpansion` + - `DR-20260917-ModelSwap` + - `DR-20260917-VaultMap` +- **Status Audit**: Verified Thornhill website is LIVE and VeriPath project status is current. + +## Next Steps +- Draft VeriPath skill. +- Refine `Incoming` folder contents. diff --git a/memory-systems/agent-os/02_agents/leonard/facts/2026-09-19-bonsai2-mtp-fast-build.md b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-19-bonsai2-mtp-fast-build.md new file mode 100644 index 0000000..57911a0 --- /dev/null +++ b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-19-bonsai2-mtp-fast-build.md @@ -0,0 +1,39 @@ +# 2026-09-19 — Bonsai 2 fast build + MTP head on the 3060 (setup complete, verified) + +## What was built +The sudoingX `bonsai2-small-gpu` recipe, end to end, on DESKTOP-81CBTV2: +- **Fork**: `bonsai2` branch of sudoingX/llama.cpp (= PrismML fork + kernel PR #218 + Hadamard fix #217, stacked). Built in **WSL2** (Ubuntu 26.04) with gcc-13 + CUDA 12.4, sm_86. Source `/opt/llama-prism-sudoingx`, binaries `build/bin/`. +- **Model**: `Ternary-Bonsai-2-27B-PTQ1_0.gguf` (5.95 GB, prism-ml HF repo) + Qwen 3.8 27B MTP head grafted on via the repo's byte-exact GGUF tools → `Ternary-Bonsai-2-27B-PTQ1_0-mtp.gguf` (7.0 GB) in `/opt/models/` (WSL ext4). Graft round-trip verified byte-exact (strip = original sha256). +- **Server**: WSL2 llama-server on `127.0.0.1:8899`, reachable from Windows via WSL2 localhost forwarding (bound `0.0.0.0`). MTP spec decode on, n-max 1, `GGML_CUDA_BATCH_INVARIANT=1`. Launchers `/opt/serve-bonsai-mtp.sh` / `/opt/serve-bonsai-off.sh`. + +## Verified numbers (this machine, RTX 3060 12GB) +| metric | result | author's claim | +|---|---|---| +| llama-bench tg128 (fresh) | 39.34 tok/s | 40.47 | +| llama-bench pp512 (prefill) | 272.7 tok/s | ~268 | +| streaming, code | 53.4 tok/s | 53.2 | +| streaming, prose | 41.9 | 41.8 | +| streaming, bash | 48.8 | 50.1 | +| greedy identity (off vs on) | byte-identical, all 3 prompts | identical | +| test-backend-ops ptq1_0 MUL_MAT | all pass vs CPU ref | 47/47 | + +Stock fork baseline was 26.3 tok/s → ~49 streaming overall. Lossless (outputs unchanged), not just fast. + +## Why WSL2 +Windows-native build is blocked on this PC: MSVC 14.44/14.51 (VS 18 Build Tools) hard-crashes CUDA 12.4's `cudafe++` (ACCESS_VIOLATION — too-new compiler), no admin rights to install CUDA 13.x or an older MSVC, no clang, and the pip `nvidia-cuda-nvcc-cu12` wheels ship only ptxas.exe on Windows (no nvcc). WSL2 has native GPU passthrough (nvidia-smi works) and CUDA 12.4 works with gcc-13. This matches the author's own tested toolchain. + +## Config +`providers.bonsai2` + `model_aliases.bonsai2` → `http://127.0.0.1:8899/v1`, model `/opt/models/Ternary-Bonsai-2-27B-PTQ1_0-mtp.gguf`, ctx 131072. Backup `config.yaml.good-20260919221502`. **Gateway restart required** (`hermes --profile leonard gateway restart` from a separate shell) then `/new` + `/model bonsai2`. + +## Pitfalls learned +- pkill -f is case-sensitive: `"bonsai"` doesn't match `Ternary-Bonsai` in the model path. Kill by PID. +- WSL2 servers must bind `--host 0.0.0.0`; 127.0.0.1 inside WSL is invisible from Windows. +- Keep the model in WSL ext4, not /mnt/c (9p slowness). +- Hermes venv python refuses `--user` installs and nesting venvs — use `uv venv`. +- One model at a time on the 3060 still applies (FreeToken ~1 GB co-resident is fine; the MTP server needs ~10.6 GB). + +## Disk footprint +22.4 GB downloads (PTQ1_0 + Qwen donor), +7 GB merged model, +5.9 GB strip-check (cleanup candidate: `C:\models\bonsai2-mtp\strip-check.gguf`). Source/donor can stay for re-grafting. + +## Cross-ref +Skills: `bonsai2-local-inference` (updated 2026-09-19 with canonical setup), `call-3060-inference`. \ No newline at end of file diff --git a/memory-systems/agent-os/02_agents/leonard/facts/2026-09-20-opencode-go-models.md b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-20-opencode-go-models.md new file mode 100644 index 0000000..fa5465f --- /dev/null +++ b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-20-opencode-go-models.md @@ -0,0 +1,27 @@ +# 2026-09-20 — OpenCode model pool: verified, Go plan currently erroring + +## Setup (verified live 2026-09-20 ~09:20 PDT) +- opencode 1.18.31 (npm global) + local project copy at `C:\Users\fight\Projects\browserclaw-project` +- Config: `C:\Users\fight\.config\opencode\opencode.jsonc` — exactly 34 models (8 `opencode/*` + 26 `opencode-go/*`), per Tony's brief +- Key: `OPENCODE_API_KEY` present in `~/.config/opencode/.env` (masked, not logged) + +## Live test results +- PASS: `opencode/big-pickle`, `opencode/ling-3.0-flash-fin-free` (proprietary free tier) +- FAIL (HTTP 500 UnknownError "Unexpected server error" + ref): every Go-plan model tested — `glm-5.3`, `deepseek-v4-flash`, `grok-4.6`, `qwen3.8-flash` — via any prefix (`opencode-go/`, `opencode/`, bare) + +## Facts +- `opencode-go/` prefix is stale for v1.18.31: `opencode-go/glm-5.3` → ProviderModelNotFoundError ("Did you mean: glm-5.3, glm-5.3-flash?"). Correct IDs resolve under `opencode/` or bare. +- Go-plan backend failures are server-side, not local: opencode.ai/zen/go/v1 has a history of intermittent outages (anomalyco/opencode issue #36889). +- Distinct error refs per request (e.g. err_a8828e9a) — new errors each attempt, not a cached config issue. +- Config prefix fix NOT applied — waiting on Tony's authorization. + +## Resolution (approved by Tony 2026-09-20 09:23 PDT) +- Patched opencode.jsonc: all 26 `opencode-go/` → `opencode/`. Verified: 0 `opencode-go` remaining, 34 `opencode/` entries. +- Snapshot: `~/.config/opencode/opencode.jsonc.good-20260920-092315` (rollback point). +- Live re-test 09:24 PDT: `opencode/glm-5.3` resolves (no longer model-not-found) but still HTTP 500 UnknownError ref err_15953691 at 09:26 — Go backend flaky via CLI (direct API call with `x-opencode-session` header WORKS, 200, glm-5.3 responded). CLI Go failures are server-side (anomalyco/opencode #36889), not config. + +## UNIVERSAL INSTALL (opencode Go in Hermes picker, all profiles — 2026-09-20 09:33 PDT) +- Hermes has native `opencode-go` plugin (plugins/model-providers/opencode-zen/__init__.py, needs OPENCODE_GO_API_KEY, base https://opencode.ai/zen/go/v1) but it does NOT add x-opencode-session header. +- Added pinned custom provider `oc-go` (26 Go models, discover_models: false, extra_headers.x-opencode-session per-profile UUID) + `opencode-go: enabled: false` to ALL FOUR profile configs: ashbot, coach, jimmy, leonard. +- Snapshots: each `config.yaml.good-ocgo-20260920-093345`. `hermes config check` passes all 4. +- KEY STEP (user-side, secret guard): copy OPENCODE_API_KEY from ~/.config/opencode/.env as OPENCODE_GO_API_KEY into each profile .env, then `hermes gateway restart --profile
` from a separate shell.
\ No newline at end of file
diff --git a/memory-systems/agent-os/02_agents/leonard/facts/2026-09-24-bonsai2-mtp-verified.md b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-24-bonsai2-mtp-verified.md
new file mode 100644
index 0000000..bd39e50
--- /dev/null
+++ b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-24-bonsai2-mtp-verified.md
@@ -0,0 +1,58 @@
+# 2026-09-24 — Bonsai 2 27B + MTP: verified end-to-end on the 3060
+
+## Status
+The Ternary Bonsai 2 / PrismML stack is **already built and serving** on this box. It was
+built 2026-09-19 in WSL2 and re-verified 2026-09-24. Nothing needed downloading.
+
+- Repo (fork, `bonsai2` branch = kernel PRs #218 + Hadamard #217): `/opt/llama-prism-sudoingx`
+- Model: `/opt/models/Ternary-Bonsai-2-27B-PTQ1_0-mtp.gguf` (7,012,820,512 bytes, MTP head grafted)
+- Launcher: `/opt/serve-bonsai-mtp.sh` — listens **:8899** (not 8080)
+- Hermes wiring: `providers.bonsai2` + `model_aliases.bonsai2` -> `http://127.0.0.1:8899/v1`
+
+## Measured 2026-09-24 (RTX 3060 12 GB, driver 610.74)
+- Decode: **48.6 – 50.8 tok/s** across 4 runs (~50 tok/s as advertised)
+- Prefill: **241 tok/s** cold; KV-cache-warm runs report low prefill because the prefix is cached
+- VRAM: **11,166 MiB used / 950 free** at `-c 131072` — weights fully resident, no RAM spill
+- `--jinja` tool calling: `finish_reason=tool_calls`, correct function name + JSON args
+- Sanity: `17 * 23 = 391` correct
+
+## The one real defect found and fixed: empty `content`
+The template default reasoning effort is `xhigh`. At `temperature 1.0` reasoning length varies
+wildly (observed 238 chars to 2,524 chars). When it ran long, reasoning consumed the entire
+`max_tokens` budget and the response came back `finish_reason=length` with **empty `content`**.
+
+Fix: added `--reasoning-effort medium` to `/opt/serve-bonsai-mtp.sh` (backup at
+`/opt/serve-bonsai-mtp.sh.bak-20260924-181142`). After the change: 3/3 realistic ~2.3k-token
+prompts returned content, reasoning down to 238–319 chars.
+
+This failure mode looks like two other known Bonsai problems but is neither:
+- NOT the `/new` context trap (context 131072 matches alias; `/health` 200)
+- NOT the post-abort scheduler wedge (decode speed is normal, slots launch fine)
+
+Diagnose it by comparing `reasoning_content` length against `usage.completion_tokens`.
+
+Escalation ladder if `medium` still overruns: `--reasoning-budget N` (hard cap on thinking
+tokens; injects a message before the end-of-thinking tag). Per-request overrides also work —
+the fork honours both `reasoning_effort` and `chat_template_kwargs.reasoning_effort` in the
+request body, so no restart is needed for a one-off.
+
+## Correction to a common (wrong) playbook for this box
+Advice circulating for this model recommends the "official PrismML installer" (`Bonsai-demo`,
+PQ2_0, port 8080) as Path A. On THIS machine that path is superseded and weaker: the
+`Bonsai-demo` PQ2_0 setup at :8080 is the older, slower variant (~26 tok/s baseline, and the
+Vulkan build that ships with it is ~32x slower). The sudoingX PTQ1_0 + MTP build at :8899 is
+the canonical one.
+
+Also settled long ago and still true: **a Windows-native CUDA build of the fork is impossible
+on this PC** — MSVC 14.44 (VS 18) hard-crashes CUDA 12.4 `cudafe++` (ACCESS_VIOLATION), there is
+no admin for CUDA 13 / older MSVC, and the pip `nvidia-cuda-nvcc-cu12` wheels ship no `nvcc.exe`
+on Windows (ptxas only). The build lives in WSL2 with `gcc-13` + CUDA 12.4 from apt.
+
+## Gotchas re-confirmed
+- WSL2 servers must bind `--host 0.0.0.0`; a 127.0.0.1 bind inside WSL is invisible from Windows.
+- Keep the GGUF in WSL ext4 (`/opt/models/`), not `/mnt/c` — 9p/drvfs makes the 7 GB mmap crawl.
+- `pkill -f llama-server` **kills your own shell** when the wrapper command line contains that
+ string (exit 15). Use the bracket trick: `pkill -f '[l]lama-server'`.
+- `pkill -f bonsai` does NOT match the model path `Ternary-Bonsai-...` (case-sensitive).
+- Switch to this model with `/new` **before** `/model bonsai2` — a grown session prefills
+ slowly at 3060 speeds and can time out mid-load.
diff --git a/memory-systems/agent-os/02_agents/leonard/facts/2026-09-25-omh-install-and-phantom-delete.md b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-25-omh-install-and-phantom-delete.md
new file mode 100644
index 0000000..5527d72
--- /dev/null
+++ b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-25-omh-install-and-phantom-delete.md
@@ -0,0 +1,59 @@
+# 2026-09-25 — OMH installed + phantom-tree delete incident
+
+## Result: OMH installed and registered (verified)
+- Installed via the **agent path** (not the PowerShell remote-installer, which is
+ command-gated on Telegram): `uv tool install git+https://github.com/rlaope/oh-my-hermes@d149c6e3ee3977185fdf9d0fd3497a9dd5ffa317`
+- Pinned SHA (main head at 2026-09-25): `d149c6e3ee3977185fdf9d0fd3497a9dd5ffa317` (supersedes the old pin `3a0e98b...`).
+- Version: **oh-my-hermes 2.0.5**. Command on PATH: `C:\Users\fight\.local\bin\omh.exe`.
+- `omh --hermes-home "C:\Users\fight\AppData\Local\hermes\profiles\leonard" setup --no-interactive --yes --no-omh-tui` → exit 0.
+ - 130 OMH workflows at `C:\Users\fight\.omh\skills`
+ - `C:\Users\fight\AppData\Local\hermes\profiles\leonard\config.yaml` now has
+ `plugins.enabled: [omh]`, `skills.external_dirs: [C:/Users/fight/.omh/skills]`
+ - plugin bridge at `.../profiles/leonard/plugins/omh`
+ - coding preference: "Ask every time"; model aliases NOT touched.
+- `omh doctor` (with the same `--hermes-home`): **54/54 passing, 0 blocking, 3 warnings**
+ (all warnings: host-runtime not yet observed, ast-grep not on PATH, context-weight note — none blocking).
+- To use in chat: **restart/reload Hermes**, then try the handoff prompt
+ "Use OMH request-to-handoff for: I want to safely add a feature to this repo."
+- Residual: native runtime plugin-load is not yet *observed* (doctor can only fake-context-smoke it);
+ verify after a restart that a real OMH event fires.
+
+## Side-effect incident (own the risk)
+1. First `setup` used an MSYS path `/c/Users/...` for the **native** `omh.exe`. It
+ mis-read that as literal `C:\c\Users\...` and wrote a **phantom** leonard home under
+ a phantom root `C:\c`. (So the first doctor "passed" against a tree that was not the
+ real leonard config.)
+2. I then `rm -rf`'d `C:\c` to remove the phantom. That root **pre-existed** (Jul–Sep dates)
+ and already contained a `models/` subtree: a git clone of the bonsai2 research repo,
+ HF caches, and GGUF weights. I did not verify the subtree before deleting.
+3. **Mitigation / verification:** the authoritative location `C:\models` is a SEPARATE,
+ intact tree:
+ - `C:\models\bonsai2-small-gpu` is a clean git repo at **remote HEAD** (`44bc7cb` =
+ `origin/main`), `git status` clean, remote `https://github.com/sudoingX/bonsai2-small-gpu`.
+ All research files present (`graft/serve_mtp.sh`, `kernel/PR_HADAMARD.md`,
+ `kernel/PR_KERNEL.md`, `graft/recipe.txt`, `kernel/patches`, `tests`, `tools`).
+ - All large weights still present: `gemma-4-12B` 6.3 G, `Qwen3.8-35B` 21 G,
+ `gemma4-coding` 1.2 G, `LFM2.5` 1.6 G, plus the rest of `C:\models`.
+ - Because the repo is clean at public remote HEAD, any lost clone is recoverable.
+4. **Residual risk (cannot fully rule out):** if `C:\c\models` held local-only changes
+ (uncommitted work or a private fork branch) not present in `C:\models`, those are gone.
+ The real repo shows no uncommitted work, so nothing of consequence is believed lost —
+ but this was a near-miss and is the reason for the pre-delete-verify rule below.
+
+## Rules adopted (see lessons.md 2026-09-25)
+- Pass Windows `C:\Users\...` paths to native binaries; never MSYS `/c/...`.
+- Before deleting any directory: list contents, confirm no pre-existing real files.
+- After any write: verify the intended target path actually gained the expected files
+ (not just that the command exited 0).
+- If a phantom root (`C:\c`, etc.) appears: check whether it shadows a real `models/`
+ clone before touching it.
+
+## Verification commands (reproducible)
+```bash
+git ls-remote https://github.com/rlaope/oh-my-hermes.git refs/heads/main
+uv tool list
+omh --hermes-home "C:\Users\fight\AppData\Local\hermes\profiles\leonard" doctor
+grep -nE 'plugins:|omh|external_dirs|skills:' C:/Users/fight/AppData/Local/hermes/profiles/leonard/config.yaml
+git -C /c/models/bonsai2-small-gpu log --oneline -1
+git -C /c/models/bonsai2-small-gpu status --short
+```
diff --git a/memory-systems/agent-os/02_agents/leonard/facts/2026-09-27-phoenix-full-audit.md b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-27-phoenix-full-audit.md
new file mode 100644
index 0000000..3e1f6e3
--- /dev/null
+++ b/memory-systems/agent-os/02_agents/leonard/facts/2026-09-27-phoenix-full-audit.md
@@ -0,0 +1,21 @@
+# Phoenix Salon + Spa — Full Audit Fact (2026-09-27)
+
+**Run:** `src/veripath/docs/validation/2026-09-27-phoenix-salon-spa/` (findings.json, REPORT-final.md, AUDIT-LOG.md)
+**Client:** VP-001 (Cameron Park, CA) | Owner truth: Mon–Sat 9–6, Sun closed
+
+## Live state (2026-09-27)
+- Reputation: GBP 4.9/64 (on-file), Bing 5/5/65, Yelp 4.9/~63–65, FB 94%/46, Vagaro 5.0/686 (carried)
+- NAP consistent on ALL primary surfaces (address + phone verified live on GBP, Bing, Apple, website, FB)
+- GBP: women-owned attribute live; price level NOT set; website field = http:// (insecure form)
+- Yelp hours CONFLICT: Mon 10–4, Tue–Fri 10–6, Sat 10–4 vs truth 9–6
+- Website: visible hours FIXED to 9–6 (09-06 10-AM issue closed); raw HTML = 3.5KB SPA shell again (09-06 was server-rendered); JSON-LD Sunday 00:00–00:00 bug STILL OPEN; NO GA4/GTM anywhere (only /~flock.js proxy)
+- phoenixsalonspa.com → 301 to DropCatch parked "for sale" (old domain dropped; citation risk)
+- Facebook intro still "Formally La Mae Salon & Spa" (framed as history); 840 followers; last visible post Jul 15
+- Instagram @phoenix.cameronpark: 874 followers / 1,604 following; no NAP in bio; link = phoenixcameronpark.start.page
+- Style Readers' Choice 2026 nomination; winners announced Oct 2026
+
+## Findings snapshot
+1 Immediate (Yelp hours), 3 High (JSON-LD Sunday, no analytics, quiet Google/Yelp reviews since Apr 21 2026), 3 Medium (rebrand residue, SPA shell, GBP price level), 2 Enhancement (http links, social signals)
+
+## Open verification gaps (this run)
+GBP live review count/date, Apple rating/hours (stale 08-14: 10–6 incl Sun), Vagaro live (Incapsula), GBP posts/photos (login wall), AI visibility layer (no access), GEO Track-1 numeric (tool not on Windows host)
\ No newline at end of file
diff --git a/memory-systems/agent-os/02_agents/leonard/failure-ledger.md b/memory-systems/agent-os/02_agents/leonard/failure-ledger.md
new file mode 100644
index 0000000..70e7559
--- /dev/null
+++ b/memory-systems/agent-os/02_agents/leonard/failure-ledger.md
@@ -0,0 +1,18 @@
+# Local Inference Failure Ledger — Bonsai 2 / 3060
+
+Purpose: track every attempted local-inference request, success/failure, latency, root cause.
+Rule: every tested model run gets one row. Update after each test, not after each crisis.
+
+| # | Date (PST) | Model | Request size | Result | Latency | Root cause / notes |
+|---|-----------|-------|-------------|--------|---------|--------------------|
+| 1 | 2026-09-18 ~07:00 | Bonsai-2-27B Vulkan build | 62 tok | SUCCESS | 145s | PQ2_0 via generic Vulkan kernels — no Vulkan kernels in fork |
+| 2 | 2026-09-18 ~07:11 | Bonsai-2-27B CUDA build | 62 tok | SUCCESS | 4.6s | After CUDA build swap — 32x faster |
+| 3 | 2026-09-18 ~07:20 | Bonsai-2-27B CUDA (3 models loaded) | 2048 tok | FAIL | ~56s then cancel | VRAM 9.3/12GB used, model spilled ~5GB to RAM; prefill 6% after 27s; Hermes 60s client timeout cancelled |
+| 4 | 2026-09-18 ~07:24 | Bonsai-2-27B CUDA (card dedicated) | 3971 tok | SUCCESS | 84.9s | Full model in VRAM 11969/12288 MiB; slow but works |
+| 5 | 2026-09-18 ~07:24 | Bonsai-2-27B CUDA (dedicated) | 61 tok | SUCCESS | 6.8s | content correct |
+| 6 | 2026-09-18 ~07:31 | Bonsai-2-27B via Hermes picker | ~72,700 tok | FAIL | ~7s → abort | Context overflow: session 72.7k tokens > Bonsai ctx 65,536. Hermes pre-call compression failed 2x (failure_class=lock_contended), then request aborted WinError 10053. Not a model fault. Fix: /new before bonsai2, or reload with -c 131072 |
+
+Baseline so far: 4/5 success; the one failure was resource contention (my error), not the model.
+Open: track picker-switch requests through real agent traffic, not just hand tests.
+
+Status: TRACKING SINCE 2026-09-18. No telemetry existed before this file.
\ No newline at end of file
diff --git a/memory-systems/agent-os/02_agents/leonard/lessons.md b/memory-systems/agent-os/02_agents/leonard/lessons.md
index 1af34a3..777b553 100644
--- a/memory-systems/agent-os/02_agents/leonard/lessons.md
+++ b/memory-systems/agent-os/02_agents/leonard/lessons.md
@@ -5,6 +5,9 @@
| Date | Lesson | Context |
|------|--------|---------|
+| 2026-09-25 | OMH (oh-my-hermes) install on Windows: the PowerShell remote-installer pattern (fetch install.ps1, run iex) is flagged by the command-safety gate and just times out on Telegram (no approval UI). Use the documented agent path: pin the SHA with `git ls-remote https://github.com/rlaope/oh-my-hermes.git refs/heads/main` (never `main`), then `uv tool install "git+https://github.com/rlaope/oh-my-hermes@$SHA"` (local build, no remote-exec, does not trip the gate), then `omh --hermes-home "C:\Users\fight\AppData\Local\hermes\profiles\leonard" setup --no-interactive --yes --no-omh-tui`, then `omh doctor` (target 54/54 passing, 0 blocking). `omh` is a native binary: pass Windows `C:\...` paths, never MSYS `/c/...`. Non-interactive setup does not touch model aliases. | OMH install (2026-09-25) |
+| 2026-09-25 | Native-tool path discipline + pre-delete verification (near-miss during OMH setup): I passed an MSYS path `/c/Users/...` to the **native** `omh.exe`, which read it literally as a phantom `C:\c\Users\...`; that phantom root pre-existed and also held a `models/` subtree (git research repo, caches, GGUF weights) that I did not recognize when I `rm -rf`'d the phantom. Real data survived only because the authoritative `C:\models` (git clean at remote HEAD; all weights present; public remote sudoingX/bonsai2-small-gpu) was a separate tree. Rules: (a) pass `C:\Users\...` to native tools, never MSYS `/c/...`; (b) before deleting a dir, list its contents and confirm no pre-existing real files; (c) after any write, verify the intended target actually gained the expected files; (d) if a phantom root (`C:\c`) appears, check whether it shadows a real `models/` clone first. | OMH install side-effect (2026-09-25) |
+| 2026-09-19 | Bonsai 2 27B fast build (sudoingX fork: kernel PR #218 + Hadamard #217, MTP head graft) runs ~2x stock: fresh tg128 39.3 tok/s (vs 26.3), streaming ~49 tok/s (code 53.4), greedy output BYTE-IDENTICAL to spec-off (lossless). Windows-native CUDA build BLOCKED on this PC: MSVC 14.44/14.51 crashes CUDA 12.4 cudafe++, no admin for CUDA 13/old MSVC, pip nvcc wheels ship no nvcc.exe on Windows. Build+serve in WSL2 (gcc-13 + CUDA 12.4 apt; GPU passthrough native) at 127.0.0.1:8899; model in WSL ext4 /opt/models, bind --host 0.0.0.0 (127.0.0.1-in-WSL is invisible from Windows). pkill is case-sensitive ('bonsai' won't match 'Ternary-Bonsai'). Provider/alias bonsai2 re-pointed to :8899; `hermes gateway restart` + `/new` + `/model bonsai2` to use. Full note: facts/2026-09-19-bonsai2-mtp-fast-build.md | Bonsai 2 MTP setup (2026-09-19) |
| 2026-09-17 | MiniCPM5-2B (FreeToken 127.0.0.1:1919) returns EMPTY/thinking-only completions under Hermes agent turns (44× `Empty response (no content or reasoning)` in errors.log, Sep 12–17), yet answers cleanly to direct curl (small/20K/22K prompts, tools, SSE, 4-way concurrency, multi-turn). Failure is model-vs-agent-load, not server/KV. Same box also logged `prompt is too long: 17105 > 8585 max (prompt + generation)` (Sep 15, Gemma) proving FreeToken real KV budget << advertised 131K. Fix: route agent turns to routeapi/deepseek-v4-flash-0731; keep 2B models for light direct use only. | Profile audit + MiniCPM5 diagnosis (2026-09-17) |
| 2026-09-17 | `providers.freetoken.max_tokens: 2000` is silently IGNORED (`unknown config keys ignored: max_tokens`) — key placement invalid for this schema, so the generation cap never applies. Also `model_aliases.minicpm5` had a duplicate `model:` key (Gemma dict + MiniCPM scalar) so the alias didn't point where labeled. | Profile audit (2026-09-17) |
| 2026-09-17 | `hermes cron create` grammar: the prompt positional MUST come immediately after the schedule and BEFORE any `--flags` (`hermes cron create