Sync with live vault: 28 new files, 7 imports, 16 updates

This commit is contained in:
2026-09-01 13:33:50 -07:00
parent dac3008e20
commit 8b26efd3b7
43 changed files with 1557 additions and 166 deletions
@@ -1,9 +1,9 @@
# Athena Oracle — decisions
# Athena Oracle — Decisions
| Date | Decision | Why |
|------|----------|-----|
| 2026-07 | Cap ~5 approved sources | Depth over firehose; user preference |
| 2026-07 | Disable RSS from ENABLED_SOURCES (code kept) | Stability / approved set |
| 2026-07 | Velocity ranking for GitHub | Avoid forever-viral old repos |
| 2026-07 | Public Gitea repo | Shareable oracle artifact |
| 2026-07 | Epictetus git author | VPS/Gitea default — not a second human co-author |
| 2026-08-31 | Cap ~5 approved sources | Depth over firehose; user preference |
| 2026-08-31 | Disable RSS from ENABLED_SOURCES (code kept) | Stability / approved set |
| 2026-08-31 | Velocity ranking for GitHub | Avoid forever-viral old repos |
| 2026-08-31 | Pure rule-based scoring | No embeddings, no LLM classification needed |
| 2026-08-31 | Epictetus git author on VPS/Gitea | Server default — not a second human co-author |
@@ -0,0 +1,10 @@
# Athena Digest — YYYY-MM-DD
## Top Entries
| # | Score | Bucket | Verdict | Source | Title |
|---|-------|--------|---------|--------|-------|
## Theme Scan
## Notes
@@ -1,29 +1,69 @@
# Athena Oracle — status
# Athena Oracle — Status
**Updated:** 2026-07-09
**Repo:** `Tony_tech/athena-oracle` (Gitea, public)
**Runtime:** `~/oracle` (if present) · cron ~13:00 UTC + theme_scan
**Updated:** 2026-08-31
**Repo:** `~/Projects/athena-oracle/` (cloned from `Tony_tech/athena-oracle`)
**DB:** `~/Projects/athena-oracle/oracle.db`
## What it is
Multi-source AI research pipeline: ingest → score → pattern/falsification orientation. MVP = pattern-proof, not a polished product.
Multi-source AI research pipeline: ingest → score → bucket → render. Pure rule-based, no LLM required for classification. MVP = pattern-proof, not a polished product.
## Pipeline
```
adapters/ → Source adapters (GitHub, arXiv, Reddit, HN, HF, RSS)
oracle/db.py → SQLite storage + schema migration
oracle/scoring.py → Bucket classifier + scoring engine
oracle/summarize.py → Rule-based summarization
oracle/variants/ → Render config (default, research, devops, brief)
```
## Sources
| Source | Status | Notes |
|--------|--------|-------|
| GitHub | ✅ Token-auth (5k req/hr) | 20 entries fetched, scored |
| arXiv | ✅ Working | 20 entries fetched, scored |
| Reddit | ⏸ 429 rate-limited | JSON blocked, RSS fallback also 429 from this IP |
| HackerNews | ✅ Working (via HN API) | 19 entries fetched, scored |
| HuggingFace | ✅ Working | 20 entries fetched, scored |
| RSS | ✅ Working | feedparser installed, 14 entries fetched |
## Current State
- **93 entries** in `oracle.db` (20 GitHub + 20 arXiv + 19 HN + 20 HF + 14 RSS)
- 82 scored via `attach_scoring()`
- **Verdicts:** 4 PUBLISH, 14 WATCH, 42 ARCHIVE, 33 DROP
- **Buckets:** 44 Uncategorized, 20 Research, 18 Infrastructure, 4 Shipping, 2 Culture, 2 Model Release, 3 Problem Solved
## Done
- Adapters + pipeline (5 approved sources; RSS code kept but disabled from ENABLED_SOURCES)
- Reddit bail-fast on 403/429
- GitHub velocity sort (not raw stars)
- HF adapter with live verification discipline
- Whitepaper + README (model-agnostic framing)
- Commits under Epictetus identity (server default)
- Cloned to local PC
- Schema migration + scoring columns applied
- GitHub token wired (`.env`, 5k req/hr)
- `python -m oracle ingest --limit 20` — full pipeline working
- Cron job `athena-ingest` (daily 24h) → ingests + scores + writes digest to vault
- Vault project files created: `status.md`, `decisions.md`, `digest-template.md`
## Not done / next
- Keep verification discipline on any new adapter (3 live samples)
- Depth over source-count expansion
- Surface digests into vault: `04_Daily/` or `05_Output/athena/` when useful
- [x] Enable GitHub, arXiv, HF, HN, RSS adapters (tested locally)
- [ ] Fix Reddit RSS (429 from this IP — may need proxy)
- [x] Cron job for daily ingestion
- [ ] Wire digests into daily notes automatically
- [x] Test render (variants → static site) — 4 variants + AI News Daily built
- [ ] Surface top entries to daily notes
## Links
## Deployment blocker (2026-08-31)
- Gitea: `Tony_tech/athena-oracle`
- Policy: vault prefers project facts here, not agent chat memory
- **Rendered fully locally** (99 entries, 31 summarized): 4 HTML variants in `_preview/{default,brief,devops,research}/` + `site/ai-news-daily/index.html` (12KB, 50 stories).
- **Deploy to `preprod1.afterthedemo.com` blocked:** all remote access is down. VPS SSH 74.208.111.99:22 is firewalled (times out), Tailscale 100.64.0.1:22 times out, all users/key/password auth rejected. Gitea (74.208.111.99:80/443) and headscale (:8443) still reachable — VPS is alive, only SSH is blocked.
- **VPS SSH rate-limit:** >3 failed connect attempts within a period trips the firewall and blocks the IP for a while — do NOT loop SSH attempts.
- **Options (need Anthony):** (a) SSH in himself and add `~/.ollama/id_ed25519.pub` or `~/ssh-keys/vps-deploy.pub` to `hermes-leonard` for passwordless deploy; (b) temporarily open port 22 for our IP; (c) deploy via Gitea Pages / webhook-based rebuild nginx side.
## Decisions
- Cap ~5 approved sources (depth over firehose)
- Pure rule-based — no embeddings, no LLM classification
- Velocity ranking for GitHub (not raw stars)
- GitHub unauthenticated rate limit: 60 req/hr (budget calls, 30s timeout per source)
@@ -0,0 +1,215 @@
# Internet Presence Audit — Thornhill Construction / Canine Solutions Dallas
**Prepared for:** Keisha Tucker
**Location:** Rockwall, Texas — serving the DFW Metroplex
---
## 1. The Current Landscape
When a prospective client searches for you, this is what they see:
- **Website:** https://servicedogtrainingdfw.com
- **Facebook:** "The Service Dog Team Academy by Canine Solutions Dallas"
- **Google Business Profile:** Canine Solutions Dallas (different address and phone)
- **Yelp:** The Service Dog Team Academy
- **BBB:** Canine Solutions Dallas
- **Patriot PAWS:** Competing for the same local keywords (different organization, easy to confuse)
**The core problem:** Your business looks like two different operations with conflicting contact information. For someone investing thousands in a service dog, that inconsistency creates doubt before they ever pick up the phone.
---
## 2. Website Assessment
**URL:** https://servicedogtrainingdfw.com
**Phone:** (469) 786-7877
**What's working:**
- Services are clearly explained
- FAQ covers ADA compliance, timelines, and pricing
- Local SEO pages (Frisco, etc.) are smart
- Team is named and visible
- Policies are disclosed upfront
**What needs attention:**
- Street address is not prominent on the homepage
- Business hours and public email are hard to find
- Board-and-train pricing differs across pages (~$1,750 vs. ~$1,950)
- "8,080+ dogs trained" is a large claim for a home-based operation—document it or adjust it
- "Top-rated on Google" does not match your current native Google rating
- Valerie's certifications (KPA CTP, AKC CGC Evaluator) are strong assets, but they are not linked to official verifying directories
---
## 3. NAP Consistency (Name, Address, Phone)
**Source Comparison:**
| Source | Business Name | Address | Phone |
|--------|--------------|---------|-------|
| Website | The Service Dog Team Academy | Rockwall/DFW (not prominent) | (469) 786-7877 |
| Yelp | The Service Dog Team Academy | 811 E Yellowjacket Ln, Ste 105 | (469) 786-7877 |
| BBB | Canine Solutions Dallas | 811 E Yellowjacket Ln | — |
| Google (Canine Solutions) | Canine Solutions Dallas | 1446 Memorial Dr | (945) 500-6244 |
| Various Directories | Mixed | 1950 N Goliad, others | Mixed/legacy numbers |
| BringFido | Canine Solutions Dallas | Incomplete | Alternate number/email |
| Facebook | TSDTA by Canine Solutions Dallas | Often incomplete | (469) 786-7877 |
**Hours are also inconsistent:** Yelp shows your actual schedule; several directories list "Open 24 hours" and still reference COVID-era protocols.
**Why this matters:** Reviews, calls, and map directions are splitting across two identities. A client who saves the wrong phone number or drives to the wrong address becomes a lost lead—or writes the next 1-star review.
**The fix:** One public name. One address. One phone. One website everywhere. Everywhere.
---
## 4. Reviews by Platform
**Platform | Rating | Volume | Notes**
|----------|--------|--------|--------
| Yelp — TSDTA | ~1.4 / 5 | ~10 | Recent reviews are negative |
| Yelp-fed "Canine Solutions" | ~1.0 / 5 | ~9 | Same complaint themes |
| Google — Canine Solutions Dallas | ~3.8 / 5 | ~45–47 | Mixed—strong praise and older issues |
| Directory Aggregators | 4.4–4.8 | 130–146 | Blended sources; not native Google |
| BBB | F | 2 unanswered complaints | Not accredited |
| BringFido | 4.0 / 5 | 4 | Small sample; stale contact info |
| Bark.com | ~5.0 / 5 | Low volume | Not enough to offset Yelp/BBB |
**What happy clients say:**
- Home environment beats a kennel
- Dogs bonded with you, Valerie, Bailey, and Charlie
- Public manners improved after board-and-train
- Good follow-up and positive-reinforcement approach
**What recent critical reviews say:**
- Poor communication during board-and-train stays
- Refund and deposit disputes
- Facility appeared empty during visits
- Handler felt untaught
- Harsh language: "scam," "rip-off"
The reality: Older reviews of you and Valerie are warm and personal. New prospects read the newest reviews first. There are very few public owner responses, which leaves negative narratives uncontested.
---
## 5. Better Business Bureau
- **Listed as:** Canine Solutions Dallas
- **Also known as:** The Service Dog Team Academy
- **File opened:** April 2019
- **Accredited:** No
- **Rating:** F
- **Basis:** Failure to respond to 2 complaints
One published complaint alleges unprofessional conduct and refusal to refund despite non-delivery of services.
**Impact:** Anyone searching your business name plus "reviews" or "BBB" will see this first.
---
## 6. Social Media
| Platform | Status |
|----------|--------|
| Facebook — facebook.com/caninesolutionsdallas | Active. Training clips, public-access work, giveaways. Modest engagement, but it proves the work is real. |
| Instagram — the_service_dogteam_academy | Exists. Mirrors Facebook content. Not a major driver. |
| YouTube, TikTok, LinkedIn, X | No established official presence |
**Priority:** Fix your core listings so Facebook is not competing with a conflicting Google profile.
---
## 7. Claims to Tighten Up
- "8,080+ dogs trained" — Impressive if documented. If not, it invites skepticism. "Hundreds of DFW dogs" is safer and still credible.
- "Top-rated on Google" — Your native Google listing is ~3.8. Adjust the language or improve the score.
- "Veteran-owned" — Powerful if true and documented. Only use it if it is defensible on your site and Google attributes.
- Certifications — Link Valerie's KPA and AKC CGC Evaluator to the official directories. Unlinked, they are just copy.
Service-dog buyers are naturally skeptical. Defensible claims build more trust than impressive ones.
---
## 8. The Business Impact
You are not invisible. You are inconsistent. And inconsistency at the research stage kills high-ticket sales.
A serious buyer comparing you to Patriot PAWS or another DFW trainer will check Yelp and BBB before calling. That is where leads are being lost right now.
The good news: this is fixable. It is housekeeping and response work, not a full rebuild.
---
## 9. Priority Actions
If you do nothing else, do these:
1. **Pick one public name.** Make the other an "also known as" only.
2. **Standardize NAP.** One address, one phone, one website everywhere. Merge or close the extra Google profile.
3. **Answer the BBB complaints.** A factual response is better than silence.
4. **Reply on Yelp.** Short, calm, offer to take it offline. Do not argue the word "scam" in public.
5. **Put address, hours, and email on the homepage.**
6. **Align pricing across all pages** to your current rate.
7. **Clarify refund language** for unused sessions. Firm is fine; unclear is not.
8. **Substantiate or replace the 8,080+ claim.**
9. **Ask happy clients for Google reviews** after follow-up sessions, not at drop-off.
---
## 10. What I Can Deliver
I can handle the online execution. I cannot log in as you, delete Yelp reviews, or guarantee a 5.0 rating. But I can unify your presence, draft the responses that matter, and stop prospects from bouncing before they call.
**Brand & Listings**
- Recommend primary name and AKA structure
- Build one master NAP record
- Inventory and correct every listing we can find
- Submit edits to major directories; strip stale COVID text and "open 24 hours"
- Prep Google Business Profile merge documentation
**Website Copy (not a redesign)**
- Draft homepage contact block with address, hours, phone, email
- Align board-and-train pricing across pages
- Rewrite "8,080+" and "top-rated on Google" into defensible language
- Add credential directory links once verified
- Draft clearer refund policy language for your approval
**Reputation**
- Draft BBB responses from your timeline and notes
- Draft Yelp owner replies for common complaint themes
- Create Google review request script and link
- Monitor new reviews for 30 days
**Social (light)**
- Posting cadence and captions from existing training footage
---
## Next Steps
**Confirm your preferred public name and address.** I will have the listing map and first drafts ready within a few days.
**What I need from you:**
- Final decision on public name, address, and phone
- Access or screen-share time for Google Business Profile, Yelp, BBB, website, and Facebook
- You to submit BBB and Yelp replies (I draft; you send)
- You to ask satisfied clients for reviews (I provide the script and link)
- Legal approval if we adjust contract or refund language
**Timeline:**
- **Day 1-2:** Confirm name/address/phone
- **Day 3-5:** NAP inventory & listing cleanup
- **Day 6-8:** Website copy drafts (contact block, pricing, claims)
- **Day 9-10:** BBB/Yelp response drafts
- **Day 11+:** Review, approval, and implementation
**Investment:** $500.00 for the Trust Layer Rebuild (listing inventory, website copy corrections, BBB/Yelp response drafts, review solicitation kit, and hands-on Google profile consolidation support).
**Optional: 30-Day Monitoring** — Post-implementation review monitoring, scheduled Facebook posts, and weekly check-ins.
---
*This audit is based entirely on publicly available information: your website, Google, Yelp, BBB, Facebook, Instagram, and common business directories.*
**Prepared by:** Hermes Agent (Tony's team)
*For Keisha Tucker — Thornhill Construction / Canine Solutions Dallas*
@@ -0,0 +1,41 @@
# Hermes Local PC Setup — Status
**Started:** 2026-08-28 (Day One local)
**Vault:** `C:\Users\fight\Documents\Obsidian Vault` (Agent OS layout)
**Profile:** leonard (local Windows)
## Current State
- Hermes Agent fully installed and running locally (gateway active, Telegram connected)
- SOUL.md updated for local PC + Agent OS memory layer; boot order wired (HOME → memory_policy → lessons → project status)
- Obsidian skill active; HOME.md + memory_policy in place; boot files created (operating_rules, memory_consolidation, proposed_memory)
- Providers: freetoken (1919), llama-cpp (1920), brothers (Tailscale); default = LFM2.5-2.6B via llama-cpp, fallback = brother-5090 (27B via tailnet)
- LFM2.5 on llama-cpp CUDA at :1920 (~145 tok/s, RTX 3060); FreeToken gpt-oss-20b at :1919 (manual start, can't coexist on 12GB GPU)
- Voice/TTS: wake word "hey Jimmy" (sherpa, input_device=1) + Edge TTS AriaNeural, auto_tts=true, barge-in enabled (wired 2026-08-30)
- Vault RAG live: `~/Projects/vault-kb/` ChromaDB + LM Studio embeds (:1234) — 167 chunks / 29 files indexed, venv at `.venv/`
- Auto-start: `start-models.bat` in Windows Startup (LFM2.5 auto-starts on boot)
- Watchdog: `lfm25-watchdog` cron (every 2m) auto-relaunches LFM2.5 if port 1920 dies
- Constant-learning loop: `vault-consolidation` cron (daily 6am) consolidates sessions → vault
- Git sync: `vault-sync` cron (every 6h) pushes vault to Gitea private mirror
- AgentOS clone at `C:\Users\fight\Documents\AgentOS` for reference/templates
## Next Actions
- ~~Verify Grok provider~~ — not needed, using LFM2.5 + brother nodes
- ~~Test obsidian skill reads/writes~~ — confirmed working
- ~~Monitor consolidation cron~~ — cron active, verify first run
- ~~Set up DSH web UI reliably~~ — dsh-web on port 3080, dsh-activity-watch cron monitoring
- ~~Populate 01_user/ with durable preferences~~ — current-context.md exists, proposed_memory.md has 2 items
- ~~Create daily brief workflow~~ — 04_Daily/ with 2026-08-29 and 2026-08-30 notes
- ~~Fix model startup on reboot~~ — start-models.bat in Startup, lfm25-watchdog cron
- ~~Fix FreeToken~~ — identified coexistence problem; manual start only now
## Key Files
- [[HOME]]
- [[00_system/memory_policy]]
- 02_agents/leonard/lessons.md
## Blockers / Notes
None major. Focus on making the vault the single source of truth for agent context.
@@ -0,0 +1,47 @@
# Hermes Telegram Picker — Audit
> Deep-dive findings from a focused code audit of the Telegram inline-keyboard picker.
> Component: `hermes-agent/plugins/platforms/telegram/adapter.py` (gateway run.py orchestrates).
> Audit date: 2026-08-29.
## Scope
- Model picker (`send_model_picker` → `_handle_model_picker_callback`; callbacks `mp:`/`mpg:`/`mpv:`/`mm:`/`mc:`/`mb`/`mx`/`mg:`)
- Choice picker (`send_choice_picker` → `_handle_choice_picker_callback`; callback `cp:`)
- Shared pagination core `_format_choice_page` in `gateway/platforms/base.py` (~line 4333)
## Finding (broken / inconsistent)
- **[BUG — auth gap]** `_handle_model_picker_callback` performs **NO** `_is_callback_user_authorized` gate.
Every other state-flipping inline-button path in the same adapter gates:
- choice picker (`_handle_choice_picker_callback`, line ~6673) — gated
- approval buttons (`ea:`, lines ~7238 / ~7418) — gated
- slash-confirm (`sc:`, ~7318) — gated
- clarify (offer_job / scan, ~7531 / ~7602) — gated
- Only the model picker is ungated.
- Consequence: in a shared group/supergroup/forum, **any** user who can reach the picker message
can tap buttons and switch the session's active model (global-ish config flip) without being
an allowed user. The choice-picker comment explicitly states the intent: "unauthorized users in
a shared group must not flip session/config state via someone else's picker message" — the model
picker violates exactly that rule, for the highest-impact state.
- Severity: medium (needs a group context + picker message reachable; DMs are single-user so only
group/forum/channel contexts are exposed). A security inconsistency, not an outage.
## Non-issues confirmed (looked, OK)
- Callback prefix routing `("mp:","mpg:","mpv:","mm:","mc:","mb","mx","mg:")` — ordering safe;
`mpg:` does not collide with `mp:` (different 2nd char), `mc:` present, no prefix collision.
- `_format_choice_page` pagination math (clamp, slice, `(N–M of T)` suffix) is correct.
- `_build_model_keyboard` uses global `abs_idx = start + i` so `mm:` maps correctly across pages.
- `mx:noop` page-counter button handled by the catch-all branch.
- Choice-picker button indices `cp:{i}` use the flat local enumerate — correct for a single level.
## Recommended fix
Add the same `_is_callback_user_authorized` gate at the top of `_handle_model_picker_callback`
(mirror the choice-picker gate at line ~6673). Gate before mutating `_model_picker_state`.
## Owner / status
- **✅ FIXED (2026-08-29)** — committed `38622dc` to local hermes-agent checkout.
Fix is **structural / regression-proof**: moved the auth gate to the single dispatch
point in `_handle_callback_query` (telegram adapter.py ~7199), covering ALL picker
callback prefixes (`mp:`/`mpg:`/`mpv:`/`mm:`/`mc:`/`mb`/`mx`/`mg:`/`cp:`) in one place.
Any future picker callback prefix added there is auto-protected. `py_compile` OK.
- **Activation pending**: running gateway PID 22864 loaded pre-patch code; will pick up
the fix on its next (supervisor) restart. Do NOT force-kill mid-conversation.
@@ -0,0 +1,67 @@
# Larry Thornhill — Interview (raw transcript)
**Date:** 2026-08-30 (conversation between Anthony and Larry, Yelp/Google walkthrough)
**Type:** Raw verbatim transcript. Source of truth for website About/history copy.
**Recorded by:** Anthony; transcribed from screen-share walkthrough call.
---
## Transcription (verbatim, cleaned of hesitations only)
Okay, so what we're doing here, we're just on Yelp — the basic thing. You have 2 reviews, 5 stars. There's really no other photos than you here, and that's fine, but obviously you want to have some photos of what you're doing or what you've done, obviously, right? And then there's no… So this is the correct phone number. So Yelp has the correct phone number for you. Okay. Not that's not correct. Okay. That's why we're here. The old number one we lived on alone. So if someone's trying to find you on Yelp and find some construction work, and they find you, they're going to find a number that doesn't go anywhere. That old number… that's instantly losing business, obviously. So we're going to fix that. That's the 1st thing.
And then, one of the things we can do is go over Google Maps — gonna say Thornhill Construction. It's not even auto… You might not be on it. Let me go… Placerville, maybe? Because that's where you live. I'm not seeing you on here. I did not go down below… There's a Thornhill but these guys are in St. Louis, Missouri. That's not you. **I can't find you on Google Business pages. So that's another thing we're going to need to do** — do the same exact thing. All we're kind of trying to do is get your phone numbers right — works on Yelp first. And we'll just begin here. Sometimes this can be a pain in the butt and it's messy and you have to do all this crap, but I want to help you get through it and do it. Because once you do, it's gonna open the door for more business.
So there's no Thornhill Construction coming up there. Let me go to Bing. Angie's list has you. That's good. So, Yelp, Angie's, White Pages… if there are links that have an incorrect number, we're gonna need to try it. That's wrong. Look at this — **530-344-1504**. Wrong. That's how things get messed up — we just have these disconnected contact information. It's not right.
So what's your correct phone number? We have a landline. **530-303-3950** — that's my home number. (Calling) "Hello? You've reached the landline for Larry Thornhill at Thornhill Construction." Now, the other line is my cell phone, which is **530-306-4629**. And those are the only 2 numbers that we have.
So what I would recommend — I think it's always best to have one main number. So we may, if it's cool with you, choose one phone number that always rings to you. That's your cell, right? So it's gonna be on your website, your Yelp, Apple Maps, Google Business pages, whatever else picks you up — maybe Nextdoor. You should certainly be on Nextdoor. That's a good one.
This one right here is just a template — obviously this is not going to remain. We're gonna have your pictures. This is like AI, you can see that. Basically you're gonna have your phone number here. I do have a logo, but right now it just says Thornhill Construction. It looks kind of cool, but I've got a logo and we're going to implement that. Got your license number here. It says you've been in business since 1977. What's the true date you entered the industry — when you were licensed, that you could legitimately say? **19-76. 1976.** So been in business in the construction industry since 1976 — that's 50 years in the industry. All right. I've actually been in the trade longer. I got in the trades in **1969**, and then I got my license in **1976**. That's when I went into business for myself. So legit **57 years of experience, 50+ years licensed.**
Again, this is just a 5-decades basic web page. We're going to fix this. These are fake reviews — all placeholders, right? So I'm going to fill this in with your actual stuff. We need some reviews, which I think you've already given me. I'm gonna look back on our email correspondence and use those.
Then we have "request an estimate." There's a place where there's a form where people will fill it out for a quote; when they hit send it will hit your email box — go to your **thornhillconstruction.com**; that's where we're gonna connect them. That's what we want — the form will show people.
And then gallery. These AI deck pictures — look at that staircase, does that look weird to you? Very weird. This is what AI does, it does stupid stuff. So what we want on these pictures is that we're going to have some **before-and-afters and stuff that you've done** — real work.
Then about. So you got into the business in 1976 — did you get in it in San Jose? It was in the Bay Area. So you started out in the Bay Area? — **I started the apprenticeship program in 1969. Became a journeyman carpenter 3 years after entering the program. Worked as a foreman for several companies, then moved up to a superintendent.** When people were moving into the house they wanted corrections, so I did all the punch list items / detail work, making sure the house was the way the customer wanted it. **At age 26, in 1976, I went to the contractor's license school, got my license, and began working for myself.** Started out as a subcontractor framing, building the frames, then moved to a general contractor and built the whole house. **Built hundreds of custom homes** in the time I'd been in business. — That's awesome.
What year did you move to Placerville? — **2001.** So you've been doing construction jobs in the Placerville / El Dorado County area for 25 years — half the time you've been in business, you've been out here. Yeah, we live here.
As far as the feel — I'm going for something that's not a large company. Small family-owned business? Yeah. **And the thing I'm most proud of is that clients can talk to me, and I listen to them.** Women have commented that I'm the only contractor that listened to them, heard them out, and then when their idea was not so good, I offered suggestions that they appreciated. So you're really good at guiding people to the end result that they want. Yeah. **[phone call interruption — Kendra Smith]** You're good at communicating, getting people to flow into an idea they already wanted to begin with, maybe they didn't know their ideas structurally work. And I respect what they have to say.
And then basically, being in the area for 25 years, at this point looking to sort of downsize — a half-retirement, semi-retired. I want to just help people with their deck projects where they need repair work done, or replacements. Maybe minor handyman too? — **I'd really like to do just decks. Decks only.** That's cool. And I don't take on any more work than I could still give good service. Right, exactly. So **I only want to do one or two jobs a month.** I'm not into big numbers anymore. I'm into satisfying customers who don't have a whole lot, and especially people in your local area, because you live here — they're your neighbors.
The next thing we need to do is get your name back — **thornhillconstruction.net**, what you used to have. We want to buy that again. It's like $12 for a year. We'll talk about hosting; probably under $50, maybe a lot less. So the whole thing might be **under $80** to get everything done. Once we do, I'd like to see you have **Larry@ThornhillConstruction.net** — that's your business domain. I don't want to have you have some Gmail account.
I definitely need as many **before-and-afters of deck projects as you've done**. Some of the stuff you sent looked cool but wasn't photographed well, so it was hard to see here's-what-it-was-before and here's-what-it-is-after. You want people to see that visual proof. We need to do these things in the next 48 hours, if we can. It doesn't matter if it's a few years old. I just want to have some stuff up there. Larry: earlier on I'd probably have a lot more pictures. Hunt through those when you get home — just save them. There's a nice deck I did… a little house I removed… I'll have to go through and see if I can round up some pictures.
How many do you need? If I'm looking for someone to do my deck, I want **before, after, before, after, before, after.** A minimum of 6 usable pictures. If it's four, we can start with that, not the end of the world, but I'd like 3 examples of recent work that's a good before/after. If we have two, if we have one, it'll work. As a consumer, I want to see a couple things — what this guy's done before. Larry: I got a really good before on one that I totally demoed the deck out and rebuilt the whole thing — that's kind of dramatic. You want to see dramatic.
So as soon as we get these things plugged in and your domain bought back and hosting booked, we can take this website and put it up, then connect it to your Google Business page, your Yelp, Apple Maps. We're gonna do all that, and tag everything so you're easy to find online, and insert structured data so it's easy for AI to find you too.
Do I need any more information? — No, I mean, that's about it. You got enough for my history; I have enough to plug that in. My background is simple. I'm not going to put every little detail — I want a good, nice, general idea just to let people know here's who this person is. There's some really good people in this industry and some real jerks; you want to avoid the jerks. So you got somebody who's lived here a while and he's got 50 years in the industry plus 25 years in the same area — that builds trust and it's important. Okay, I'm going to close this out; I'm gonna transcribe this later.
---
## Key facts confirmed
- **Phones (the only two):** Landline **530-303-3950** (home), Cell **530-306-4629** (canonical, rings Larry). Anthony recommends ONE main number = cell.
- **Yelp:** has a **wrong/dead** number somewhere (**530-344-1504** is wrong/disconnected) → must fix. Currently 2 reviews, 5 stars.
- **Google Business:** Larry is **NOT listed** → must create/claim.
- **Angie's List / White Pages:** lists exist — audit each for wrong numbers.
- **Nextdoor:** should join (good for local business).
- **History:** trades since **1969** (apprenticeship, Bay Area/San Jose), journeyman 3 yrs later, foreman → superintendent (punch-list/detail), **licensed 1976 at age 26**, subcontractor framer → GC building custom homes, **"hundreds" of custom homes**. Moved to Placerville **2001** (25 yrs in El Dorado County).
- **Positioning:** semi-retired, **decks only**, **1–2 jobs/month**, won't overbook ("satisfying customers who don't have a whole lot"), values listening (esp. women who said he's the only contractor who heard them).
- **Domain:** buy back **thornhillconstruction.net** (~$12/yr); email **Larry@ThornhillConstruction.net**; total spend ~**under $80** with hosting.
- **Photos needed:** **min 6 usable before/after**, ideally 3 recent-work examples; Larry has an older dramatic demo-and-rebuild set.
- **Copyright note:** current listings say "since 1977"; the true industry-entry year is **1969**, licensed **1976** — sites should reflect 1969/1976, not 1977.
## Decisions / next actions
- Choose **one** phone number for all listings → **cell 530-306-4629** (canonical).
- Fix Yelp + audit Angi/White Pages numbers.
- Create + verify Google Business Profile.
- Buy domain, set up hosting, wire contact form → **Larry@ThornhillConstruction.net**.
- Collect 6+ before/after photos from Larry (flagged; not urgent today).
@@ -0,0 +1,48 @@
# Thornhill Construction Website — Status
**Business:** Family deck/construction business, Placerville CA. Larry Thornhill (uncle) licensed since 1976, CSLB #336956. Tony owns Thornhill with Larry.
**Domain:** thornhillconstruction.net (~$12/yr)
**Email:** Larry@ThornhillConstruction.net
**Canonical phone:** +1 (530) 306-4629 (Larry's cell) — use everywhere; landline 530-303-3950 is secondary only.
**Repo:** Gitea `Tony_tech/thornhill-website` → `~/Projects/thornhill-website/` (static, single-file HTML, NO build step → drop into webroot).
## Source of truth — interview
- Raw transcript saved: [[larry-thornhill-interview.md]] (2026-08-30 walkthrough).
- Confirmed: cell **530-306-4629** is canonical; **one** number everywhere. Landline 530-303-3950 exists but is NOT on site/ads.
- **Yelp has a WRONG/dead** number somewhere (530-344-1504) — must fix. 2 reviews, 5 stars.
- **Google Business: NOT listed** (must create/claim). Angi + White Pages listed — audit numbers.
- History: trades 1969, licensed **1976** (not "1977"), moved to Placerville **2001** (25 yrs local). Semi-retired, **decks only**, 1–2 jobs/month.
- Domain: buy back **thornhillconstruction.net** (~$12/yr); email **Larry@ThornhillConstruction.net**; total ~< $80 with hosting.
- Photos owed by Larry: **min 6** usable before/afters, ideally 3 recent-work examples.
## Current State (2026-08-30)
- Built + pushed to Gitea (4 commits: initial, real Larry story, .net domain fix, real logo).
- On-disk `index.html` is current and clean:
- Canonical phone in all `tel:` links (5× 530-306-4629), landline removed as primary.
- CSLB #336956 on-page (stat + footer) — legally required for CA contractor advertising.
- `<meta name="description">` present.
- Real assets: Larry's real logo (`images/logo.jpg`) + 8 real photos (hero-deck, project-house, gallery-1/2/3, craft, stairs-before/after); one placeholder reference remains.
- Slacked/async review (Leonard review → Jimmy fixes) drove the above; fixes 1-4 confirmed applied.
- Site demoed live earlier via a tunnel; final deployment pending.
## Update (2026-08-31)
- **Site signed off by Tony**; pushed to Gitea branch `ready-for-seo` (2026-08-30).
- **Handed to Leonard (VPS) for SEO/CMS pass** via agent-discussion board: meta descriptions/title tags, Open Graph/Twitter card markup, Schema.org LocalBusiness structured data, sitemap.xml presence. Leonard acknowledged (will run audit).
- Photos: Larry's 12 staged in `assets/images/decks/`, gallery wired (lazy-load + lightbox); Larry approved selection (✅). Logo still pending (placeholder SVG in place).
## Open / Blockers
- **Deployment pending.** DNS: `thornhillconstruction.net` currently resolves to `162.255.119.233` — NOT the VPS (`74.208.111.99`). To go live on the VPS (Caddy) the domain must be repointed AND webroot/Caddy edits need root (sudo), which requires Anthony's grant. Alternative: free static host (Cloudflare Pages / Netlify), auto-redeploy on push. Preview route: `*.afterthedemo.com` subdomain (no root needed) — awaiting Anthony's choice.
- Larry still owes: 6+ before/after photos (currently ~8 real, wants more) + logo finalization (real logo now in).
- Gitea URL field mentions `.com→.net` correction was applied (domain bought back).
## Next Actions
- Pick deployment path (VPS+Caddy vs Cloudflare/Netlify) once Anthony grants sudo/DNS decision.
- Keep canonical number out of any landline references; collect before/after shots from Larry.
## Links
- [[HOME]]
@@ -0,0 +1,37 @@
# VeriPath — Status
**Core business:** Human-supervised verification service for local businesses to prevent silent customer loss.
## Current Operating Mode (NOW)
- Manual audits
- Evidence capture
- AI representation testing
- Silent Customer Loss Maps
- Canonical business records
- Owner review
## Project Structure
- `veripath/` — core business project
- `veripath/audit-keisha-tucker-2026.md` — first audit (Service Dog Team Academy / Canine Solutions Dallas)
- `veripath/templates/` — audit templates, email delivery templates
- `veripath/skill/` — veripath skill (pending)
## Deferred (LATER)
- GeoLocal integration
- MCP / agent infrastructure
- Payment flows
- Multi-tenant platforms
**Operating truth:** This status.md, evidence standards, canonical record schema, audit methodology, and client records win.
## Links
- Main repo: veripath-repo (TBD)
- Audit test runs: `veripath/audit-*`
- [[HOME]] for Agent OS context
- Gitea: `Tony_tech/veripath` (TBD)
Update this file after every significant audit or decision.