Boulder Things To Do gets a resident section
Private deliverable. Enter the hub password to continue.
That's not right. Try again.
Boulder Things To Do gets a resident section
The site only ever served people who leave on Sunday. Now it serves the people who stay.
A whole new pillar: /live-here/, eleven pages for residents. LIVE and GREEN.
Annette's ask: the site only served people who leave on Sunday, and she wanted it to serve people who live here. Dance classes, improv, hobby groups, groups for older people, horseback riding, pottery, jewelry, cooking, volunteering. Mid-session she added sports and gyms ("list all the options in town").
Site is now 31 pages. Validator GREEN on all 8 checks across 30 pages, run
twice (--runs 2). Deployed to Production on --branch main, commit 23deeca,
Environment confirmed Production.
The structure, and why it is not what was first agreed
She approved "hub plus 6 pages". It shipped as hub plus 11, because DataForSEO contradicted the plan before a word was written:
- Pottery, cooking and horseback were going to be ONE bundled "hands-on classes" page. They are three separate queries (210, 320, 210/mo). A bundle would have competed weakly for all three. Split.
- Jewelry is 10/mo, so it rides along with pottery rather than getting a URL.
- Her sports request landed on
pickleball boulderat competition index 1, the lowest number in the whole project. It earned its own page.
Section totals roughly 2,400 searches/mo, most of it low competition. For
scale, /free/ targets 210. Full keyword table is in the comment at the top of
src/pages/live-here/index.astro. Read that before restructuring anything.
⚠️ Corrections the verification caught. Each would have shipped as an error.
- CU BOULDER HAS NO OLLI. It runs an Auditors Program (55+ pays $80 alumni / $95 non-alumni per term). The Osher institute serving Boulder belongs to DU ($65/yr, 50+) and teaches here. Different sponsor, age, price, structure. Do not merge them.
- CU Continuing Ed does not teach improv, despite a confident search summary naming four forms it supposedly teaches. Their own site search returns ZERO for "improv" and "theater".
- Comedy Works has no classes page. Several secondary sources say it teaches stand-up. Their classes URL 404s and there is no nav link.
- Boulder Mountain Clayworks is in KETCHUM, IDAHO. Ranks in Boulder searches on name alone.
- Mudslingers is in Lafayette, not Louisville (aboutboulder.com has it wrong).
- Firehouse drop-in is $20, not the $15 that circulates.
- Bridge House suspended ALL in-person volunteering on 1 Aug 2026, six days before we checked. Every other Boulder volunteering list still sends people to its mentoring roles.
- volunteerconnection.net is now an AI content farm, domain re-registered May 2024, zero Boulder content.
- Boulder Valley Ice is NOT closed, it rebranded to Blue Sport Stable. The inverse of the usual stale-listing problem: a listing site says closed, the old domain is dead, and the business is alive and larger at the same address.
- Pickleball court reservations went $5 to $10/hr on 14 Nov 2025 and stopped being bundled with rec center membership.
- BOLDERBoulder charges its volunteers $40 to $50.
- Peppercorn was founded in 1977 AS A COOKING SCHOOL and no longer teaches. Cured is closed. South Street Market is dormant. FRCC's enrichment catalog has one live course and it is weaving.
⚠️ Two conflicts are PUBLISHED AS CONFLICTS. Do not resolve them by picking.
- CU rec center community access. Its membership-rates page lists community
tiers ($55/mo, $28 at 65+); another page says access is limited to
students/staff/faculty/alumni; a third mentions community access suspended,
apparently years stale.
/live-here/gyms/prints the rates AND the caveat. - Boulder School of Metals quotes the same Stack Rings workshop at $145 on one page and $165 on another, disagreeing on whether silver is included.
⚠️ The delegation bug Annette named, and the fix
She spotted it live: "you often seem to have subagents that delegate to more subagents and then don't return answers." Correct. A sub-agent reads the same fan-out rules and terminates the moment it has dispatched children, returning a confident future-tense status line and zero data. Its children are unreachable. Worse, the orphans hold concurrency slots (cap 20) and starved a later dispatch twice.
Fix is now in ~/memory/topics/background-agent-rules.md: two lines go at
the top of every agent prompt (do not spawn sub-agents; your final message must
BE the data). The fan-out moves up to the orchestrator: I decompose, each agent
is a leaf. Recovery: SendMessage to the same agent id resumes it with its
transcript intact, so interrupted research is not paid for twice. That
recovered five threads after a session restart this session.
Photos: eight of twelve are honest fallbacks
Commons has no photograph of the historic Pottery Lab at 1010 Aurora, the
Dairy, the Avalon, either Age Well Center, Pleasant View, or any Boulder
pickleball court. Fallbacks are labelled as such in fetch_photos.py.
⚠️ The first photo pass returned FIVE different Pearl Street Mall files for five different pages. Distinct files are not the test, distinct SUBJECTS are. Sent back and replaced. If you add pages, apply the same test.
⚠️ Fox Theatre and Mary Rippon Theatre spell themselves -re. Proper nouns, exempt from the American English rule. Boulder Theater does not. Do not sweep.
Fixed in passing
/privacy/overflowed at 320px (scrollWidth 329) because[email protected]is one unbreakable 295px token. Fixed at the cause withoverflow-wrap: break-wordon body in BaseLayout, notoverflow-x: hidden. It had NEVER been layout-checked, because it was not invalidate.config.json. That config now covers all 28 pages including/contact/,/privacy/and/festivals/, which were live and unvalidated. A green validator only proves the pages you list.scripts/__pycache__was tracked, so every script run dirtied the tree and tripped the pre-deploy guard. Untracked and gitignored.llms-full.txt's page list is hand-maintained and had already gone stale: the five/guides/pages and/festivals/have been missing since they shipped. The 11 new pages were added; the guides and festivals gap is still open and flagged in the file.- 38 new external anchors needed
noreferrerby hand:fix_external_links.pydeliberately skips anchors that already carrytarget=, so hand-written ones get neither half automatically.
Contrast, measured not eyeballed (nothing in the toolchain checks it)
Hero plates 14.48:1. Worst hub card text 5.58:1. New homepage resident band:
gold eyebrow on plum 8.01:1, everything else 11.41:1. ⚠️ A naive DOM walk
reports the hero text as 1.06:1 because it finds the cream body behind the
photo. That is the session-10 false positive, not a real failure. Measure
the .hl plate, not the ancestor chain.
Known gaps, deliberately published as gaps
/live-here/clubs-and-groups/ is incomplete and says so: cycling rides, ski
clubs, chess, board games, quilting, jam circles, community theater, beekeeping
and community garden plots were never reached. Do not delete the "what is
missing" section when adding entries, update it. Tennis: Rocky Mountain Tennis
Center and Boulder Tennis Association both block automated requests. Several
city class prices sit behind the Amilia storefront and are marked NOT
EXTRACTABLE rather than guessed.
EXACT next step
Nothing is in flight. Annette's Google decision is still the one open item with real value attached, and the site is materially bigger and better than when that decision was first put to her: 31 pages now, and the resident section is exactly the kind of content that earns links. Still hers to approve, not mine to run.
If she wants more coverage first, the cheapest high-value work is closing the
clubs page gaps above, then adding /guides/ and /festivals/ to
gen_llms_full.py's ORDER list.
⚠️ Still true from session 18: tasteboulder.com publishes Sanitas Brewing and The Dark Horse, both closed, while this site names both as closed. Her two sites contradict each other. The 743-venue dead-listing audit has NOT been run.
Published to Annette's hub. Rebuilt from the source markdown, so edit the source and rerun rather than editing this page.