Add UC Berkeley mirror site (port 40015) - #11
Conversation
Adds a full Flask mirror of berkeley.edu as the 16th WebHarbor site. **Site features:** - 8 SQLAlchemy models: College, Department, Program, NewsArticle, Event, ResearchCenter, Faculty, Bookmark (+ User with auth) - 20+ routes: homepage, news, programs, events, research centers, departments, faculty, admissions, about, unified search - 23 Jinja2 templates styled with Berkeley Blue (#003262) / Gold (#FDB515) - 30 benchmark tasks in tasks.jsonl (WebVoyager schema) **Seed data (fully idempotent):** - 14 UC Berkeley colleges/schools (real names) - 83 degree programs (BA/BS/MA/MS/PhD/MBA/JD/MD/MEng) - 121 news articles (2023–2025, 7 categories) - 64 events (upcoming + past, 7 categories) - 25 research centers (BAIR, QB3, MSRI, …) - 82 faculty (Jennifer Doudna, Stuart Russell, Saul Perlmutter, …) - 4 benchmark users: alice/bob/carol/dave (password: test1234) **Infrastructure changes:** - control_server.py: add 'berkeley' to SITES (port 40015) - websyn_start.sh: add 'berkeley' to startup array - Dockerfile: EXPOSE 40015, generate instance_seed DB at build time (no HF assets needed — all data is code-generated via seed_data.py) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Conflicts resolved: - websyn_start.sh / control_server.py: append berkeley after phet_simulations (PR base predated aiming-lab#29). - Dockerfile EXPOSE 40000-40015 → 40000-40016. Fixes on top of PR: - sites/berkeley/seed_data.py: pin bcrypt hash for benchmark users. set_password() uses bcrypt.generate_password_hash which mixes a random salt on every call, breaking the byte-identical reset invariant. We store a pinned $2b$12$ hash for 'test1234' directly; check_password_hash still accepts it so login works unchanged. - sites/berkeley/app.py: __main__ port 40015 → 40016 (cosmetic — site_runner passes port via -c string, not via __main__).
Conflicts resolved:
- websyn_start.sh: keep PR's dynamic count (${#SITES[@]}) — removes the
hardcoded "16" from aiming-lab#11/aiming-lab#29 base; append drugs_com after berkeley.
- control_server.py: append drugs_com after berkeley.
- Dockerfile EXPOSE 40000-40016 → 40000-40017; keep berkeley build-time
RUN; pick up requests==2.32.3 dep from PR.
- .gitignore: merge both sides (keep main's dashboard ignores + PR's
local artifact ignores).
Note: drugs_com seeds via pre-built HF db (refs/pr/13), so the dynamic
bcrypt salt in app.py's set_password does NOT cycle on reset.
ReviewTested on a fresh worktree of this branch with the 15 existing sites' assets hard-linked from upstream/main (this PR ships none of its own), built as What works ✓Mechanical
Functional depth
Task quality
Blocking ✗The PR description says HuggingFace upload is intentionally skipped because berkeley has no scraped images and the seed DB is generated in-Docker. Fair design choice in principle, but the implementation has two concrete bugs: 1. Build fails on a fresh clone. RUN cd /opt/WebSyn/berkeley && \
python3 -c "from app import app" && \
cp instance/berkeley.db instance_seed/berkeley.db
I had to 2. The image isn't reproducible.
Two ways to fix:
Should-fix (non-blocking)3. Zero images. Home / news / faculty / research all use solid-color cards with Unicode glyphs. 4. 5. PR base is 6. Login <input type="text" name="email" id="email" ...>Functionally fine but skips browser-side email validation, and agents using a generic Bottom lineCode style, UX, and task design are solid. Two small fixes (commit |
|
I'm claiming PR #11 for reviewer takeover (Track B). I'll preserve @richard-peng-xia's original contribution unchanged, carry it on a separate reviewer-owned branch (merged with current main and re-slotted to the next free port), audit and fix the environment / tasks / verifiers per CONTRIBUTING's Reviewer role, and submit a linked Draft |
TL;DR
Adds a fully functional berkeley.edu mirror site to WebHarbor at port 40015, with 30 benchmark tasks covering programs, news, events, faculty, research centers, and admissions.
Motivation
UC Berkeley is the #1 public research university in the US and one of the most-visited university portals. It covers a domain — university information browsing (academics, research, campus life) — not represented in the existing 15 sites, and offers rich multi-step navigation tasks across programs, faculty, events, and news that are well-suited for web-agent benchmarks.
Design
Flask application (
sites/berkeley/app.py)Eight SQLAlchemy models:
User,College,Department,Program,NewsArticle,Event,ResearchCenter,Faculty,Bookmark. All seeded idempotently (each seed function gates on a populated DB to preserve the byte-identical reset invariant).Route coverage mirrors the real site's navigation:
Seed database
14 UC Berkeley colleges/schools (real names), 83 degree programs (BA/BS/MA/MS/PhD/MBA/JD/MD/MEng), 121 news articles (2023–2025, 7 categories), 64 events (upcoming + past, 7 categories), 25 research centers (BAIR, QB3, MSRI, …), 82 faculty (Jennifer Doudna, Stuart Russell, Saul Perlmutter, …), and 4 benchmark users (///, password: ). Seed DB generated at image build time via .
Templates
23 Jinja2 templates styled with Berkeley Blue () and California Gold (), modeled on real berkeley.edu layout: responsive nav with five top-level sections (About / Admissions / Academics / Research / Campus Life), card-grid listings, detail pages with sidebars, and paginated results (20 items/page).
Benchmark tasks (
tasks.jsonl)30 tasks (IDs through ) covering: program search by degree type, news browsing by category, event filtering by date/type, faculty research lookup, research center exploration, admissions requirements, department navigation, and 5+ multi-step reasoning tasks.
Verification
HuggingFace assets
Berkeley has no scraped image assets — all data is code-generated from . The is therefore built directly inside the Docker image via a step added to the Dockerfile, eliminating the need for a HuggingFace tarball for this site. No bump is required.
Registration
Site registered in all three required locations:
🤖 Generated with Claude Code