Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
a7c20ed · 2026-07-23 · Pin autonomous Claude CLI invocation to Opus (--model opus)
Bare 'claude' spawn inherited the CLI's drifting default model; pin to Opus
so this build/gen loop always runs on the intended model.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
d2da3c7 · 2026-06-03 · Untrack committed .log files and ignore *.pre-* backups
Removes 4 stale weekly log files from git tracking (they were committed
before the *.log ignore rule existed) and adds *.pre-* to .gitignore so
backup files never get tracked. Working-tree files are left untouched.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ecd4ce9 · 2026-05-26 · Add lost-pet alert opt-in surface (/me prefs page + signup checkbox)
The backend (migration 017 + src/lib/lost_pet_alert.js + dispatch wiring in
community.js) already shipped, but nothing set alert_lost_pets=TRUE, so the
audience was always empty and the email footer's /me link 404'd.
- expose alert_lost_pets/_sms on req.user (currentUser SELECT)
- signup: explicit unchecked opt-in checkbox -> alert_lost_pets
- GET /me preferences page (the surface the alert email + one-click off link to)
- POST /me/alerts/lost-pets toggles opt-in on/off
- SMS kept off — page states we never text without separate opt-in
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2f8b7b5 · 2026-05-26 · Honor ?next= after login/signup so claimers return to the claim flow
requireUserHtml already redirects logged-out users to /login?next=/clinic/:id/claim,
but the auth forms hardcoded location.href='/circles' and ignored it. Now both
forms read ?next= (with an open-redirect guard: only single-leading-slash local
paths, rejecting //host and backslash), carry it across the login<->signup
cross-links, and redirect there on success.
6635ad9 · 2026-05-15 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
b086583 · 2026-05-14 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
bcf525d · 2026-05-14 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
cd61af8 · 2026-05-13 · yolo: Generate sitemap.xml + robots.txt
Task: yolo.directory-sitemap
Prompt: In ~/Projects/animals: generate a /sitemap.xml route that lists every breed, every business detail page, every shows event, every breed gallery page. Cache at agent level — regenerate every 6h. Add /r
446da7c · 2026-05-13 · yolo: Breed page: nearest businesses that work with this breed
Task: yolo.breed-page-related-businesses
Prompt: In ~/Projects/animals: /breeds/:slug currently shows top-rated vets generally. Replace with a query that prefers vets in the visitor's home_zip (if logged in) or top-rated for that species. Also add a
7decd3c · 2026-05-13 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
3fdcff8 · 2026-05-12 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
fa433df · 2026-05-12 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
e54de52 · 2026-05-12 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
aea9589 · 2026-05-11 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
3846ae8 · 2026-05-11 · yolo: Adoption events on /shows page
Task: yolo.shelter-adoption-feed
Prompt: In ~/Projects/animals: queue a `events` table insert per CA shelter (category='shelter' or 'rescue') with kind='adoption_event' that's a recurring weekly Saturday 11am-3pm 'Open adoption hours' tied t
8874f66 · 2026-05-11 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
035fe9a · 2026-05-10 · yolo: Codex debate on agent's own diff
Task: yolo.codex-debate-on-self
Prompt: In ~/Projects/animals: trigger a 4-round claude-codex apply-mode debate on whatever the YOLO loop has produced in the last 6 hours. Use ~/.claude/skills/claude-codex/scripts/start.sh. Name the run wit
04b9602 · 2026-05-10 · fix: animals-hawk pm2 path portable across Mac1/Mac2
Hardcoded /opt/homebrew/bin/pm2 fails on Mac2 where pm2 is at ~/.npm-global/bin/pm2 — Mac2 was failing every 30m health-check, "/opt/homebrew/bin/pm2: No such file or directory" log line × hours.
Now picks first available: ~/.npm-global/bin/pm2 → /opt/homebrew/bin/pm2 → command -v pm2.
Caught by yolo-loop tick 10 reading hawk.log error pattern.
aed8935 · 2026-05-10 · [morning-review] animals: gate layoutModernClinic vet copy/prices/badges by m.copy.medical so pet stores stop rendering DVM fees
Why: review flagged biz-15249-a "Patriot Pet Supply" (pet store) shipping
"Wellness exam $95, Spay $225, Vaccine package $140" — fabricated medical
prices for a non-vet category. The "Common visits" price list and the
"$95 Wellness exam / 24h Lab results" hero badges are vet-only by
definition.
What changed: layoutModernClinic now branches on m.copy.medical:
- hero h1/sub falls back to category copy bundle when not medical
- the four hero badges swap the medical-fee pair for s1/s2 service blurbs
- the "Common visits" price list is replaced by a "What we do" service
triple sourced from m.copy.s1/s2/s3 for shelters/kennels/stores/parks
Also wires the Book CTA to m.bookHref instead of hard-coded "#book" so
clicks resolve to /contact.html on subsites.
9e958c6 · 2026-05-10 · [morning-review] animals: gate layoutPlayful + layoutBookingFirst.why by m.copy.medical so non-vet sites stop rendering vet copy
Two layouts unconditionally rendered veterinary-clinic copy:
- layoutPlayful (.pl-hero/.pl-grid) hardcoded "The {city} vet your pet
actually wants to visit" + Dogs/Cats/Exotics exam-room cards. Houston
Humane Society (a SHELTER) rendered this verbatim.
- layoutBookingFirst (.why-grid) hardcoded "Same-week openings / Honest
pricing / Real follow-up — Email check-in 48h after every visit".
Farrington Kennels (BOARDING) rendered the medical-follow-up promise.
Both now read m.copy.* from copyBundle() so kennel/shelter/store/groomer/
trainer/park/cafe categories get their appropriate s1/s2/s3 + lead, and
only true vets keep medical-flavored copy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
68854b0 · 2026-05-10 · [morning-review] animals: gate layoutPlayful + layoutBookingFirst.why by m.copy.medical so kennels/shelters/stores stop rendering vet copy
Two layouts unconditionally rendered veterinary-clinic copy:
- layoutPlayful (.pl-hero/.pl-grid) hardcoded "The {city} vet your pet
actually wants to visit" + "Cat-only exam room" cards. Houston Humane
Society (a SHELTER) rendered this verbatim.
- layoutBookingFirst (.why-grid) hardcoded "Same-week openings / Honest
pricing / Real follow-up — Email check-in 48h after every visit".
Farrington Kennels rendered the medical-follow-up promise.
Both now read m.copy.* (the category-aware copy bundle from copyBundle())
so kennel/shelter/store/groomer/trainer/park/cafe categories get their
own appropriate s1/s2/s3 + lead text, and only true vets keep the
medical-flavored copy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ed86357 · 2026-05-09 · yolo: Business owners can claim their listing
Task: yolo.business-claim-flow
Prompt: In ~/Projects/animals: add a /clinic/:id/claim route. If logged-in user submits, it sends a verification email to the email already on file for that business. Click the link, businesses.claimed_by get
51d1f13 · 2026-05-09 · yolo: Generate sitemap.xml + robots.txt
Task: yolo.directory-sitemap
Prompt: In ~/Projects/animals: generate a /sitemap.xml route that lists every breed, every business detail page, every shows event, every breed gallery page. Cache at agent level — regenerate every 6h. Add /r
856153b · 2026-05-09 · yolo: Wire Stripe Checkout for upgrade orders
Task: yolo.upgrade-stripe-real
Prompt: In ~/Projects/animals: the upgrade_orders table currently goes to 'pending_payment' manually. Wire actual Stripe Checkout: when an order is placed, create a Stripe checkout session with the right line
f2d7975 · 2026-05-09 · yolo: Lost-pet listing → SMS alert to neighbors in ZIP
Task: yolo.lost-pet-alerts
Prompt: In ~/Projects/animals: when a marketplace listing of type='lost_pet' is posted, find all app_users with home_zip matching listing.zip OR within ZIP-3 prefix, AND who opted in (new column: alert_lost_p
2fa8980 · 2026-05-08 · yolo: Business owners can claim their listing
Task: yolo.business-claim-flow
Prompt: In ~/Projects/animals: add a /clinic/:id/claim route. If logged-in user submits, it sends a verification email to the email already on file for that business. Click the link, businesses.claimed_by get
33ff008 · 2026-05-08 · yolo: Pet store detail: 'what they sell' section
Task: yolo.pet-store-products
Prompt: In ~/Projects/animals: /clinic/:id pages where category='pet_store' should show a generic services/inventory blurb. Add a `products_carried` text[] column to businesses (migration needed). Default com
d1144d1 · 2026-05-08 · yolo: 3D dog park: use dog's actual photo as billboard texture
Task: yolo.dog-park-dog-photo
Prompt: In ~/Projects/animals: in public/dogpark/dogpark.js, when an owner_pets photo URL is provided in the join message, build a Three.js Sprite from a CanvasTexture that loads that photo + the dog's name u
2069600 · 2026-05-08 · yolo: Email verification on signup
Task: yolo.email-verify-gate
Prompt: In ~/Projects/animals: when a user signs up, send a verification link via George (localhost:9850 /api/send) and require click before they can post marketplace listings or send friend requests. Store v
e7e8d06 · 2026-05-08 · yolo: Breed page: nearest businesses that work with this breed
Task: yolo.breed-page-related-businesses
Prompt: In ~/Projects/animals: /breeds/:slug currently shows top-rated vets generally. Replace with a query that prefers vets in the visitor's home_zip (if logged in) or top-rated for that species. Also add a
53b3de1 · 2026-05-08 · yolo: Surface adoptable animals on pound/shelter detail pages
Task: yolo.pound-detail-photos
Prompt: In ~/Projects/animals: on /clinic/:id pages where category in ('shelter','rescue','pound'), query shelter_animals table for that business_id and show available animals as cards (name, breed, photo if
f22df9f · 2026-05-08 · rel=alternate JSON + HTTP Link header on /breeds and /photographers
Cross-fleet directory pattern (VCL fbd4be4, NPH 51036bf, lacountyeats 963d23a)
applied to animals. /api/breeds.json + /api/photographers.json already exist
as JSON twins; this commit just surfaces them via RFC 8288 Link headers.
Changes:
- src/server/index.js /breeds: HTTP Link with canonical + alternate (mirrors
the filter query params q/species/size/energy onto /api/breeds.json)
- src/server/index.js /photographers: HTTP Link with canonical + prev + next
+ alternate (paginated; respects ?page= query)
- ALSO fixed pre-existing ES-module crash on line 92: 'const helmet =
require()' replaced with 'await import()' destructure pattern. Server
was in pm2 crash loop before this commit; now listening on :9720.
Smokes (with basic auth admin:DWSecure2024!):
- /breeds → 200 + Link header (canonical + alternate)
- /photographers?page=2 → 200 + Link header (canonical + prev + next + alternate)
Cross-fleet rel=alternate now: VCL + NPH + lacountyeats + animals = 4 of 6
directory targets. Skipped: lawyer-directory (SPA, autocomplete pattern),
professional-directory (api-only, no HTML listing).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
18ee2c0 · 2026-05-08 · yolo: Adoption events on /shows page
Task: yolo.shelter-adoption-feed
Prompt: In ~/Projects/animals: queue a `events` table insert per CA shelter (category='shelter' or 'rescue') with kind='adoption_event' that's a recurring weekly Saturday 11am-3pm 'Open adoption hours' tied t
7d3642f · 2026-05-08 · yolo: Wire /my-pets to /dog-park — auto-fill avatar
Task: yolo.dog-park-from-mypets
Prompt: In ~/Projects/animals: when a logged-in user goes to /dog-park, pre-fill the join form with their first owner_pets row (name, hero_image_url, breed-to-color mapping). The dog-park already accepts dogN
01839be · 2026-05-07 · checkpoint: codex --apply overnight + gitignore generated content
5 days of autonomous animal-agent work:
- 15,098 businesses (was 6,101) — multi-state OSM ingest rotation
- 5,825 site audits, 6,060 mockups, 358 generated subsites
- 13,023 PD/CC breed images across 119 breeds
- 13,150 emails harvested
- 1,328 agent tasks completed across 8 cron categories
Codex --apply mode delivered hardening:
- agents/animal-agent/server.js: BASIC_AUTH gate (env-only, no source fallback)
- src/scripts/build_subsites.js: category-aware copy buckets (vet/shelter/
boarding/grooming/retail/training/park/generic) — was emitting "Board-
certified veterinarians, Fear Free Certified" on shelter/store pages
- src/server/dog_friends.js: P0 auth fix — /friends/* endpoints now require
pet ownership; previous version let anyone read home_zip / send requests
as anyone else's pet
- migrations/012_site_audit_html.sql: stores raw HTML alongside screenshots
.gitignore: untrack public/{mockups,sites,screenshots,uploads}/, raw_html/,
exports/, *.png/jpg — these are agent-generated content, not source. Reduces
git diff from 5,714 → ~30 real source changes.
b9336a0 · 2026-05-04 · [morning-review] animals: escape biz fields, validate website href, fix font URL + meta tags
Critical: stored XSS via unescaped ${biz.*}/${m.*} in 15 layouts and contact
page (raw <script>, " onmouseover=" payloads now neutralised in meta() and
pageHtml()). javascript: hrefs blocked via safeWebsiteHref(). Each Google
Fonts family name now percent-encoded individually so future names with
special chars round-trip. Adds <html lang="en">, viewport meta, and unique
<title> per page. Font name allow-list guards CSS :root injection.
High: subpages get unique <title>, address line no longer shows leading
commas when street is missing, tel: hrefs strip non-digit chars, --biz 0
no longer collapses to null, and pool.end() runs in finally so a Postgres
error can't leak the connection.
b70d15d · 2026-05-01 · fix(events): codex P1 XSS in /shows map + P2 dedupe collision
P1 (security) — render.js:389-396
The /shows page injected scraped event titles via raw JSON.stringify in a
<script> block, then built popups via 'string' + p.title concat fed to
Leaflet's bindPopup (which treats it as innerHTML). Event titles come from
third-party AKC/UKC pages — a malformed or hostile title containing
</script> or HTML became stored XSS on a public route.
Switched to:
- <script type="application/json" id="show-pts">…</script> + JSON.parse
(with a <-escape on the JSON output for an extra layer in case the
pattern is ever copy-pasted into a non-JSON context)
- Popup built via document.createElement('strong') + .textContent so
titles can never become HTML.
P2 (data integrity) — dog_shows_ca.js:158 + migrations/007_*.sql
ON CONFLICT (source, source_url, start_at) collided for AKC/UKC where
source_url is the shared search/results page. Two distinct shows on the
same date silently overwrote each other in the events table.
Added title to the dedupe key + new migration that drops the old unique
index and creates idx_events_dedupe (source, source_url, start_at, title).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
bf214ed · 2026-05-01 · fix: codex review findings — creds + URL parse + license regex
Three issues codex flagged on 2026-05-01:
P1 — src/scripts/2week-followup-audit.sh:12: Hardcoded George Basic-auth
credential. Same pattern as run-meeting.sh had — read GEORGE_AUTH from env
or ~/Projects/secrets-manager/.env, abort send if neither has it.
P1 — src/lib/auth.js:157-158: `new URL(req.headers.origin)` throws on a
malformed Origin or Referer header, surfacing as an unhandled promise
rejection in this Express 4 async handler — could crash the process.
Wrap with safeHost() so a bad header is treated as cross-origin (rejected)
instead of a 500.
P2 — src/enrich/wikimedia_breed_images.js:37: ALLOWED_LICENSES regex only
matched hyphen-joined or no-separator forms (CC-BY-4.0, CCBY4.0). Real
Commons LicenseShortName values use spaces too (CC BY-SA 4.0, CC BY 2.0),
so the enricher was rejecting most CC-BY images. Updated regex to accept
hyphen, space, or no separator between CC/BY/SA and the version.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
95e913a · 2026-05-01 · fix(community): debate-driven fixes for visibility, comments, signup
5 defects converged on by claude+codex debate (animals-pawcircles-2026-05-01):
P1 functional — marketplace SELECT omitted visibility/app_user_id/visible_circles,
so the in-memory userCanSeeListingSync filter read undefined and hid every
non-public listing from logged-in users. Now selects the fields and
over-fetches 200 → filters → slices to 100.
P1 privacy — /circles/:slug returned matching-zip/state listings with no
visibility check at all, leaking scoped listings to anyone browsing a
circle. Now post-filtered through the same userCanSeeListingSync helper
used elsewhere (single source of truth for the gate).
P2 — POST /marketplace/:id/comment had no listing-access check; users could
comment on listings they couldn't see. Now loads the listing and runs the
visibility gate before insert.
P2 — auth.js signup: species_pets from a checkbox group is a string when one
box is checked, an array when several. Insert into TEXT[] failed for the
single-checkbox case. Normalize via [].concat() before insert.
P3 — admin_pitch.js: "All states" <option> had no value=""; form posted
state="All states" and SQL filter got junk. Added value="".
Smoke-tested signup with no/single/array pets (all 200, species_pets stored
as {}, {dog}, {dog,cat} respectively), and confirmed all routes still 200.
9e16943 · 2026-05-01 · fix(map): stop near-me SQL from crashing, hide empty cats, add cap notice
The home-page "Sharing your location loads the closest 24 listings…" was
the reported "map does not work" — /api/near-me returned 500 because
Postgres saw $1/$2/$3 as untyped 'unknown' and refused subtraction. The
CTE param-typing pattern in index.js fixes the planner. Plus three
user-visible cleanups from the dual-Claude review:
- renderHome filters out zero-count categories (Specialty Hospitals,
Daycare) so the home-page grid stops linking to dead-end pages.
- renderCategory annotates the map when the 200-marker cap is hit,
e.g. /dog-parks now shows "Map shows first 200 of 377 geocoded
listings — full table below."
- All Leaflet CSS + JS <link>/<script> tags get integrity= hashes
back; they were stripped during the working-tree refactor.
Also lands the broader companion work that was sitting uncommitted:
geo.js (browser geolocation + ipapi.co fallback), sort-table.js,
OSM California / Reddit / Nextdoor ingest stubs, email enrich
migration, llm helper.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>