vault-sync: 2026-09-17 12:01 (jimmy)

This commit is contained in:
jimmy
2026-09-17 12:01:11 -07:00
parent 7404a4ae4f
commit 4a31459e89
9 changed files with 851 additions and 0 deletions
@@ -5,6 +5,13 @@
| Date | Lesson | Context | | Date | Lesson | Context |
|------|--------|---------| |------|--------|---------|
| 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 <schedule> "<prompt>" --name ...`). Prompt after flags → `unrecognized arguments`. `--model`/`--provider` pin per-job to a working provider — restored jobs referencing `openrouter:deepseek` (dead provider) would silently fail. | Cron rebuild (2026-09-17) |
| 2026-09-17 | ROUTE_API_KEY is injected into the gateway env, NOT in `~/.hermes/profiles/leonard/.env` (grep `.env` comes up empty). The live session resolves routeapi fine. When auditing providers, check auth.json + gateway env, not just .env. | Profile audit (2026-09-17) |
| 2026-09-17 | git-bash grep does NOT support `\d` in ERE (`grep -E "^\d+"` silently matches nothing) — use `[0-9]`. Tailscale status on Windows prints peer rows as `IP name tag state`; capture `$1 $2 $3 $5` so the cron watch script sees online/offline transitions. | tailnet-watch.sh debug (2026-09-17) |
| 2026-09-17 | Tailscale health: this box (100.64.0.1) itself reports `offline` and health check warns it can't reach the coordination server — HTTPS front door `headscale.vps1.afterthedemo.com` is intercepted by a NETGEAR router login cert (CN=www.routerlogin.net). Matches known rule: control plane is HTTP-only at http://74.208.111.99:8443, never HTTPS. Watchdog will flag when state flips. | Profile audit, tailnet check (2026-09-17) |
| 2026-09-17 | Profile hygiene issue: leonard `cron/jobs.json` had been wiped to `{"jobs":[]}` (Sep 3) while `skills/.curator_backups/2026-08-27T18-02-27Z/cron-jobs.json` still held the 5 real jobs. Restore pattern: backup → parse JSON → re-create via `hermes cron create` with corrected provider pins + profile-scripts (curator-run.sh, havoc-nightly.sh, tailnet-watch.sh). Always verify pins in jobs.json after create. | Cron rebuild (2026-09-17) |
| 2026-09-01 | VPS SSH (74.208.111.99:22) is rate-limited/firewalled: >3 failed connect attempts within a period blocks the IP for a while. Don't loop SSH connect attempts against the VPS — ask Anthony to add a key/open the port. Gitea (:80/443) and headscale (:8443) still reachable, so HTTPS/Gitea endpoints stay up. | Athena Oracle deploy blocked | | 2026-09-01 | VPS SSH (74.208.111.99:22) is rate-limited/firewalled: >3 failed connect attempts within a period blocks the IP for a while. Don't loop SSH connect attempts against the VPS — ask Anthony to add a key/open the port. Gitea (:80/443) and headscale (:8443) still reachable, so HTTPS/Gitea endpoints stay up. | Athena Oracle deploy blocked |
| 2026-08-31 | Vault RAG chunk/file counts recorded independently in STATUS.md, HOME.md, and 01_user/current-context.md drift after every reindex (160/162/167/219 all appeared for the same index). Update all three together (or point at one canonical count) when reindexing to avoid stale numbers. | AgentOS merge reindex | | 2026-08-31 | Vault RAG chunk/file counts recorded independently in STATUS.md, HOME.md, and 01_user/current-context.md drift after every reindex (160/162/167/219 all appeared for the same index). Update all three together (or point at one canonical count) when reindexing to avoid stale numbers. | AgentOS merge reindex |
| 2026-08-30 | LFM2.5-2.6B is both agentic AND a pure reasoning model. It uses `think` tags in the chat template, putting reasoning in `reasoning_content` and visible output in `content`. Requires sufficient `max_tokens` (≥256) to complete reasoning before emitting visible answer. | LFM2.5 setup and testing | | 2026-08-30 | LFM2.5-2.6B is both agentic AND a pure reasoning model. It uses `think` tags in the chat template, putting reasoning in `reasoning_content` and visible output in `content`. Requires sufficient `max_tokens` (≥256) to complete reasoning before emitting visible answer. | LFM2.5 setup and testing |
@@ -0,0 +1,77 @@
# Phoenix Salon + Spa — Digital Presence Audit
## EXECUTIVE REPORT
**Date:** 2026-09-17 · **Target:** https://phoenixcameronpark.com/ (canonical www→apex 302 verified)
**Audit ID:** PSS-2026-09-17 · **Method:** Live crawl + rendered DOM + Google Maps public view + directory discovery (all evidence captured this session)
**Prior record:** VeriPath audit 2026-08-13; overview verified 2026-09-11/09-14; hallmark design audit 2026-07-16 (identity reconciled — same business, no conflict)
---
## Layer 1 — Executive Dashboard
**Overall Score: 70 / 100** (Good — competitive, with high-impact accuracy gaps)
| Severity | Count |
|----------|-------|
| 🟥 Immediate | 2 |
| 🟧 High | 4 |
| 🟨 Medium | 3 |
| 🟩 Enhancement | 2 |
| Category | Sub-Score (/10) |
|----------|:---:|
| Digital Identity | 8 |
| Technical SEO | 7 |
| Conversion | 7 |
| Google Business | 7 |
| Reviews | 6 |
| Content | 7 |
| Authority | 6 |
**Severity grid**
| | Identity | Tech | Conversion | GBP | Reviews | Content | Authority |
|---|---|---|---|---|---|---|---|
| 🟥 | | F1 | F1 | | | | F2 |
| 🟧 | F3 | F6 | | F5 | F4 | | |
| 🟨 | F7 | F8 | F9 | | | | |
| 🟩 | | | F10 | F11 | | | |
---
## Layer 2 — Business Impact
**What's at stake.** Phoenix Salon + Spa has the raw material every local business wants: a 4.9★/64 Google rating, 4.9★/65 Yelp, active socials, and a real booking engine (Vagaro). The gaps are not quality problems — they are **accuracy and consistency problems** that bleed revenue quietly:
1. **Wrong hours, twice.** The website and its structured data both tell Google you open at 10:00 AM and close at 6:00 PM Saturday. The owner's stated truth (verified this month) is 9:00 AM open and 3:00 PM Saturday close. A client who shows up at 4 PM Saturday finds a locked door; a Thursday-morning regular who arrives at 9:30 finds no open sign. Every "wrong hours" query trains Google's local ranking against you, and "permanently closed" impressions from a dead-ghost old-brand domain (F2) erode trust in parallel.
2. **Your old name is still your second business card.** La Mae Salon & Spa is live on at least two directories (Fave, Alignable) and its old domain is a dead Cloudflare 526 (F2). Anyone who remembers the old name finds a corpse, not a redirect to Phoenix. Local ranking treats this as NAP fragmentation.
3. **Your social proof is aging.** The newest visible Google review is ~5 months old (Apr 2026). At 64 reviews you have volume; you're losing velocity — the single strongest "pick me" signal for local search in this category.
**The good news.** Canonical is fixed (was pointing at a dead domain in July), JSON-LD schema is valid and complete, NAP (name/address/phone) matches across site + Google + Yelp, booking is live, and you out-score every local competitor on rating. These are polish-and-consistency fixes, not rebuilds.
---
## Layer 3 — Recommendations
| # | Problem | Impact | Fix | Effort |
|---|---------|--------|-----|--------|
| F1 | Site + schema hours wrong vs owner truth (10–6 vs 9–6; Sat 18:00 vs 15:00) | 🟥 Immediate — lost walk-ins; confuses Google local ranking | Update visible hours AND JSON-LD to **Mon–Fri 9–6, Sat 9–3, Sun closed** (copy in roadmap) | S |
| F2 | Old-brand domain lamaesalonspa.com dead 526; phoenixsalonspa.com now dead | 🟥 Immediate — dead link equity, old-brand trust leak | 301 lamaesalonspa.com → phoenixcameronpark.com at origin, or take down cleanly | S-M (needs hosting access) |
| F3 | La Mae residue live: fave.salon + Alignable listings | 🟧 High — NAP/brand fragmentation | Claim + update or delete both listings; standardize "formerly La Mae" wording | M |
| F4 | Google review velocity thin (newest ~Apr 2026, ≈5 mo) | 🟧 High — weak social-proof momentum | Restart review-request flow (3–5/mo via Vagaro follow-up) | M |
| F5 | GBP hours display "Closes 6 PM" — verify Saturday matches owner truth | 🟧 High — same wrong-hours issue on the most-visible surface | Confirm GBP hours = Mon–Fri 9–6, Sat 9–3, Sun closed; check Thursday capture | S |
| F6 | Sitemap lastmod stale (2026-07-19) — no freshness signal | 🟧 High — weak crawl priority for evolving content | Regenerate sitemap on deploy; ensure live lastmod | S |
| F7 | Homepage H1 "Hey bestie, welcome in" vs "Luxury Salon & Spa" positioning | 🟨 Medium — brand-voice collision (design audit 07-16; still live) | Align H1 + hero copy with luxury+personal tone | M |
| F8 | TikTok (@byashleythornhill) missing from JSON-LD sameAs | 🟨 Medium — incomplete entity graph | Add TikTok to sameAs | S |
| F9 | Booking is link-out only; no inline Vagaro widget on homepage | 🟨 Medium — extra click in a 3-click booking competitor landscape | Embed widget or "book with Ashley" card above fold | M |
| F10 | Directory hours chaos: wheree.com shows Mon 9AM–7PM + Sunday entries | 🟩 Enhancement — third conflicting hours set | Fix after F1/F5; aggregators lag source fixes | L |
| F11 | IG bio claim "800+ 5-star ratings" vs 64 Google / 65 Yelp public | 🟩 Enhancement — overclaim risk if audited | Keep as "reviews across Vagaro, Yelp, Google" or add Vagaro count | S |
---
## Layer 4 — Evidence refs
All findings map to the Technical Appendix (F1–F11). Evidence captured live 2026-09-17: raw headers, HTML/JSON-LD, rendered DOM text, Google Maps public view, and directory search snippets — source per finding in the appendix.
---
*Draft for internal review. Not for client delivery without final QA sign-off.*
@@ -0,0 +1,108 @@
# 00_FIXPACK — Phoenix Salon + Spa (phoenixcameronpark.com)
**Audit ID:** PSS-2026-09-17 · **Applies to:** Lovable/gpt-engineer site editor (paste-ready) · **Status:** code prepared, validated, NOT yet deployed
> Deployable items only. Human-dashboard steps → `01_RUNBOOK`. Board → `02_KANBAN/`.
> **Re-verify before paste:** the site may change between audit and deploy — re-open `/contact` and the homepage JSON-LD before pasting.
---
## 1. Validated JSON-LD (replace the homepage block)
`<script type="application/ld+json">` — find the existing `BeautySalon` block on the homepage and replace its contents with this exact JSON (schedule → Mon–Fri 9–6, Sat 9–3, Sun closed; sameAs now includes TikTok):
```json
{
"@context": "https://schema.org",
"@type": "BeautySalon",
"name": "Phoenix Salon + Spa",
"url": "https://phoenixcameronpark.com",
"image": "https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/64dce20c-a245-4014-9464-040886fac002",
"telephone": "+1-530-350-9197",
"email": "ashley@phoenixcameronpark.com",
"priceRange": "$$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "3460 Robin Lane, Suite 4",
"addressLocality": "Cameron Park",
"addressRegion": "CA",
"postalCode": "95682",
"addressCountry": "US"
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "09:00",
"closes": "18:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "09:00",
"closes": "15:00"
}
],
"sameAs": [
"https://www.instagram.com/phoenix.cameronpark/",
"https://www.facebook.com/PhoenixCameronPark",
"https://www.tiktok.com/@byashleythornhill"
]
}
```
✅ Validated this session with `json.loads` (round-trip clean).
---
## 2. Contact page visible hours (replace text)
Find the hours line on `/contact` and set it to exactly:
```
Monday–Friday: 9:00 AM – 6:00 PM
Saturday: 9:00 AM – 3:00 PM
Sunday: Closed
```
(Must match JSON-LD — for the "Open now" state and for Google to trust the page.)
---
## 3. Homepage H1 (optional copy change, F7)
Current rendered H1: `Hey bestie, welcome in`
Suggested replacement (keeps warm personal voice, aligns with "Luxury Salon & Spa" title + $$$ positioning):
```
Elevated beauty, personalized to you.
```
Subline option: `Custom facials, spray tans, waxing, and hair — Cameron Park's 4.9★ local favorite.`
---
## 4. Sitemap (F6)
- Sitemap exists at `/sitemap.xml` with 11+ URLs — **do not remove**.
- `lastmod` is hardcoded `2026-07-19` in the build → wire lastmod to the actual deploy timestamp if the platform supports it; otherwise regenerate sitemap on each deploy.
- Add `/services`, `/new-clients`, `/faq`, `/gift-cards`, `/journal` to sitemap if not already present (verify after deploy).
---
## 5. Booking UX (F9, optional)
If the platform allows an iframe embed, add the Vagaro widget inline above the fold on homepage:
`https://www.vagaro.com/Users/BusinessWidget.aspx?enc=<existing-encoded-token>`
(Keep the existing "Book with Ashley" direct links regardless — they work.)
---
## Deploy checklist (after saving in Lovable)
- [ ] Re-open https://phoenixcameronpark.com/ → verify JSON-LD block replaced (view-source)
- [ ] Re-open /contact → visible hours read Mon–Fri 9–6, Sat 9–3, Sun Closed
- [ ] Google Maps → pin reflects Sat close 3 PM (GBP may lag; see runbook item 1)
- [ ] Run this: `curl -sL https://phoenixcameronpark.com/ | grep -c 'ld+json'` → ≥ 1
---
*Fix pack author: Leonard (2026-09-17). Item #s map to audit findings F1, F6, F7, F8, F9.*
@@ -0,0 +1,52 @@
# 01_RUNBOOK — Phoenix Salon + Spa owner-side fixes
**Audit ID:** PSS-2026-09-17 · **Who:** Ashley / Phoenix owner (business dashboards) · **Status:** steps only, nothing executed
> Human-dashboard items that need owner logins. Deployable code → `00_FIXPACK`.
---
## 1. Google Business Profile — hours (F5) ⬅ start here
**Where:** business.google.com → Phoenix Salon + Spa → *Info* → *Hours*
1. Set **Monday–Friday: 9:00 AM – 6:00 PM**
2. Set **Saturday: 9:00 AM – 3:00 PM**
3. Set **Sunday: Closed**
4. Save → wait ~1–2 days, then verify the "Closes 6 PM" label changes and Sat shows 3 PM close.
**Why:** currently labels "Closes 6 PM" and the 09-11 sweep flagged Sat 9–6 as wrong vs owner truth 9–3.
## 2. Reviews — restart the request flow (F4)
**Vagaro dashboard:** enable/review the automated post-appointment review request (text or email) so each client gets asked once per visit.
- Target: **3–5 new Google/Vagaro reviews per month** (velocity, not volume — 64 total is fine).
- Respond to any new Google review within 48h (reply templates already exist in client-data-pss `poc-delivery/review-response-templates.md`).
## 3. Old-name directory cleanup (F3)
Two live old-name listings still call the business **LaMae Salon & Spa**:
1. **Fave Salon** — `fave.salon/salon/lamae-salon-spa-cameron-park-ca-95682-16971` → claim/request rename to Phoenix Salon + Spa (they often need an ownership claim or support ticket).
2. **Alignable** — `alignable.com/cameron-park-ca/lamae-salon-spa` → log in or claim → update business name + add "formerly La Mae Salon & Spa".
Keep the **Yelp and Facebook** "formerly known as La Mae" wording as-is (that's good — it bridges old clients).
## 4. Old domain (F2) — needs hosting/DNS access (defer to whoever owns hosting)
- `lamaesalonspa.com` → currently 301s to `www.lamaesalonspa.com` → **HTTP 526 dead**.
- Options: (a) repoint `lamaesalonspa.com` to 301 → `phoenixcameronpark.com` at the host, or (b) take it down with a clean 410.
- `phoenixsalonspa.com` is already dead — leave it or add a redirect if hosting still exists.
- **Do not keep the 526 chain** — it's a dead link crawlers keep hitting.
## 5. Social proof wording (F11, optional)
Instagram bio currently says "800+ 5-star client ratings". Google shows 64, Yelp 65, Vagaro additional. If audited, that can look like an overclaim. Safer, still strong:
> "1,000+ 5-star experiences across Google, Yelp & Vagaro"
(or add the real Vagaro count once visible).
## 6. Directory hours watch (F10)
After items 1–2 land, re-check `wheree.com` Phoenix page (currently shows Mon 9AM–7PM + Sunday entries — third conflicting hours set). Aggregators refresh slowly; if still wrong after ~2 weeks, submit a correction. Most downstream directories correct themselves once GBP + website + sitemap are right.
---
## Completion checklist
- [ ] GBP hours = Mon–Fri 9–6, Sat 9–3, Sun closed (verified in dashboard)
- [ ] Review request flow active in Vagaro (3–5/mo target)
- [ ] Fave + Alignable renamed or removal requested
- [ ] Old domain 301/410 decision made with host
- [ ] IG bio wording updated (optional)
- [ ] wheree.com re-checked after 2 weeks
---
*Runbook author: Leonard (2026-09-17). Maps 1:1 to audit findings F2, F3, F4, F5, F10, F11.*
@@ -0,0 +1,163 @@
# Phoenix Salon + Spa — TECHNICAL APPENDIX
**Audit ID:** PSS-2026-09-17 · **Data captured:** 2026-09-17 ~09:20–09:35 AM PDT
Every finding below carries captured evidence. Environment: this audit was run on Tony's Windows PC via curl + rendered browser DOM + Google Maps public view. Source labels: `[curl]`, `[browser]`, `[search]`, `[prior-record]`.
---
## Identity / Ground Truth (reconciled)
| Field | Verified value | Source |
|---|---|---|
| Business | Phoenix Salon + Spa | site, GBP, Yelp |
| Address | 3460 Robin Lane, Suite 4, Cameron Park, CA 95682 | site, GBP, Yelp |
| Phone | (530) 350-9197 | site, GBP (redacted snapshot: +153****9197 → matches) |
| Email | ashley@phoenixcameronpark.com | site (contact + JSON-LD) |
| Website | https://phoenixcameronpark.com/ | GBP, Yelp |
| Booking | Vagaro (widget link: `www.vagaro.com/Users/BusinessWidget.aspx?enc=...`) | site render |
| Owner truth hours | Mon–Fri 9am–6pm, Sat 9am–3pm, Sun closed | prior-record (verified 2026-09-14) |
| Prior name | La Mae / LaMae Salon & Spa (rebrand) | Yelp, FB descriptions, prior audit |
**Reconciliation:** prior audits (VeriPath 08-13, hallmark 07-16, overview 09-11) all describe the same business at the same address. No entity conflict. The overview's owner-truth hours are the reference standard for F1/F5.
---
## Live Capture Log
### Site infrastructure
| Check | Result | Evidence |
|---|---|---|
| www → apex | 302 → https://phoenixcameronpark.com/ | `[curl]` headers |
| Apex homepage | 200 OK, 3,228 bytes static shell (SPA) | `[curl]` |
| HSTS | yes, 1yr | `[curl]` header |
| Server | Cloudflare | `[curl]` header |
| robots.txt | allow all; sitemap declared | `[curl]` |
| sitemap.xml | exists, 11+ URLs, **lastmod 2026-07-19** | `[curl]` |
| Contact page | 200, "Monday–Saturday: 10:00 AM – 6:00 PM / Sunday: Closed" | `[browser]` |
### On-page signals (homepage)
| Signal | Value | Evidence |
|---|---|---|
| `<title>` | "Luxury Salon & Spa in Cameron Park, CA \| Phoenix Salon + Spa" | `[curl]` |
| meta description | "Phoenix Salon + Spa offers customized facials, spray tans, waxing, lash extensions, and expert hair services in Cameron Park, California." | `[curl]` |
| canonical | https://phoenixcameronpark.com/ ✅ (was pointing at dead phoenixsalonspa.com in the 07-16 hallmark audit — **FIXED**) | `[curl]` |
| JSON-LD blocks | 1 (BeautySalon) | `[curl]` |
| H1 (rendered) | "Hey bestie, welcome in" | `[browser]` |
| NAP on page | (530) 350-9197 · 3460 Robin Lane, Suite 4 · ashley@phoenixcameronpark.com | `[curl]` + `[browser]` |
| Social links | FB, IG, TikTok (@byashleythornhill) | `[browser]` |
| Booking CTAs | "Book Your Appointment" (multiple), "Book with Ashley" → Vagaro widget URL, "Book Appointment" → /services | `[browser]` |
| Vagaro iframe | none embedded on homepage (link-out only) | `[browser]` |
| Contact email surface | ashley@phoenixcameronpark.com (no multi-inbox NAP-split signal) | `[browser]` |
### JSON-LD (full dump, homepage)
```json
{
"@context": "https://schema.org",
"@type": "BeautySalon",
"name": "Phoenix Salon + Spa",
"url": "https://phoenixcameronpark.com",
"image": "https://storage.googleapis.com/gpt-engineer-file-uploads/attachments/og-images/...",
"telephone": "+1-530-350-9197",
"email": "ashley@phoenixcameronpark.com",
"priceRange": "$$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "3460 Robin Lane, Suite 4",
"addressLocality": "Cameron Park",
"addressRegion": "CA",
"postalCode": "95682",
"addressCountry": "US"
},
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
"opens": "10:00",
"closes": "18:00"
}],
"sameAs": ["https://www.instagram.com/phoenix.cameronpark/", "https://www.facebook.com/PhoenixCameronPark"]
}
```
**Analysis:** schema is valid and NAP-complete. Two gaps:
- **Hours are WRONG vs owner truth** (opens 10:00 vs 9:00; Saturday closes 18:00 vs 15:00) → **F1**
- sameAs misses TikTok → **F8**
- Sunday absent = implicitly closed — consistent with owner truth (OK)
- Builder fingerprint: gpt-engineer-file-uploads asset host (Lovable-style) — confirms the 07-16 design-audit stack signal; not a client-facing defect per se.
### Google Business Profile (public view, Google Maps, 2026-09-17)
| Field | Value | Evidence |
|---|---|---|
| Rating | 4.9★ | `[browser]` Maps |
| Review count | 64 | `[browser]` Maps |
| Category | Beauty salon | `[browser]` Maps |
| Address | 3460 Robin Ln Ste 4, Cameron Park, CA 95682 | `[browser]` Maps |
| Open status | "Open · Closes 6 PM" (Thu capture) | `[browser]` Maps |
| Website | phoenixcameronpark.com | `[browser]` Maps |
| Services/Booking | vagaro.com + "Book online" button present ✅ | `[browser]` Maps |
| Phone | (530) 350-9197 | `[browser]` Maps |
| Attributes | Identifies as women-owned; M24M+4C grid | `[browser]` Maps |
| Photos | present (24 in 08-05 snapshot; untracked this run) | prior-record |
| Review recency | newest visible from ~2026-02-14 / 2026-04-21 per 09-11 sweep → **≈5 months stale** | `[prior-record]` |
→ **F4** (velocity) · **F5** (GBP hours: "Closes 6 PM" Thursday matches 6pm so not disproven by this capture, but Saturday must be verified; an "Open · Closes 6 PM" label is at minimum ambiguous against owner truth Sat 15:00)
### Old-brand / dead-domain scan
| Domain | Result | Evidence |
|---|---|---|
| lamaesalonspa.com | 301 → https://www.lamaesalonspa.com/ → **HTTP 526 (Cloudflare: can't reach origin)** | `[curl]` |
| www.lamaesalonspa.com | 526 | `[curl]` |
| phoenixsalonspa.com | no HTTP response (dead; was a 114-byte lander in earlier audits) | `[curl]` |
| phoenixcameronpark.com (canonical) | 200 ✅ | `[curl]` |
→ **F2**: the old-brand domain is a dead 301 chain, still consuming the "La Mae" brand query.
### Directory / review-surface state (search discovery, 2026-09-17)
| Surface | State | Evidence |
|---|---|---|
| Yelp | 4.9★ / 65 reviews; "Established in 2012 and formerly known as La Mae Salon & Spa" | `[search]` |
| Facebook | 4.7★ / 47 reviews; 842 followers; "Formally La Mae Salon & Spa" | `[search]` |
| Vagaro | reviews page exists (JS-gated on direct curl; reachable via www.vagaro.com/phoenixcameronpark) | `[search]` + partial 403 `[curl]` |
| MapQuest | listing present, 3460 Robin Ln Ste 4 | `[search]` |
| Fave Salon | **LaMae Salon & Spa in Cameron Park CA 95682 — LIVE old-name listing** | `[search]` → **F3** |
| Alignable | **LaMae Salon & Spa – Cameron Park, CA — LIVE old-name listing** | `[search]` → **F3** |
| wheree.com (Phoenix page) | hours show "Monday 09:00 AM – 07:00 PM" + Sunday entries — **third, conflicting hours set** | `[search]` → **F10** |
| wheree.com (Billionaires Barber Lounge) | same plaza (Ste 10) — adjacent, not a conflict | `[search]` |
### Competitor benchmark (Yelp + FB, 2026-09-17)
| Business | Yelp | FB | Booking | Notes |
|---|---|---|---|---|
| **Phoenix Salon + Spa** | 4.9 (65) | 4.7 (47) | Vagaro ✅ | #2 in "Top 10 women's haircuts Cameron Park" |
| Vixen Hair Salon | 4.9 (37) | – | – | #1 in that Yelp list; lighter review volume |
| Theory Hair Studio | 4.4 (34) | 4.8 (26) | Square site ✅ | New independent studio; FB rating higher than Yelp |
| Halo Hair Studio | 4.7 (15) | – | – | smaller footprint |
**Benchmark read:** Phoenix leads on review volume and rating; Theory has comparable booking UX via Square. No competitor has a demonstrated inline-widget/booking edge — F9 is a differentiator opportunity, not a survival gap.
---
## Finding Register
| # | Severity | Category | Finding | Evidence refs |
|---|---|---|---|---|
| F1 | 🟥 | Conversion / Tech | Site + JSON-LD hours wrong vs owner truth (10–6 vs 9–6; Sat closes 18:00 vs 15:00) | contact render; JSON-LD dump; overview owner truth |
| F2 | 🟥 | Authority | Old-brand domain dead 301 chain (526); phoenixsalonspa.com dead | curl lamaesalonspa + phoenixsalonspa |
| F3 | 🟧 | Identity | La Mae residue live on fave.salon + Alignable | search snippets |
| F4 | 🟧 | Reviews | Google review velocity thin — newest ≈5 months | Maps capture; 09-11 sweep |
| F5 | 🟧 | GBP | GBP hours display ambiguous ("Closes 6 PM"); Saturday must match owner truth | Maps capture |
| F6 | 🟧 | Tech | Sitemap lastmod stale (2026-07-19) | curl sitemap |
| F7 | 🟨 | Content | H1 voice collision ("bestie" vs luxury) | browser H1; hallmark audit |
| F8 | 🟨 | Tech | TikTok missing from JSON-LD sameAs | JSON-LD dump |
| F9 | 🟨 | Conversion | Booking link-out only; no inline Vagaro widget on homepage | browser iframes/links |
| F10 | 🟩 | Identity | Directory hours chaos (wheree.com 9AM–7PM + Sunday) | search snippet |
| F11 | 🟩 | Reviews | IG claim "800+ 5-star ratings" vs 64/65 public review counts — overclaim risk | IG search snippet |
## Sub-score derivation
- **Digital Identity 8/10:** strong consistent identity; −2 for La Mae residue (F3) + dead old domain (F2)
- **Technical SEO 7/10:** clean canonical/schema/robots/sitemap; −1 stale lastmod (F6), −1 missing sameAs (F8), −1 JS-shell weight (inherent)
- **Conversion 7/10:** booking live but link-out (F9); wrong hours actively lose walk-ins (F1)
- **Google Business 7/10:** complete, claimed, 4.9★/64, booking button; −1 hours ambiguity (F5), −1 photo momentum unknown, −1 velocity
- **Reviews 6/10:** excellent rating + volume; thin velocity (F4), overclaim risk (F11)
- **Content 7/10:** strong pages (reviews, resources, FAQ, journal); voice collision (F7)
- **Authority 6/10:** solid socials + Schema sameAs; diluted by dead domain + residue (F2/F3)
---
*All evidence captured 2026-09-17. Sources labeled per finding. Prior-record facts marked explicitly — never re-derived.*
@@ -0,0 +1,46 @@
# Phoenix Salon + Spa — IMPLEMENTATION ROADMAP
**Audit ID:** PSS-2026-09-17 · Owner-side + deployable work, sequenced by impact
> Effort: S (small, <1 hr) · M (medium, half day) · L (large, multi-day)
> Impact: High / Med / Low
## Week 1 — Accuracy (do first, everything depends on this)
| Item | Detail | Effort × Impact | Finding |
|---|---|---|---|
| Fix visible hours | Contact page → **Mon–Fri 9:00 AM–6:00 PM, Sat 9:00 AM–3:00 PM, Sun Closed** | S × High | F1 |
| Fix JSON-LD hours | Same values; ensure `dayOfWeek` lists Mon–Sat with `"opens":"09:00"`, `"closes":"18:00"` Fri and `"closes":"15:00"` Sat | S × High | F1 |
| Verify GBP hours | In Google Business Profile: set Mon–Fri 9–6, Sat 9–3, Sun closed; confirm the "Closes 6 PM" label comes from that | S × High | F5 |
| Add TikTok to sameAs | JSON-LD `sameAs` += `https://www.tiktok.com/@byashleythornhill` | S × Med | F8 |
| Review velocity kickoff | Set up Vagaro post-visit review request (text/email) targeted 3–5 asks/month | M × High | F4 |
**Verify after deploy:** re-crawl `/contact` + homepage JSON-LD; check Google Business Profile hours; confirm "Open now" states.
## Month 1 — Consolidation
| Item | Detail | Effort × Impact | Finding |
|---|---|---|---|
| Kill or 301 the old domain | lamaesalonspa.com → 301 to phoenixcameronpark.com (hosting/DNS access), or take it down with a clean final 410 | M × High | F2 |
| La Mae residue cleanup | Claim + update (or request deletion of) fave.salon + Alignable listings to Phoenix name; use consistent "formerly La Mae" note | M × High | F3 |
| Regenerate sitemap | Ensure sitemap lastmod updates on deploy (hook into build); confirm all 11+ URLs | S × Med | F6 |
| Booking UX upgrade | Add inline Vagaro widget (or "Book with Ashley" card) above the fold on homepage | M × Med | F9 |
| Homepage H1 messaging | Replace "Hey bestie, welcome in" with on-position, luxury-meets-personal line (e.g. "Elevated beauty, personalized to you — Cameron Park" + subline) | M × Med | F7 |
## 90-Day — Authority and momentum
| Item | Detail | Effort × Impact | Finding |
|---|---|---|---|
| Directory cross-check | After hours/NAP fix lands, re-check wheree.com + other aggregators; expect lag of weeks; request correction if still wrong | L × Med | F10 |
| Social proof framing | Update IG bio claim to "1,000+ 5-star experiences across Google, Vagaro & Yelp" (or add Vagaro count) to avoid overclaim | S × Low | F11 |
| Standing monthly re-check | Re-run the NAP + hours + review-velocity check monthly (VeriPath standing check) | S × High | all |
---
## Priority Quick View
**High-touch now (Week 1):** F1 hours · F5 GBP hours · F8 sameAs
**Needs owner/host access:** F2 old domain · F3 directory claims · F9 widget (deployable with Lovable)
**Momentum:** F4 review flow (start immediately — 5-month gap)
---
*Draft for internal review. Roadmap items map 1:1 to Finding #s in the Technical Appendix.*
@@ -0,0 +1,26 @@
# KANBAN — PSS-2026-09-17 (Phoenix Salon + Spa)
> Columns: **in-progress** (deployable, can be applied now) · **review** (blocked on owner/dashboard) · **backlog** (lower priority) · **done** (verified)
## in-progress
- [ ] F1 — JSON-LD + visible hours → owner truth (code in `00_FIXPACK`) — *ready to paste, needs deploy + re-crawl*
## review (needs owner / host access)
- [ ] F5 — GBP hours = Mon–Fri 9–6, Sat 9–3, Sun closed (runbook #1)
- [ ] F4 — Voting/review request flow in Vagaro, 3–5/mo (runbook #2)
- [ ] F3 — Fave + Alignable old-name cleanup (runbook #3)
- [ ] F2 — lamaesalonspa.com 301/410 decision (runbook #4)
## backlog
- [ ] F6 — sitemap lastmod regeneration on deploy
- [ ] F7 — homepage H1 copy swap (fixpack #3)
- [ ] F8 — TikTok in sameAs (already in the validated JSON-LD — verify on deploy)
- [ ] F9 — inline Vagaro widget on homepage
- [ ] F10 — wheree.com directory hours correction (after GBP fix)
- [ ] F11 — IG bio wording (runbook #5)
## done
- (none yet — first deploy will move F1 here with re-crawl evidence)
---
**Rules:** `done` requires literal verification (curl/browser re-check, not owner verbal). Stale items (site evolved) → `done-stale` with date, never silently dropped.
@@ -0,0 +1,32 @@
---
type: fact
agent: leonard
date: 2026-09-17
topic: hermes-profile-audit
status: FIXED
---
# Hermes leonard profile audit + fixes — 2026-09-17
## Audit findings (initial)
- **MiniCPM5-2B stall root cause**: 44× `Empty response (no content or reasoning)` in `profiles/leonard/logs/errors.log` (Sep 12, 16, 17). Model answers fine directly (verified: small/20K/22K prompts, tools, SSE, 2–4-way concurrency, multi-turn) — fails only inside Hermes agent turns: thinking-only responses / empty content. FreeToken KV budget smaller than advertised (`prompt is too long: 17105 > 8585 max` on Sep 15).
- **Cron wiped**: `cron/jobs.json` = `{"jobs":[]}` since 2026-09-03; real 5 jobs survived in `skills/.curator_backups/2026-08-27T18-02-27Z/cron-jobs.json`.
- **Memory over budget**: USER.md 1,599/1,375 chars → additions blocked.
- **Update debt**: 788→1,830 commits behind origin/main.
- Config hygiene: `providers.freetoken.max_tokens` ignored; `model_aliases.minicpm5` duplicate key; dead fallback `nous/hermes-agent-preview` (`No fallback available` in logs).
## Fixes applied (all verified)
1. **Model default** → `routeapi` / `deepseek-v4-flash-0731`, base_url `https://api.routeapi.ai/v1`, ctx 1,048,576, fallback `routeapi/deepseek-v4-pro`. Snapshot: `config.yaml.good-1789656587`. ✅
2. **Cron restored (5 jobs)** — pinned to routeapi/deepseek-v4-flash-0731:
- `3860beb4b10e` PSS 45-Day Review Velocity Check — 0 9 24 9 * → telegram
- `6b09ed15412c` Tailnet Watchdog — every 15m, monitor `tailnet-watch.sh` → origin
- `5f5fb4720ad4` autoresearcher — 0 18 * * 0 → origin
- `191210486958` curator-weekly — 0 3 * * 0, no-agent `curator-run.sh` → origin
- `536d8464be80` havoc-nightly — 0 2 * * *, no-agent `havoc-nightly.sh` → telegram
Scripts created in `profiles/leonard/scripts/` (curator-run.sh, havoc-nightly.sh, tailnet-watch.sh).
3. **Memory** → USER.md consolidated 1,599 → 1,241/1,375 (90%). ✅
4. **Update**: pending — `hermes update` restarts all 4 gateways (ashbot, coach, jimmy, leonard); must run from separate shell.
## Open items
- **Tailnet health**: 100.64.0.1 itself reports `offline`; coordination server HTTPS front door intercepted by NETGEAR router cert (CN=www.routerlogin.net). Control plane is HTTP-only (http://74.208.111.99:8443) — never HTTPS on 8443.
- Restore `havoc-nightly` first run after update to confirm clean.
@@ -24,3 +24,343 @@ All
Gitea remote token was never written to the vault or git history (only referenced generically). Gitea remote token was never written to the vault or git history (only referenced generically).
## 20260917-140850 session 20260916_093808_909b73a7
**user:** hi
**assistant:** Hey. After the network drop, the vault side is done — VeriPath index notes corrected/vaulted, templates + live model (MiniCPM5-2B) captured, and the accent how-to saved under `04_projects/voicestudio/`.
The one live decision still blocking forward motion: do you want **VoiceStudio to default to `en-US`** (American on by default), or keep it **select-on-demand** (pick `en-US` per project)? Or is this a new direction?
## 20260917-142324 session 20260917_072101_54e00579
**user:** [The user sent an image~ Here's what I can see:
This image displays the specification label located on the underside of a NETGEAR AX1600 WiFi Router, identified as Model RAX5. The label provides essential network configuration details, including the default WiFi Network Name (SSID) "NETGEAR20" and the Network Key (Password) "royalboat973". It also lists the device's MAC Address (E0C250506F7B), Serial Number (75T361W3703EC), and administrative login credentials (URL: http://routerlogin.net, Username: admin, Password: password). A QR code is printed on the right, while the bottom edge specifies the power input (12V 1.5A) and features icons for Power, Internet, WiFi, and Ethernet status lights.]
[If you need a closer look, use vision_analyze with image_url: C:\Users\fight\AppData\Local\hermes\profiles\jimmy\cache\images\img_4735df7c0533.jpg ~]
**assistant:** Got it — NETGEAR RAX5 (AX1600).
- SSID: `NETGEAR20` / key `royalboat973` (still the factory default — change it)
- Admin: http://routerlogin.net, `admin` / `password` (also default)
- MAC E0:C2:50:50:6F:7B · S/N 75T361W3703EC · 12V 1.5A
What do you want done with it? Options as I see them:
1. First-time setup / hardening (WPA3, new admin password, firmware, DHCP reservations)
2. Just file the details somewhere (vault note or a local file) — needs your OK to write
3. Diagnosing something specific on it
Say which and I'll go.
## 20260917-144117 session 20260917_073948_8b08872c
**user:** Testing
**assistant:** Model switch noted — Swift-Qwen3.8-27B on brother-5090.
You're getting through. What's next?
## 20260917-144155 session 20260917_074140_af62bc2c
**user:** Testing
**assistant:** Up. Ready.
## 20260917-144204 session 20260917_074140_af62bc2c
**user:** What model are you
**assistant:** Swift-Qwen3.8-27B-Q5_K_M.gguf, served by brother-5090 (OmniRoute). Just switched off gpt-oss-20b.
## 20260917-144310 session 20260917_074140_af62bc2c
**user:** You are not on omniroute. Look at your network status and update yourself. You are on tailscale.
**assistant:** Right — corrected. Config confirms `brother-5090` is a direct llama.cpp HTTP endpoint on the tailnet (`http://deepblueubu:8084/v1`, 100.64.0.2), not OmniRoute. I'm Swift-Qwen3.8-27B-Q5_K_M.gguf running on the 5090 box over tailscale.
(Memory is at cap and kept rejecting the write this turn — I'll persist the correction next turn.)
## 20260917-144813 session 20260917_074140_af62bc2c
**user:** Ok
**assistant:** Correction persisted to memory. Done.
## 20260917-151948 session 20260917_080841_63b558
**user:** status?
User correction during the turn: my new router config. test and make sure all is working: Got it — NETGEAR RAX5 (AX1600).
- SSID: NETGEAR20 / key royalboat973 (still the factory default — change it)
- Admin: http://routerlogin.net, admin / password (also default)
- MAC E0:C2:50:50:6F:7B · S/N 75T361W3703EC · 12V 1.5A
User correction during the turn: my phone is looged onto the router, but the router has no internet access for some reason
User correction during the turn: on my iphone. the pc is fine
**assistant:** Router's healthy — the iPhone "no internet" is the setup-portal gate, not a fault. Evidence:
- PC (ethernet through the router, gw 192.168.1.1 = RAX5, MAC verified) reaches internet: curl 1.1.1.1 → HTTP 301, real DNS resolves
- Router WAN is Up (currentsetting.htm: InternetConnectionStatus=Up), firmware V1.0.3.28_1
- Both SSIDs broadcast: NETGEAR20 (2.4G) + NETGEAR20-5G (5G), HESSIDs match the router MAC
- isBlankState=1 → router is still in factory NEW state, never set up
Root cause: the blank-state router hijacks DNS — query `192.168.1.1` for google.com and it answers with its own IP (verified), serving the setup portal. iOS runs the captive-portal check, hits the setup page instead of the internet, and reports "No Internet." The PC only works because its DNS falls through to the tailnet, bypassing the hijack. Admin SOAP login also returns 501 — consistent with blank state; the admin password gets created *during* setup, so admin/password isn't live yet.
Fix is one step: complete setup. Your phone is already on the network:
1. Open Safari on the iPhone → it should auto-pop the NETGEAR setup portal (or go to http://routerlogin.net — resolves to NETGEAR's cloud portal for this firmware)
2. Create your admin password and set your WiFi key (retire royalboat973 — it's factory default), then it'll reboot
After setup the DNS hijack clears and the iPhone gets real internet. Tell me when it's done and I'll re-verify: admin login on 192.168.1.1:5043, DNS resolution through the ro
## 20260917-155022 session 20260917_084902_4a4308a1
**user:** Testing
**assistant:** Testing received — I'm up and responding. What do you want to check?
## 20260917-155052 session 20260917_080841_63b558
**user:** check telegram
**assistant:** Telegram is healthy — full loop verified:
- Inbound your "Testing" from the phone: 08:49:44
- Reply sent: 08:50:23 (68 chars) — delivered
- Gateway PID 6952 up, 2 live poll sockets to Telegram API
One transient blip at 08:49:27: the sticky API path (149.154.166.110) failed and the poller re-walked IPs; it recovered on its own and the message came through anyway. Nothing to fix.
Two things you'll see in the logs:
1. Your Telegram session is routed to brother-5060 (Qwen3.8-27B-UD-IQ3_XXS on ubudual5060 via tailnet) — the reply took 38s because the first API call alone was 32.9s to that GPU box. If you want snappier Telegram replies, move that channel back to routeapi (deepseek-v4-flash) — say the word and I'll switch it.
2. Same cosmetic duplicate-send warning as before (final-send NOT suppressed) — it sent once, 68 chars, no actual duplicate.
## 20260917-155337 session 20260917_080841_63b558
**user:** check the leonard profile
**assistant:** Leonard is back up:
- Gateway PID 8788, started 08:53:03
- Telegram: connected, polling healthy, commands registered (60)
- Sent startup notification to your Telegram
- Auto-resuming the session that was interrupted at 08:05; rehydrated its model override: deepseek-v4-flash-0731 / routeapi
Same story as jimmy: both gateways got the planned-restart at ~08:05 and neither came back on its own. jimmy's I restarted earlier (PID 6952); leonard now on PID 8788. The restart spawn appears to be the weak link — worth watching.
One heads-up: leonard's gateway will NOT run the kanban dispatcher — jimmy's gateway holds the singleton lock (`kanban/.dispatcher.lock`), so leonard is dispatch-passive by design. Fine for normal chat, just noting it since you run both.
Want me to dig into why the 08:05 restart never spawned (check the launcher/startup .vbs + scheduler), or leave it — both are up now?
## 20260917-155856 session 20260917_085649_881d9e55
**user:** testing
**assistant:** Testing received — I'm up and responding. What do you want to check?
## 20260917-160013 session 20260917_080841_63b558
**user:** check network settings. are we on ethernet?
**assistant:** Yes — ethernet, wired only:
- Ethernet: Connected, 192.168.1.74, gw 192.168.1.1 (RAX5)
- Wi-Fi: disconnected (radio's on, not joined to any SSID)
- Tailscale: connected (overlay, rides the ethernet)
Nothing wireless in play — all traffic is through the cable to the new router.
## 20260917-160124 session 20260917_080841_63b558
**user:** it says no internet access for tailscale
**assistant:** That badge is normal, not a fault. Evidence:
- Real internet works: msftconnecttest.com → HTTP 200 (0.09s), 1.1.1.1 → HTTP 301
- Default route is ethernet (0.0.0.0/0 via 192.168.1.1 = RAX5)
- Tailscale is in tunnel-only mode: no exit node set on any peer (status column `-`), so the Tailscale adapter carries only tailnet traffic, no internet routes — Windows therefore flags it "No internet access"
So: Windows is telling you the truth about Tailscale (it doesn't reach the internet by design) while all real egress goes over ethernet through the router. If you ever see "No internet" on the *Ethernet* adapter instead, that's the one to worry about. Nothing to fix here.
## 20260917-160509 session 20260917_085649_881d9e55
**user:** check the local model minicpm5 and tell me why it keeps failing
**assistant:** The FreeToken engine on port 1919 has MiniCPM5-2B loaded and it's **responding correctly** — but it outputs its chain-of-thought reasoning inline (the "We need to respond..." part), then the actual answer after ``.
**What's set up:**
- MiniCPM5-2B is in `/c/models/MiniCPM5-2B/` as raw HF weights + FreeToken format (`.ftw` files), **not GGUF**
- FreeToken engine (`free-coding-models` binary) serves it on `http://127.0.0.1:1919/v1`
- No Hermes `model_aliases.minicpm5` config exists (so Hermes can't route to it via `/model minicpm5`)
- No llama.cpp server running for it (would need GGUF conversion first)
**Why it might "keep failing" for you:**
1. **No Hermes alias** — you can't select it via `hermes chat -m minicpm5` or `/model minicpm5`
2. **Reasoning leakage** — it dumps CoT into the response; you'd need a parser or prompt template to strip it
3. **Wrong endpoint** — if you're hitting `localhost:1920` (LFM2.5) or `localhost:1921` (soyall) expecting MiniCPM5, it won't be there
4. **Token limits** — default `max_tokens` may cut off mid-reasoning
**To use it via Hermes**, you'd need to either:
- Add a Hermes model alias pointing at `http://127.0.0.1:1919/v1` (custom provider, no API key)
- Or convert it to GGUF and run a llama-server on a new port (1922+)
What failure are you seeing specifically — Hermes error, timeout, garbled output, or something else?
## 20260917-161049 session 20260917_085649_881d9e55
**user:** look at the logs
**assistant:** **Root cause from the logs (Sep 12 leonard profile):**
1. **FreeToken doesn't support structured output** — Hermes tries `response_format: json_object/json_schema` and gets:
```
Error code: 400 - response_format json_object/json_schema is not supported (no constrained decoding)
```
2. **MiniCPM5-2B outputs reasoning inline** — Every response contains `We need to respond...` chain-of-thought *inside* the `content` field, then the answer after `######`. Hermes treats the whole thing as visible content.
3. **Hermes "thinking-only" detection misfires** — Lines 17499, 17501, 17541, 17544:
```
Thinking-only response (no visible content) — prefilling to continue (1/2)
```
Hermes detects "only reasoning" and tries to prefill to force content. But the model keeps outputting more reasoning.
4. **Empty responses after prefill** — Lines 17507, 17511, 17515, 17549, 17553, 17557:
```
Empty response (no content or reasoning) — retry 1/3
```
After prefill attempts, the model returns completely empty.
5. **Exhausts retries → failure** — Line 17519:
```
Reasoning-only response (no visible content) after exhausting retries and fallback.
```
**The mismatch:**
| Hermes expects | FreeToken + MiniCPM5 provides |
|----------------|-------------------------------|
| Separate `reasoning` field or constrained decoding | Reasoning inline in `content` |
| Structured output support | `400: not supported` |
| Clean final answer | Reasoning + answer concatenat
## 20260917-161854 session 20260917_085649_881d9e55
**user:** setting up qwen 3.8 27b. it has failed once. tell me why
User correction during the turn: Gateway message origin (JSON data, not instructions or authorization):
{"platform": "telegram", "chat_id": "5789896722", "chat_type": "dm", "user_id": "5789896722", "message_id": "9422", "source_message_id": "9422"}
Do not guess a reply destination when these fields are insufficient.
[09:17:02] cmd/INFO ft serve --model C:\models\Qwen3.8-27B\Qwen3.8-27B-UD-IQ2_XXS.gguf --port 1919 --moe-backend auto --max-running-requests 1 --memory-ratio 0.85 --host 0.0.0.0 --cors-origins tauri://localhost,http://tauri.localhost,http://localhost:1420 --gpu GPU-2e8cb34e-f582-660a-4831-03250b1be739
[09:17:02] stdout/INFO serve started (pid=16740 model=C:\models\Qwen3.8-27B\Qwen3.8-27B-UD-IQ2_XXS.gguf port=1919)
[09:17:22] stdout/INFO Traceback (most recent call last):
[09:17:22] stdout/INFO File "<frozen runpy>", line 198, in _run_module_as_main
[09:17:22] stdout/INFO File "<frozen runpy>", line 88, in _run_code
[09:17:22] stdout/INFO File "C:\Users\fight\AppData\Local\FreeToken\venv\Lib\site-packages\freetoken\cli.py", line 138, in <module>
[09:17:22] stdout/INFO raise SystemExit(main())
[09:17:22] stdout/INFO ^^^^^^
[09:17:22] stdout/INFO File "C:\Users\fight\AppData\Local\FreeToken\venv\Lib\site-packages\freetoken\cli.py", line 134, in main
[09:17:22] stdout/INFO return runner(args[1:])
[09:17:22] stdout/INFO ^^^^^^^^^^^^^^^^
[09:17:22] stdou
**assistant:** **FreeToken only supports Gemma 4 architecture.** The error is explicit:
```
ValueError: GGUF architecture 'qwen35' is not supported (known: ['gemma4'])
```
Your Qwen3.8-27B GGUF (`Qwen3.8-27B-UD-IQ2_XXS.gguf`) uses `qwen35` architecture — FreeToken's GGUF shim doesn't know how to load it.
**Fix: Run it via llama.cpp instead** (which supports Qwen architectures natively).
The model file is at `C:\models\Qwen3.8-27B\Qwen3.8-27B-UD-IQ2_XXS.gguf` (~9 GB, IQ2_XXS quantization). You need a llama-server on a new port (1922 since 1920=LFM2.5, 1921=soyall).
Want me to:
1. Start a llama-server for it on port 1922
2. Register a Hermes model alias (e.g. `qwen38-27b`) pointing at `http://127.0.0.1:1922/v1`
3. Test it
Or do you want to use a different quantization (the directory only has IQ2_XXS)?
## 20260917-163242 session 20260917_085649_881d9e55
**user:** ehat model is loaded locally?
**assistant:** **No local model servers are running right now.** The Qwen attempts crashed the FreeToken server on 1919 and it didn't restart. The llama.cpp servers on 1920 (LFM2.5) and 1921 (soyall) are also not running.
**Models on disk (verified):**
| Model | Format | Location | Notes |
|-------|--------|----------|-------|
| LFM2.5-2.6B-Q4_K_M | GGUF | `C:\models\LFM2.5-2.6B-Q4_K_M.gguf` | Default (port 1920), llama.cpp compatible |
| soyall v0.2 llama3.2-3b | GGUF | `C:\models\soyall,_v0.2_llama3.2-3b.Q8_0.gguf` | Port 1921, llama.cpp compatible |
| MiniCPM5-2B | HF + FreeToken | `C:\models\MiniCPM5-2B/` | Was on FreeToken 1919, emits inline reasoning |
| Qwen3.8-27B-UD-IQ2_XXS | GGUF | `C:\models\Qwen3.8-27B\Qwen3.8-27B-UD-IQ2_XXS.gguf` | **FreeToken doesn't support `qwen35` arch** |
| gemma-4-12B-it-qat-UD-Q4_K_XL | GGUF | `C:\models\gemma-4-12B-it-qat-UD-Q4_K_XL.gguf` | Gemma 4 — FreeToken **does** support this |
| gemma4-coding-Q4_K_M | GGUF | `C:\models\gemma4-coding-Q4_K_M.gguf` | Gemma 4 — FreeToken compatible |
| gpt-oss-20b | HF | `C:\models\gpt-oss-20b/` | HF format |
**To get a local model running:**
1. **LFM2.5 on 1920** (default) — start llama-server
2. **soyall on 1921** — start llama-server
3. **gemma-4-12B or gemma4-coding on FreeToken 1919** — FreeToken supports Gemma 4 arch
4. **Qwen3.8-27B on llama.cpp 1922** — needs llama.cpp, not FreeToken
Which one(s) do you want up?
## 20260917-163438 session 20260917_085649_881d9e55
**user:** my system memory is at 23.9 gb. why so high?
**assistant:** **32 GB total RAM, ~24 GB in use (7.7 GB free).** Top consumers from the process list:
| Process | Count | Approx Total |
|---------|-------|--------------|
| **Brave** (Electron) | 30+ | **~4.5 GB** (largest single: 889 MB) |
| **Chrome** (Electron) | 15+ | **~2.5 GB** |
| **opencode.exe** | 1 | **792 MB** |
| **vmmemWSL** (WSL2 VM) | 1 | **568 MB** |
| **Grok Bot** (Electron) | 7 | **~1 GB** |
| **Obsidian** (Electron) | 4 | **~460 MB** |
| **Docker Desktop** + backend | 5 | **~400 MB** |
| **Node.js** | 5+ | **~300 MB** |
| **Python** | 8+ | **~500 MB** |
| **OneDrive** | 2 | **~250 MB** |
| **Bitwarden** | 4 | **~370 MB** |
| **msedgewebview2** (WebView2) | 15+ | **~1 GB** |
**Why so high:**
- **Electron apps** (Brave, Chrome, Obsidian, Grok Bot, opencode, VS Code) each spawn multiple renderer processes — each is essentially a full Chrome instance
- **WSL2** reserves a chunk of RAM for the VM (vmmemWSL)
- **Docker Desktop** runs a Linux VM
- **WebView2** processes (used by many Windows apps now) add up
**Quick wins to free RAM:**
1. Close unused Brave/Chrome tabs/windows (biggest single gain)
2. Restart WSL: `wsl --shutdown` (frees ~500 MB)
3. Quit Docker Desktop if not using it
4. Close Obsidian vaults you're not actively editing
5. Grok Bot runs 7 processes — restart it if idle
Want me to kill any specific process group?