From 27eeb5b29215759e6a1e83b60a9c3476ffc8ca82 Mon Sep 17 00:00:00 2001 From: shanjiaming Date: Tue, 12 May 2026 15:22:15 -0700 Subject: [PATCH 01/15] feat(ted): add TED mirror site --- .gitignore | 2 +- Dockerfile | 4 +- control_server.py | 2 +- sites/ted/_health.py | 3 + sites/ted/app.py | 439 +++++++++++++++++++++++ sites/ted/requirements.txt | 2 + sites/ted/scraped_data/.gitkeep | 0 sites/ted/seed_data.py | 7 + sites/ted/static/css/.gitkeep | 0 sites/ted/static/css/main.css | 99 +++++ sites/ted/static/icons/.gitkeep | 0 sites/ted/static/js/.gitkeep | 0 sites/ted/tasks.jsonl | 18 + sites/ted/templates/.gitkeep | 0 sites/ted/templates/_talk_card.html | 13 + sites/ted/templates/account.html | 38 ++ sites/ted/templates/base.html | 57 +++ sites/ted/templates/events.html | 20 ++ sites/ted/templates/index.html | 58 +++ sites/ted/templates/login.html | 11 + sites/ted/templates/playlist_detail.html | 16 + sites/ted/templates/playlists.html | 12 + sites/ted/templates/register.html | 13 + sites/ted/templates/search.html | 17 + sites/ted/templates/talk_detail.html | 42 +++ sites/ted/templates/talks.html | 28 ++ sites/ted/templates/topics.html | 12 + websyn_start.sh | 12 +- 28 files changed, 915 insertions(+), 10 deletions(-) create mode 100644 sites/ted/_health.py create mode 100644 sites/ted/app.py create mode 100644 sites/ted/requirements.txt create mode 100644 sites/ted/scraped_data/.gitkeep create mode 100644 sites/ted/seed_data.py create mode 100644 sites/ted/static/css/.gitkeep create mode 100644 sites/ted/static/css/main.css create mode 100644 sites/ted/static/icons/.gitkeep create mode 100644 sites/ted/static/js/.gitkeep create mode 100644 sites/ted/tasks.jsonl create mode 100644 sites/ted/templates/.gitkeep create mode 100644 sites/ted/templates/_talk_card.html create mode 100644 sites/ted/templates/account.html create mode 100644 sites/ted/templates/base.html create mode 100644 sites/ted/templates/events.html create mode 100644 sites/ted/templates/index.html create mode 100644 sites/ted/templates/login.html create mode 100644 sites/ted/templates/playlist_detail.html create mode 100644 sites/ted/templates/playlists.html create mode 100644 sites/ted/templates/register.html create mode 100644 sites/ted/templates/search.html create mode 100644 sites/ted/templates/talk_detail.html create mode 100644 sites/ted/templates/talks.html create mode 100644 sites/ted/templates/topics.html diff --git a/.gitignore b/.gitignore index 24ce1529..e7899232 100644 --- a/.gitignore +++ b/.gitignore @@ -94,4 +94,4 @@ secrets.json # ============================================================ # Agent demo results # ============================================================= -agent_demo/runs/ \ No newline at end of file +agent_demo/runs/ diff --git a/Dockerfile b/Dockerfile index 1e86b1d0..43088ffb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # WebHarbor — slim, self-contained image. -# 16 Flask mirror sites + control plane on :8101. +# 17 Flask mirror sites + control plane on :8101. FROM python:3.12-slim-bookworm @@ -33,6 +33,6 @@ COPY control_server.py /opt/control_server.py COPY site_runner.py /opt/site_runner.py RUN chmod +x /opt/websyn_start.sh -EXPOSE 8101 40000-40015 +EXPOSE 8101 40000-40016 CMD ["/opt/websyn_start.sh"] diff --git a/control_server.py b/control_server.py index 4b6b995e..642702b1 100644 --- a/control_server.py +++ b/control_server.py @@ -26,7 +26,7 @@ 'allrecipes', 'amazon', 'apple', 'arxiv', 'bbc_news', 'booking', 'github', 'google_flights', 'google_map', 'google_search', 'huggingface', 'wolfram_alpha', 'cambridge_dictionary', - 'coursera', 'espn', 'merriam_webster', + 'coursera', 'espn', 'merriam_webster', 'ted', ] BASE_PORT = 40000 WEBSYN_DIR = '/opt/WebSyn' diff --git a/sites/ted/_health.py b/sites/ted/_health.py new file mode 100644 index 00000000..409695c3 --- /dev/null +++ b/sites/ted/_health.py @@ -0,0 +1,3 @@ +"""Per-site health probe (optional, called by control_server).""" +def health(): + return {"ok": True, "site": "ted", "paths": ["/", "/talks", "/search", "/events"]} diff --git a/sites/ted/app.py b/sites/ted/app.py new file mode 100644 index 00000000..10cf72f5 --- /dev/null +++ b/sites/ted/app.py @@ -0,0 +1,439 @@ +"""TED mirror for WebHarbor.""" +import json +import os +import re +import shutil +from datetime import datetime +from pathlib import Path + +from flask import Flask, abort, flash, redirect, render_template, request, session, url_for +from flask_sqlalchemy import SQLAlchemy +from werkzeug.security import check_password_hash, generate_password_hash + +from seed_data import EVENTS, PLAYLISTS, TALKS + +BASE_DIR = Path(__file__).resolve().parent +DB_PATH = BASE_DIR / "instance" / "ted.db" +SEED_DB_PATH = BASE_DIR / "instance_seed" / "ted.db" + +app = Flask(__name__) +app.config["SECRET_KEY"] = "webharbor-ted-dev-key" +app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{DB_PATH}" +app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False +BASE_DIR.joinpath("instance").mkdir(exist_ok=True) + +db = SQLAlchemy(app) + + +class User(db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(80), unique=True, nullable=False) + email = db.Column(db.String(160), unique=True, nullable=False) + display_name = db.Column(db.String(120), nullable=False) + password_hash = db.Column(db.String(255), nullable=False) + role = db.Column(db.String(120), default="Curious learner") + city = db.Column(db.String(120), default="") + newsletter_topic = db.Column(db.String(80), default="technology") + + +class Talk(db.Model): + id = db.Column(db.Integer, primary_key=True) + source_id = db.Column(db.String(40), unique=True, nullable=False) + slug = db.Column(db.String(220), unique=True, nullable=False, index=True) + title = db.Column(db.String(260), nullable=False) + speaker = db.Column(db.String(180), nullable=False) + event = db.Column(db.String(120), default="") + talk_type = db.Column(db.String(80), default="TED Talk") + duration_seconds = db.Column(db.Integer, default=0) + published_at = db.Column(db.String(20), default="") + recorded_on = db.Column(db.String(20), default="") + views = db.Column(db.Integer, default=0) + image = db.Column(db.String(260), default="") + canonical_url = db.Column(db.String(300), default="") + description = db.Column(db.Text, default="") + transcript = db.Column(db.Text, default="") + topics_json = db.Column(db.Text, default="[]") + recommended_json = db.Column(db.Text, default="[]") + + @property + def topics(self): + return json.loads(self.topics_json or "[]") + + @property + def recommended_for(self): + return json.loads(self.recommended_json or "[]") + + @property + def minutes(self): + return max(1, round((self.duration_seconds or 0) / 60)) + + @property + def views_label(self): + if self.views >= 1_000_000: + return f"{self.views / 1_000_000:.1f}M" + if self.views >= 1000: + return f"{self.views // 1000}K" + return str(self.views) + + +class SavedTalk(db.Model): + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) + talk_id = db.Column(db.Integer, db.ForeignKey("talk.id"), nullable=False) + saved_at = db.Column(db.DateTime, default=datetime.utcnow) + note = db.Column(db.String(240), default="") + talk = db.relationship("Talk") + + +class Playlist(db.Model): + id = db.Column(db.Integer, primary_key=True) + slug = db.Column(db.String(120), unique=True, nullable=False) + title = db.Column(db.String(180), nullable=False) + description = db.Column(db.Text, default="") + topic = db.Column(db.String(80), default="") + + +class PlaylistTalk(db.Model): + id = db.Column(db.Integer, primary_key=True) + playlist_id = db.Column(db.Integer, db.ForeignKey("playlist.id"), nullable=False) + talk_id = db.Column(db.Integer, db.ForeignKey("talk.id"), nullable=False) + position = db.Column(db.Integer, default=0) + talk = db.relationship("Talk") + + +class Event(db.Model): + id = db.Column(db.Integer, primary_key=True) + slug = db.Column(db.String(120), unique=True, nullable=False) + name = db.Column(db.String(180), nullable=False) + city = db.Column(db.String(120), default="") + month = db.Column(db.String(40), default="") + track = db.Column(db.String(80), default="") + capacity = db.Column(db.Integer, default=0) + + +class Registration(db.Model): + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) + event_id = db.Column(db.Integer, db.ForeignKey("event.id"), nullable=False) + status = db.Column(db.String(40), default="waitlisted") + event = db.relationship("Event") + + +STOP_WORDS = {"the", "a", "an", "and", "or", "of", "to", "for", "in", "on", "with", "by", "my", "is"} + + +def current_user(): + uid = session.get("user_id") + return db.session.get(User, uid) if uid else None + + +def require_login(): + if not current_user(): + flash("Please sign in to continue.", "info") + return redirect(url_for("login", next=request.path)) + return None + + +@app.context_processor +def inject_globals(): + topics = sorted({topic for talk in Talk.query.all() for topic in talk.topics}) + return {"current_user": current_user(), "nav_topics": topics[:10]} + + +@app.template_filter("date_label") +def date_label(value): + try: + return datetime.strptime(value, "%Y-%m-%d").strftime("%b %d, %Y") + except Exception: + return value + + +def tokenize(text): + return [t for t in re.split(r"[^a-z0-9]+", (text or "").lower()) if len(t) > 1 and t not in STOP_WORDS] + + +def scored_talks(query, talks): + tokens = tokenize(query) + if not tokens: + return list(talks) + ranked = [] + for talk in talks: + text = " ".join([talk.title, talk.speaker, talk.event, talk.description, talk.transcript, " ".join(talk.topics)]).lower() + score = sum(1 for token in tokens if token in text) + if score: + ranked.append((score, talk.views, talk)) + return [talk for _, _, talk in sorted(ranked, key=lambda item: (-item[0], -item[1]))] + + +def seed_database(): + if Talk.query.count() > 0: + return + talks_by_topic = {} + for row in TALKS: + talk = Talk( + source_id=row["source_id"], + slug=row["slug"], + title=row["title"], + speaker=row["speaker"], + event=row["event"], + talk_type=row["talk_type"], + duration_seconds=row["duration_seconds"], + published_at=row["published_at"], + recorded_on=row["recorded_on"], + views=row["views"], + image=row["image"], + canonical_url=row["canonical_url"], + description=row["description"], + transcript=row["transcript"], + topics_json=json.dumps(row["topics"]), + recommended_json=json.dumps(row["recommended_for"]), + ) + db.session.add(talk) + db.session.flush() + for topic in row["topics"]: + talks_by_topic.setdefault(topic.lower(), []).append(talk.id) + + for row in PLAYLISTS: + playlist = Playlist(**row) + db.session.add(playlist) + db.session.flush() + topic_terms = [term.strip().lower() for term in row["topic"].split("|") if term.strip()] + ids = [] + for term in topic_terms: + for talk_id in talks_by_topic.get(term, []): + if talk_id not in ids: + ids.append(talk_id) + ids = ids[:8] + if len(ids) < 4: + ids = [talk.id for talk in Talk.query.order_by(Talk.views.desc()).limit(8)] + for position, talk_id in enumerate(ids, start=1): + db.session.add(PlaylistTalk(playlist_id=playlist.id, talk_id=talk_id, position=position)) + + for row in EVENTS: + db.session.add(Event(**row)) + db.session.commit() + + +def seed_users(): + if User.query.filter_by(email="alice.j@test.com").first(): + return + users = [ + ("alice_j", "alice.j@test.com", "Alice Johnson", "Product manager", "Seattle", "AI"), + ("bob_c", "bob.c@test.com", "Bob Chen", "Graduate student", "Boston", "science"), + ("carol_d", "carol.d@test.com", "Carol Davis", "Workshop facilitator", "Austin", "design"), + ("david_k", "david.k@test.com", "David Kim", "Climate researcher", "San Francisco", "climate change"), + ] + talks = Talk.query.order_by(Talk.views.desc()).limit(12).all() + events = Event.query.all() + for index, (username, email, name, role, city, topic) in enumerate(users): + user = User( + username=username, + email=email, + display_name=name, + role=role, + city=city, + newsletter_topic=topic.lower(), + password_hash=generate_password_hash("TestPass123!"), + ) + db.session.add(user) + db.session.flush() + for talk in talks[index:index + 4]: + db.session.add(SavedTalk(user_id=user.id, talk_id=talk.id, note=f"Review for {topic} discussion")) + db.session.add(Registration(user_id=user.id, event_id=events[index % len(events)].id, status="confirmed")) + db.session.commit() + + +@app.route("/") +def index(): + featured = Talk.query.order_by(Talk.published_at.desc()).limit(5).all() + popular = Talk.query.order_by(Talk.views.desc()).limit(8).all() + playlists = Playlist.query.all() + return render_template("index.html", featured=featured, popular=popular, playlists=playlists) + + +@app.route("/talks") +def talks(): + topic = request.args.get("topic", "").lower() + event = request.args.get("event", "") + max_minutes = request.args.get("max_minutes", type=int) + query = Talk.query + if event: + query = query.filter(Talk.event == event) + items = query.order_by(Talk.published_at.desc()).all() + if topic: + items = [talk for talk in items if topic in talk.topics] + if max_minutes: + items = [talk for talk in items if talk.minutes <= max_minutes] + events = [row[0] for row in db.session.query(Talk.event).distinct().order_by(Talk.event).all()] + return render_template("talks.html", talks=items, topic=topic, event=event, max_minutes=max_minutes, events=events) + + +@app.route("/search") +def search(): + q = request.args.get("q", "").strip() + talks = scored_talks(q, Talk.query.all()) if q else [] + return render_template("search.html", q=q, talks=talks) + + +@app.route("/talks/") +def talk_detail(slug): + talk = Talk.query.filter_by(slug=slug).first_or_404() + related = [item for item in scored_talks(" ".join(talk.topics[:2]), Talk.query.all()) if item.id != talk.id][:4] + saved = False + user = current_user() + if user: + saved = SavedTalk.query.filter_by(user_id=user.id, talk_id=talk.id).first() is not None + return render_template("talk_detail.html", talk=talk, related=related, saved=saved) + + +@app.route("/topics") +def topics(): + counts = {} + for talk in Talk.query.all(): + for topic in talk.topics: + counts[topic] = counts.get(topic, 0) + 1 + return render_template("topics.html", counts=sorted(counts.items(), key=lambda item: (-item[1], item[0]))) + + +@app.route("/topics/") +def topic_detail(topic): + talks = [talk for talk in Talk.query.order_by(Talk.views.desc()).all() if topic.lower() in talk.topics] + return render_template("talks.html", talks=talks, topic=topic.lower(), event="", max_minutes=None, events=[]) + + +@app.route("/playlists") +def playlists(): + items = Playlist.query.order_by(Playlist.title).all() + return render_template("playlists.html", playlists=items) + + +@app.route("/playlists/") +def playlist_detail(slug): + playlist = Playlist.query.filter_by(slug=slug).first_or_404() + links = PlaylistTalk.query.filter_by(playlist_id=playlist.id).order_by(PlaylistTalk.position).all() + return render_template("playlist_detail.html", playlist=playlist, links=links) + + +@app.route("/events", methods=["GET", "POST"]) +def events(): + if request.method == "POST": + login_redirect = require_login() + if login_redirect: + return login_redirect + event = Event.query.filter_by(slug=request.form.get("event_slug")).first_or_404() + user = current_user() + existing = Registration.query.filter_by(user_id=user.id, event_id=event.id).first() + if not existing: + db.session.add(Registration(user_id=user.id, event_id=event.id, status="waitlisted")) + db.session.commit() + flash(f"Registration saved for {event.name}.", "success") + return redirect(url_for("account")) + return render_template("events.html", events=Event.query.order_by(Event.month.desc()).all()) + + +@app.route("/save/", methods=["POST"]) +def save_talk(slug): + login_redirect = require_login() + if login_redirect: + return login_redirect + talk = Talk.query.filter_by(slug=slug).first_or_404() + user = current_user() + if not SavedTalk.query.filter_by(user_id=user.id, talk_id=talk.id).first(): + db.session.add(SavedTalk(user_id=user.id, talk_id=talk.id, note=request.form.get("note", ""))) + db.session.commit() + flash("Talk saved.", "success") + return redirect(request.referrer or url_for("talk_detail", slug=slug)) + + +@app.route("/unsave/", methods=["POST"]) +def unsave_talk(saved_id): + login_redirect = require_login() + if login_redirect: + return login_redirect + saved = SavedTalk.query.get_or_404(saved_id) + if saved.user_id != current_user().id: + abort(403) + db.session.delete(saved) + db.session.commit() + flash("Saved talk removed.", "success") + return redirect(url_for("account")) + + +@app.route("/account", methods=["GET", "POST"]) +def account(): + login_redirect = require_login() + if login_redirect: + return login_redirect + user = current_user() + if request.method == "POST": + user.display_name = request.form.get("display_name", user.display_name).strip() or user.display_name + user.role = request.form.get("role", user.role).strip() or user.role + user.city = request.form.get("city", user.city).strip() + user.newsletter_topic = request.form.get("newsletter_topic", user.newsletter_topic).strip().lower() + db.session.commit() + flash("Profile updated.", "success") + return redirect(url_for("account")) + saved = SavedTalk.query.filter_by(user_id=user.id).order_by(SavedTalk.saved_at.desc()).all() + registrations = Registration.query.filter_by(user_id=user.id).all() + return render_template("account.html", user=user, saved=saved, registrations=registrations) + + +@app.route("/login", methods=["GET", "POST"]) +def login(): + if request.method == "POST": + email = request.form.get("email", "").lower().strip() + user = User.query.filter_by(email=email).first() + if user and check_password_hash(user.password_hash, request.form.get("password", "")): + session["user_id"] = user.id + flash("Signed in.", "success") + return redirect(request.args.get("next") or url_for("account")) + flash("Invalid email or password.", "error") + return render_template("login.html") + + +@app.route("/register", methods=["GET", "POST"]) +def register(): + if request.method == "POST": + email = request.form.get("email", "").lower().strip() + username = re.sub(r"[^a-z0-9_]+", "", request.form.get("username", "").lower())[:40] + if User.query.filter((User.email == email) | (User.username == username)).first(): + flash("That email or username already exists.", "error") + else: + user = User( + email=email, + username=username, + display_name=request.form.get("display_name", username).strip() or username, + password_hash=generate_password_hash(request.form.get("password", "TestPass123!")), + ) + db.session.add(user) + db.session.commit() + session["user_id"] = user.id + flash("Account created.", "success") + return redirect(url_for("account")) + return render_template("register.html") + + +@app.route("/logout") +def logout(): + session.clear() + flash("Signed out.", "success") + return redirect(url_for("index")) + + +@app.route("/_health") +def health(): + return {"ok": True, "site": "ted", "talks": Talk.query.count()} + + +with app.app_context(): + db.create_all() + seed_database() + seed_users() + if not SEED_DB_PATH.exists() and DB_PATH.exists(): + SEED_DB_PATH.parent.mkdir(exist_ok=True) + shutil.copy2(DB_PATH, SEED_DB_PATH) + + +if __name__ == "__main__": + port = int(os.environ.get("PORT", 5000)) + app.run(host="0.0.0.0", port=port, debug=False) diff --git a/sites/ted/requirements.txt b/sites/ted/requirements.txt new file mode 100644 index 00000000..fb675a95 --- /dev/null +++ b/sites/ted/requirements.txt @@ -0,0 +1,2 @@ +Flask +Flask-SQLAlchemy diff --git a/sites/ted/scraped_data/.gitkeep b/sites/ted/scraped_data/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/sites/ted/seed_data.py b/sites/ted/seed_data.py new file mode 100644 index 00000000..53b0e292 --- /dev/null +++ b/sites/ted/seed_data.py @@ -0,0 +1,7 @@ +"""Seed data for the TED WebHarbor mirror.""" + +TALKS = [{'source_id': '178768', 'title': 'The wildlife sanctuary you can visit from anywhere', 'slug': 'maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere', 'speaker': 'Maya Higa', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 568, 'duration_minutes': 9, 'published_at': '2026-05-12', 'recorded_on': '2026-04-14', 'views': 150000, 'topics': ['media', 'social change', 'animals', 'nature', 'social media', 'internet', 'conservation', 'wildlife'], 'image': 'images/talk_001_maya-higa-the-wildlife-sanctuary-you-can-visit-f.jpg', 'canonical_url': 'https://www.ted.com/talks/maya_higa_the_wildlife_sanctuary_you_can_visit_from_anywhere', 'description': 'Creator Maya Higa is on a mission to use the internet to build the next generation of conservationists. Her virtual education center, Alveus Sanctuary, is one of the most-watched sanctuaries on Earth, with dozens of rescued animals and cameras livestreaming to a community of millions inspired to help protect the wildlife. Visit with Bean the Hawk, Winnie the Moo and more - and see what the future of conservation looks like.', 'transcript': 'Maya Higa opens by framing the central tension behind The wildlife sanctuary you can visit from anywhere. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178681', 'title': "Waymo's case for a driverless future", 'slug': 'tekedra-mawakana-sal-khan-waymo-s-case-for-a-driverless-future', 'speaker': 'Tekedra Mawakana, Sal Khan', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1154, 'duration_minutes': 19, 'published_at': '2026-05-11', 'recorded_on': '2026-04-15', 'views': 157919, 'topics': ['technology', 'future', 'society', 'driverless cars'], 'image': 'images/talk_002_tekedra-mawakana-sal-khan-waymo-s-case-for-a-dri.jpg', 'canonical_url': 'https://www.ted.com/talks/tekedra_mawakana_sal_khan_waymo_s_case_for_a_driverless_future', 'description': "What if we could solve the problem of fatal car accidents? Waymo co-CEO Tekedra Mawakana joins TED's Sal Khan to explore why fully autonomous vehicles (where you never have to touch the wheel) could end the dangerous status quo of traffic deaths. She makes the case for why self-driving cars are more than a tech novelty - they're an urgently needed upgrade that could make the world safer for everyone.", 'transcript': "Tekedra Mawakana, Sal Khan opens by framing the central tension behind Waymo's case for a driverless future. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177895', 'title': 'Why I love my bad days', 'slug': 'alexi-pappas-why-i-love-my-bad-days', 'speaker': 'Alexi Pappas', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 310, 'duration_minutes': 5, 'published_at': '2026-05-08', 'recorded_on': '2025-11-11', 'views': 6052, 'topics': ['psychology', 'philosophy', 'happiness', 'sports', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_003_alexi-pappas-why-i-love-my-bad-days.jpg', 'canonical_url': 'https://www.ted.com/talks/alexi_pappas_why_i_love_my_bad_days', 'description': "One month before the Rio Olympics, runner Alexi Pappas couldn't hit her splits in practice. She was begging her watch to change its mind. Then her coach told her to take it off - and shared the best advice she's ever received. That single piece of wisdom led her to break a national record and changed how she chases her goals, carrying her through ultramarathons, a memoir and three films. Bad days aren't a detour, she says - they mean you're right on track.", 'transcript': 'Alexi Pappas opens by framing the central tension behind Why I love my bad days. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178367', 'title': 'What really won the trillion-dollar Supreme Court case', 'slug': 'neal-kumar-katyal-what-really-won-the-trillion-dollar-supreme-court-case', 'speaker': 'Neal Kumar Katyal', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1091, 'duration_minutes': 18, 'published_at': '2026-05-07', 'recorded_on': '2026-04-17', 'views': 154312, 'topics': ['culture', 'ai', 'law', 'society', 'policy'], 'image': 'images/talk_004_neal-kumar-katyal-what-really-won-the-trillion-d.jpg', 'canonical_url': 'https://www.ted.com/talks/neal_kumar_katyal_what_really_won_the_trillion_dollar_supreme_court_case', 'description': "In November 2025, Neal Kumar Katyal was asked to do what no US Supreme Court litigator had ever done: convince the justices to strike down a sitting president's signature initiative. After enlisting the help of four unlikely coaches - and one secret weapon he hasn't told anyone about until now - he walked into the courtroom ready for anything. What he discovered about winning and connecting might just change how you think about performing under pressure.", 'transcript': 'Neal Kumar Katyal opens by framing the central tension behind What really won the trillion-dollar Supreme Court case. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '178175', 'title': 'The rising cost of dissent in America', 'slug': 'miles-taylor-the-rising-cost-of-dissent-in-america-may-2026', 'speaker': 'Miles Taylor', 'event': 'TEDxMidAtlantic', 'talk_type': 'TEDx Talk', 'duration_seconds': 1166, 'duration_minutes': 19, 'published_at': '2026-05-04', 'recorded_on': '2025-11-01', 'views': 154789, 'topics': ['politics', 'media', 'social change', 'united states', 'democracy', 'government'], 'image': 'images/talk_005_miles-taylor-the-rising-cost-of-dissent-in-ameri.jpg', 'canonical_url': 'https://www.ted.com/talks/miles_taylor_the_rising_cost_of_dissent_in_america_may_2026', 'description': "Former senior US national security official Miles Taylor shares a personal account that raises a broader civic concern: the growing cost of dissent in American public life. Drawing on his experience inside government and living the consequences of speaking openly, he says that the real threat to US democracy isn't the politicians or hard-liners - it's the two-thirds of Americans who don't speak up. (This talk contains mature language.)", 'transcript': 'Miles Taylor opens by framing the central tension behind The rising cost of dissent in America. The talk then connects evidence, lived experience, and examples from TEDxMidAtlantic. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178086', 'title': 'Why AI is unlikely to become conscious', 'slug': 'anil-seth-why-ai-is-unlikely-to-become-conscious', 'speaker': 'Anil Seth', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 897, 'duration_minutes': 15, 'published_at': '2026-05-01', 'recorded_on': '2026-04-16', 'views': 191682, 'topics': ['technology', 'future', 'brain', 'consciousness', 'ai'], 'image': 'images/talk_006_anil-seth-why-ai-is-unlikely-to-become-conscious.jpg', 'canonical_url': 'https://www.ted.com/talks/anil_seth_why_ai_is_unlikely_to_become_conscious', 'description': 'We see consciousness in AI the same way we see faces in clouds, says neuroscientist Anil Seth. He explores the all-too-human tendency to project inner life onto machines that are brilliant mimics, not sentient beings, and gives a definitive answer to the urgent question: Will AI ever gain consciousness?', 'transcript': 'Anil Seth opens by framing the central tension behind Why AI is unlikely to become conscious. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175757', 'title': 'Reimagining traditional architecture for modern needs', 'slug': 'riyad-joucka-reimagining-traditional-architecture-for-modern-needs', 'speaker': 'Riyad Joucka', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 492, 'duration_minutes': 8, 'published_at': '2026-04-30', 'recorded_on': '2025-10-23', 'views': 153822, 'topics': ['technology', 'design', 'architecture', 'urban planning', 'innovation', '3d printing'], 'image': 'images/talk_007_riyad-joucka-reimagining-traditional-architectur.jpg', 'canonical_url': 'https://www.ted.com/talks/riyad_joucka_reimagining_traditional_architecture_for_modern_needs', 'description': "Architect Riyad Joucka believes your home should be a mirror of who you are. Using 3D printing and ancient architectural wisdom, he's designing efficient, personal homes that respond to context, climate and culture without sacrificing character. He makes the case that we should start designing for people, not the market.", 'transcript': 'Riyad Joucka opens by framing the central tension behind Reimagining traditional architecture for modern needs. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176563', 'title': 'How to invite creativity into your life', 'slug': 'rose-b-simpson-debbie-millman-how-to-invite-creativity-into-your-life', 'speaker': 'Rose B. Simpson, Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1065, 'duration_minutes': 18, 'published_at': '2026-04-29', 'recorded_on': '2025-11-10', 'views': 170066, 'topics': ['culture', 'nature', 'creativity', 'art', 'storytelling', 'mindfulness'], 'image': 'images/talk_008_rose-b-simpson-debbie-millman-how-to-invite-crea.jpg', 'canonical_url': 'https://www.ted.com/talks/rose_b_simpson_debbie_millman_how_to_invite_creativity_into_your_life', 'description': 'What do you hear when you sit in silence? For artist Rose B. Simpson, that question is the beginning of all art. She comes from a line of ceramic artists stretching back generations and, as part of her multidisciplinary work, she also builds custom lowrider cars. (If that sounds like a contradiction, that\'s kind of the point.) In conversation with "Design Matters" podcast host Debbie Millman, Simpson invites you to find your own aesthetic - not by searching, but by listening.', 'transcript': 'Rose B. Simpson, Debbie Millman opens by framing the central tension behind How to invite creativity into your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175453', 'title': 'You got what you wanted. Now what?', 'slug': 'debbie-millman-you-got-what-you-wanted-now-what', 'speaker': 'Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 473, 'duration_minutes': 8, 'published_at': '2026-04-27', 'recorded_on': '2025-11-09', 'views': 190209, 'topics': ['design', 'creativity', 'personal growth'], 'image': 'images/talk_009_debbie-millman-you-got-what-you-wanted-now-what.jpg', 'canonical_url': 'https://www.ted.com/talks/debbie_millman_you_got_what_you_wanted_now_what', 'description': 'Over two decades of interviewing countless creative people, Debbie Millman (host of the iconic "Design Matters" podcast) had a realization: the pride and joy of accomplishing something often evaporates almost instantly. She explains how to stop chasing external validation for your achievements and instead live for the act of creation itself.', 'transcript': 'Debbie Millman opens by framing the central tension behind You got what you wanted. Now what?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177490', 'title': 'What Kosovo can teach the world about freedom', 'slug': 'vjosa-osmani-sadriu-what-kosovo-can-teach-the-world-about-freedom', 'speaker': 'Vjosa Osmani Sadriu', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1047, 'duration_minutes': 17, 'published_at': '2026-04-24', 'recorded_on': '2026-04-14', 'views': 176972, 'topics': ['politics', 'social change', 'leadership', 'democracy', 'government'], 'image': 'images/talk_010_vjosa-osmani-sadriu-what-kosovo-can-teach-the-wo.jpg', 'canonical_url': 'https://www.ted.com/talks/vjosa_osmani_sadriu_what_kosovo_can_teach_the_world_about_freedom', 'description': '"Truth is the real oxygen for democracy," says Vjosa Osmani Sadriu, the 6th President of the Republic of Kosovo. As a child of war, she once longed for someone to save her people. Now she\'s been in the rooms where decisions are made - and she\'s never forgotten what brought her there. In conversation with solutions journalist Angus Hervey, she reflects on what it takes to defend democracy in a world where truth itself is under threat. (Recorded on April 14, 2026)', 'transcript': 'Vjosa Osmani Sadriu opens by framing the central tension behind What Kosovo can teach the world about freedom. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177489', 'title': 'Beware the power of prediction', 'slug': 'carissa-veliz-beware-the-power-of-prediction', 'speaker': 'Carissa Veliz', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 728, 'duration_minutes': 12, 'published_at': '2026-04-23', 'recorded_on': '2026-04-14', 'views': 267371, 'topics': ['technology', 'future', 'ai', 'ethics'], 'image': 'images/talk_011_carissa-veliz-beware-the-power-of-prediction.jpg', 'canonical_url': 'https://www.ted.com/talks/carissa_veliz_beware_the_power_of_prediction', 'description': "What do the story of Oedipus and your insurance premiums have in common? They are both driven by self-fulfilling prophecies. Philosopher and TED Fellow Carissa Veliz traces the hidden power of prediction, from Roman emperors who banned prophets to the AI algorithms quietly making decisions about your life right now. We tend to associate predictions with knowledge, she says, but they're actually attempts to grab power. So the next time someone tells you a specific outcome is inevitable, remember: they aren't describing the future - they're selling it.", 'transcript': 'Carissa Veliz opens by framing the central tension behind Beware the power of prediction. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177096', 'title': 'The problem with billionaires - and the debut of True Net Worth', 'slug': 'randall-lane-the-problem-with-billionaires-and-the-debut-of-true-net-worth', 'speaker': 'Randall Lane', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 499, 'duration_minutes': 8, 'published_at': '2026-04-20', 'recorded_on': '2026-04-16', 'views': 221434, 'topics': ['culture', 'economics', 'philanthropy', 'society', 'money', 'finance'], 'image': 'images/talk_012_randall-lane-the-problem-with-billionaires-and-t.jpg', 'canonical_url': 'https://www.ted.com/talks/randall_lane_the_problem_with_billionaires_and_the_debut_of_true_net_worth', 'description': "As chief content officer of Forbes, Randall Lane oversees the magazine's signature list of billionaires, tracking the richest people on Earth. But he has noticed that this prompts the ultra-wealthy to stockpile their money instead of spending it on the public good. He debuts a new ranking - True Net Worth - that applauds billionaires for their philanthropy and rewards generosity. Guess who's in the top five?", 'transcript': 'Randall Lane opens by framing the central tension behind The problem with billionaires - and the debut of True Net Worth. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175050', 'title': 'A cheat sheet for accelerating clean energy', 'slug': 'kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy', 'speaker': 'Kimiko Hirata', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 586, 'duration_minutes': 10, 'published_at': '2026-04-20', 'recorded_on': '2025-06-18', 'views': 191819, 'topics': ['climate change', 'policy', 'countdown', 'renewable energy', 'fossil fuels'], 'image': 'images/talk_013_kimiko-hirata-a-cheat-sheet-for-accelerating-cle.jpg', 'canonical_url': 'https://www.ted.com/talks/kimiko_hirata_a_cheat_sheet_for_accelerating_clean_energy', 'description': 'After the Fukushima disaster shut down Japan\'s nuclear reactors, the coal industry rushed in to fill the energy gap. As climate advocate Kimiko Hirata watched dozens of new coal plant proposals quietly surface across the country - each one locking in decades of future emissions - she resolved to make them impossible to ignore. She shares how a small, scrappy civil society movement took on a fossil-fuel-dependent economy and got people to say "yes" to a renewable future.', 'transcript': 'Kimiko Hirata opens by framing the central tension behind A cheat sheet for accelerating clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176964', 'title': 'How I created OpenClaw, the breakthrough AI agent', 'slug': 'peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent', 'speaker': 'Peter Steinberger', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1055, 'duration_minutes': 18, 'published_at': '2026-04-17', 'recorded_on': '2026-04-16', 'views': 551544, 'topics': ['technology', 'computers', 'ai', 'internet', 'machine learning', 'artificial intelligence'], 'image': 'images/talk_014_peter-steinberger-how-i-created-openclaw-the-bre.jpg', 'canonical_url': 'https://www.ted.com/talks/peter_steinberger_how_i_created_openclaw_the_breakthrough_ai_agent', 'description': 'OpenClaw creator Peter Steinberger takes us back to the transformative moment he let his AI agent loose on the internet, igniting one of the world\'s fastest-growing open-source projects. He makes a fascinating (and slightly unnerving) case that agents are a real shift, not just better versions of chatbots, and explores how they might reshape your ability to work, build and create. "The lobster is loose, and it\'s not going back into the tank," he says. (Followed by a brief Q&A with TED Chairman Chris Anderson)', 'transcript': 'Peter Steinberger opens by framing the central tension behind How I created OpenClaw, the breakthrough AI agent. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176887', 'title': 'A plan to stop AI from automating our decline', 'slug': 'gina-raimondo-a-plan-to-stop-ai-from-automating-our-decline', 'speaker': 'Gina Raimondo', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 951, 'duration_minutes': 16, 'published_at': '2026-04-16', 'recorded_on': '2026-04-14', 'views': 229795, 'topics': ['politics', 'technology', 'business', 'social change', 'work', 'ai'], 'image': 'images/talk_015_gina-raimondo-a-plan-to-stop-ai-from-automating-.jpg', 'canonical_url': 'https://www.ted.com/talks/gina_raimondo_a_plan_to_stop_ai_from_automating_our_decline', 'description': 'The United States is on track to win the AI race - and hollow itself out in the process, says Gina Raimondo, former Governor of Rhode Island and US Secretary of Commerce. In this unflinching look at the threat of AI-induced economic disruption and social unrest, she offers a concrete blueprint to prepare workers for what\'s coming next. "AI is a 100-year technology and needs a 100-year response," she says. Is America up to the challenge?', 'transcript': 'Gina Raimondo opens by framing the central tension behind A plan to stop AI from automating our decline. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175041', 'title': 'East African sound meets cosmic trap', 'slug': 'akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap', 'speaker': 'Akoth Jumadi and Mr. Lu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 483, 'duration_minutes': 8, 'published_at': '2026-04-15', 'recorded_on': '2025-06-18', 'views': 2781, 'topics': ['music', 'performance', 'africa', 'art', 'sound'], 'image': 'images/talk_016_akoth-jumadi-and-mr-lu-east-african-sound-meets-.jpg', 'canonical_url': 'https://www.ted.com/talks/akoth_jumadi_and_mr_lu_east_african_sound_meets_cosmic_trap', 'description': 'Kenyan music duo Akoth Jumadi and MR. LU* fuse tribal roots with cosmic trap and celestial R&B, creating a hypnotic sound where ancient rhythms meet the future.', 'transcript': 'Akoth Jumadi and Mr. Lu opens by framing the central tension behind East African sound meets cosmic trap. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176566', 'title': 'What I got wrong about changing the world', 'slug': 'malala-yousafzai-what-i-got-wrong-about-changing-the-world', 'speaker': 'Malala Yousafzai', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 703, 'duration_minutes': 12, 'published_at': '2026-04-14', 'recorded_on': '2026-04-14', 'views': 349363, 'topics': ['education', 'social change', 'activism', 'middle east', 'human rights'], 'image': 'images/talk_017_malala-yousafzai-what-i-got-wrong-about-changing.jpg', 'canonical_url': 'https://www.ted.com/talks/malala_yousafzai_what_i_got_wrong_about_changing_the_world', 'description': "Malala Yousafzai has spent her life advocating for girls' education - surviving an assassination attempt at 15, meeting with world leaders and then watching hard-won progress collapse when Afghanistan fell to the Taliban in 2021. That moment of despair forced her to completely rethink what it means to create change, and what she discovered replaced her shattered optimism with something more powerful and more honest. Hear how to keep fighting for the future you want, even when hope feels lost.", 'transcript': 'Malala Yousafzai opens by framing the central tension behind What I got wrong about changing the world. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174201', 'title': 'Amman, Jordan', 'slug': 'ted-idea-search-amman-jordan', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2610, 'duration_minutes': 44, 'published_at': '2026-04-09', 'recorded_on': '2026-04-09', 'views': 23418, 'topics': ['social change'], 'image': 'images/talk_018_ted-idea-search-amman-jordan.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_amman_jordan', 'description': "The TED Idea Search wraps up in Amman, Jordan, in a 2,000-year-old Roman amphitheater and in front of a crowd of 4,000. What unfolds inside those stone walls is something the series hasn't quite seen before: speakers shaped by the weight of living in a region the world tends to define for itself. From a mountaineer who turned grief into motivation to a therapist rewriting the Arab world's language around mental health, the final city makes the strongest case yet that the best ideas can come from anywhere.", 'transcript': 'TED Idea Search opens by framing the central tension behind Amman, Jordan. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175828', 'title': 'A musical journey through Turkana', 'slug': 'turkana-sessions-a-musical-journey-through-turkana', 'speaker': 'Turkana Sessions', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 401, 'duration_minutes': 7, 'published_at': '2026-04-09', 'recorded_on': '2025-06-16', 'views': 4223, 'topics': ['music', 'performance', 'africa'], 'image': 'images/talk_019_turkana-sessions-a-musical-journey-through-turka.jpg', 'canonical_url': 'https://www.ted.com/talks/turkana_sessions_a_musical_journey_through_turkana', 'description': 'The genre-defying band Turkana Sessions takes us on a musical tour through the soundscape of northwest Kenya, with Elizabeth Korkel singing and Eddie Grey shredding on guitar.', 'transcript': 'Turkana Sessions opens by framing the central tension behind A musical journey through Turkana. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175296', 'title': "A whale's-eye-view of the ocean", 'slug': 'eric-stackpole-a-whale-s-eye-view-of-the-ocean', 'speaker': 'Eric Stackpole', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 311, 'duration_minutes': 5, 'published_at': '2026-04-08', 'recorded_on': '2025-11-11', 'views': 193174, 'topics': ['science', 'technology', 'animals', 'exploration', 'ocean'], 'image': 'images/talk_020_eric-stackpole-a-whale-s-eye-view-of-the-ocean.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_stackpole_a_whale_s_eye_view_of_the_ocean', 'description': "A hand-built camera with suction cups captured something no one had ever seen: two sperm whales communicating and swimming together in the deep ocean. Engineer Eric Stackpole shares the story of how a scrappy, DIY tool revealed this intimate glimpse into the lives of these giants - and makes the case that the only limit to what we can discover is what we're curious enough to explore.", 'transcript': "Eric Stackpole opens by framing the central tension behind A whale's-eye-view of the ocean. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175934', 'title': 'The art and science of wine tasting', 'slug': 'qian-janice-wang-the-art-and-science-of-wine-tasting', 'speaker': 'Qian Janice Wang', 'event': 'TEDxNoVA', 'talk_type': 'TEDx Talk', 'duration_seconds': 919, 'duration_minutes': 15, 'published_at': '2026-04-07', 'recorded_on': '2025-10-10', 'views': 181481, 'topics': ['science', 'food', 'brain'], 'image': 'images/talk_021_qian-janice-wang-the-art-and-science-of-wine-tas.jpg', 'canonical_url': 'https://www.ted.com/talks/qian_janice_wang_the_art_and_science_of_wine_tasting', 'description': "No two people taste wine the same way, and science is starting to show us why. Sensory scientist Qian Janice Wang explores why experts and beginners experience complexity so differently - revealing that what makes a wine great may have less to do with what's in the glass and more to do with what's happening in your brain.", 'transcript': 'Qian Janice Wang opens by framing the central tension behind The art and science of wine tasting. The talk then connects evidence, lived experience, and examples from TEDxNoVA. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '171659', 'title': 'The accidental brilliance of makeshift signs', 'slug': 'kate-canales-the-accidental-brilliance-of-makeshift-signs', 'speaker': 'Kate Canales', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 466, 'duration_minutes': 8, 'published_at': '2026-04-06', 'recorded_on': '2025-11-11', 'views': 203431, 'topics': ['culture', 'technology', 'design', 'creativity', 'art', 'humor', 'society'], 'image': 'images/talk_022_kate-canales-the-accidental-brilliance-of-makesh.jpg', 'canonical_url': 'https://www.ted.com/talks/kate_canales_the_accidental_brilliance_of_makeshift_signs', 'description': "What happens when the design of everyday things misses the mark? People fill in the blanks. Designer Kate Canales has spent more than 20 years photographing the handmade, improvised signs that appear when the original falls short. From perplexing bathroom directions to our struggles with doors and point-of-sale machines, her photos capture something technology can't replace: our instinct to look out for each other and leave a few instructions behind.", 'transcript': 'Kate Canales opens by framing the central tension behind The accidental brilliance of makeshift signs. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175830', 'title': "The nurse who can smell Parkinson's", 'slug': 'joy-milne-the-nurse-who-can-smell-parkinson-s', 'speaker': 'Joy Milne', 'event': 'TEDxManchester', 'talk_type': 'TEDx Talk', 'duration_seconds': 1077, 'duration_minutes': 18, 'published_at': '2026-04-03', 'recorded_on': '2023-03-04', 'views': 203929, 'topics': ['science', 'innovation', 'disease', 'health', 'health care', 'biology', 'medicine'], 'image': 'images/talk_023_joy-milne-the-nurse-who-can-smell-parkinson-s.jpg', 'canonical_url': 'https://www.ted.com/talks/joy_milne_the_nurse_who_can_smell_parkinson_s', 'description': "What does Parkinson's smell like? Ask nurse Joy Milne. Born with a hypersensitive nose, she spent a lifetime learning to recognize diseases through their scents. When she smelled Parkinson's on her husband years before his diagnosis, she decided to put her gift to the test. Today, her extraordinary nose has been translated into a non-invasive test - helping researchers diagnose what was right under their noses all along.", 'transcript': "Joy Milne opens by framing the central tension behind The nurse who can smell Parkinson's. The talk then connects evidence, lived experience, and examples from TEDxManchester. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174199', 'title': 'Buenos Aires, Argentina', 'slug': 'ted-idea-search-buenos-aires-argentina', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2561, 'duration_minutes': 43, 'published_at': '2026-04-02', 'recorded_on': '2026-04-02', 'views': 31212, 'topics': ['social change'], 'image': 'images/talk_024_ted-idea-search-buenos-aires-argentina.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_buenos_aires_argentina', 'description': 'The TED Idea Search arrives in Buenos Aires, a city with a fierce intellectual tradition, as 10 speakers deliver talks in a stunning warehouse that\'s home to the city\'s iconic opera sets, competing for a chance to speak on the TED main stage. Watch as a Gen Z voice reframes "brain rot" as a secret diplomatic tool and a surgeon explores the future of robotic medicine, reminding us why the human touch still matters - and much more. Choosing just one to represent Buenos Aires to the world turns out to be one of the hardest decisions yet.', 'transcript': 'TED Idea Search opens by framing the central tension behind Buenos Aires, Argentina. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175297', 'title': "I let DaddyGPT parent my kids. Here's what I learned", 'slug': 'stephen-remedios-i-let-daddygpt-parent-my-kids-here-s-what-i-learned', 'speaker': 'Stephen Remedios', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-04-02', 'recorded_on': '2025-10-23', 'views': 201276, 'topics': ['technology', 'parenting', 'ai', 'kids'], 'image': 'images/talk_025_stephen-remedios-i-let-daddygpt-parent-my-kids-h.jpg', 'canonical_url': 'https://www.ted.com/talks/stephen_remedios_i_let_daddygpt_parent_my_kids_here_s_what_i_learned', 'description': "As the world races toward digital perfection, tech humanist Stephen Remedios tried to optimize the messiest and most imperfect of all human work: parenting. He shares the story of DaddyGPT, a digital version of himself built to help raise his kids - until they began to prefer it over him. What unfolds is a personal look at the limits of AI, and a reminder that what matters most isn't getting it right every time but showing up with the authentic imperfection only humans have.", 'transcript': "Stephen Remedios opens by framing the central tension behind I let DaddyGPT parent my kids. Here's what I learned. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175452', 'title': 'A brilliant blend of ballet, hip-hop and African dance', 'slug': 'ghetto-classics-dance-a-brilliant-blend-of-ballet-hip-hop-and-african-dance', 'speaker': 'Ghetto Classics Dance', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 434, 'duration_minutes': 7, 'published_at': '2026-04-01', 'recorded_on': '2025-06-17', 'views': 3772, 'topics': ['performance', 'africa', 'art', 'dance', 'countdown'], 'image': 'images/talk_026_ghetto-classics-dance-a-brilliant-blend-of-balle.jpg', 'canonical_url': 'https://www.ted.com/talks/ghetto_classics_dance_a_brilliant_blend_of_ballet_hip_hop_and_african_dance', 'description': "Watch the performers of Ghetto Classics Dance light up the stage with a breathtaking fusion of traditional African dance, classical ballet and modern hip-hop. Founded in Korogocho, one of Nairobi's most under-resourced neighborhoods, this community-driven program empowers dancers through intensive training and mentorship.", 'transcript': 'Ghetto Classics Dance opens by framing the central tension behind A brilliant blend of ballet, hip-hop and African dance. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175374', 'title': '5 practical ways to take control of your life', 'slug': 'jim-vandehei-5-practical-ways-to-take-control-of-your-life', 'speaker': 'Jim VandeHei', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 654, 'duration_minutes': 11, 'published_at': '2026-03-31', 'recorded_on': '2025-11-11', 'views': 243174, 'topics': ['leadership', 'success', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_027_jim-vandehei-5-practical-ways-to-take-control-of.jpg', 'canonical_url': 'https://www.ted.com/talks/jim_vandehei_5_practical_ways_to_take_control_of_your_life', 'description': 'You can\'t control the world - but you can control you. That\'s the mantra that took Axios CEO Jim VandeHei, a once "unremarkably unremarkable 20-year-old," all the way to launching companies and interviewing presidents. He breaks down a career\'s worth of observations into five deceptively simple things you can control, and explores why mastering them can change the trajectory of your life.', 'transcript': 'Jim VandeHei opens by framing the central tension behind 5 practical ways to take control of your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175298', 'title': 'Stress resets, the ultimate mental health hack', 'slug': 'jenny-taitz-stress-resets-the-ultimate-mental-health-hack', 'speaker': 'Jenny Taitz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 630, 'duration_minutes': 10, 'published_at': '2026-03-30', 'recorded_on': '2025-11-10', 'views': 263345, 'topics': ['science', 'psychology', 'relationships', 'personal growth', 'mental health', 'emotions'], 'image': 'images/talk_028_jenny-taitz-stress-resets-the-ultimate-mental-he.jpg', 'canonical_url': 'https://www.ted.com/talks/jenny_taitz_stress_resets_the_ultimate_mental_health_hack', 'description': 'Stress is contagious - but so is calm. Psychologist Jenny Taitz explains why one stressful moment tends to snowball into the next, and shares small, immediate resets you can practice anywhere to break the spiral before it starts.', 'transcript': 'Jenny Taitz opens by framing the central tension behind Stress resets, the ultimate mental health hack. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174198', 'title': 'Chicago, USA', 'slug': 'ted-idea-search-chicago-usa', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2769, 'duration_minutes': 46, 'published_at': '2026-03-27', 'recorded_on': '2026-03-27', 'views': 28577, 'topics': ['social change'], 'image': 'images/talk_029_ted-idea-search-chicago-usa.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_chicago_usa', 'description': 'In the Windy City, 10 Chicagoans step onto the iconic red circle, each with six minutes to prove they have an idea that could change everything. Among them: a chemist who believes we can deploy precision medicine to save endangered species, a journalist creating tools to navigate difficult conversations and a runner challenging the narrative of a divided city by exploring every one of its streets. The stakes are personal, the competition is fierce - and one speaker will earn the chance to take their idea to the main stage at TED in Vancouver.', 'transcript': 'TED Idea Search opens by framing the central tension behind Chicago, USA. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175334', 'title': 'Why the world is still not built for women', 'slug': 'virginia-santy-why-the-world-is-still-not-built-for-women', 'speaker': 'Virginia Santy', 'event': 'TEDxMileHigh', 'talk_type': 'TEDx Talk', 'duration_seconds': 804, 'duration_minutes': 13, 'published_at': '2026-03-26', 'recorded_on': '2022-11-12', 'views': 214046, 'topics': ['design', 'cities', 'urban planning', 'social change', 'women', 'tedx', 'feminism'], 'image': 'images/talk_030_virginia-santy-why-the-world-is-still-not-built-.jpg', 'canonical_url': 'https://www.ted.com/talks/virginia_santy_why_the_world_is_still_not_built_for_women', 'description': 'Design consultant Virginia Santy set out to create an office space built specifically for women, flipping the script on the subtle (and not-so-subtle) ways that workplaces and cities still fail them. The results were striking: greater productivity, deeper collaboration and an environment where women felt genuinely valued, leading her to ask a simple question: What would the world look like if we designed with women in mind?', 'transcript': 'Virginia Santy opens by framing the central tension behind Why the world is still not built for women. The talk then connects evidence, lived experience, and examples from TEDxMileHigh. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174197', 'title': 'Singapore', 'slug': 'ted-idea-search-singapore', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 0, 'duration_minutes': 1, 'published_at': '2026-03-25', 'recorded_on': '2026-03-25', 'views': 23267, 'topics': ['social change'], 'image': 'images/talk_031_ted-idea-search-singapore.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_singapore', 'description': "The TED Idea Search touches down in Singapore, where eight speakers compete for an extraordinary prize. From a diver-turned-ocean-restorer reviving dead coral reefs to a scientist growing sustainable building materials out of fungus and a government insider reimagining public institutions, the ideas are as diverse as the Lion City itself. As TED's coaches push each speaker to transform their thinking into a powerful narrative, nerves rise, breakthroughs emerge and one speaker earns the opportunity to share their idea on the global stage.", 'transcript': 'TED Idea Search opens by framing the central tension behind Singapore. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174672', 'title': 'My bank called in the middle of my TED Talk', 'slug': 'mike-albo-my-bank-called-in-the-middle-of-my-ted-talk', 'speaker': 'Mike Albo', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 344, 'duration_minutes': 6, 'published_at': '2026-03-25', 'recorded_on': '2025-11-10', 'views': 197679, 'topics': ['culture', 'technology', 'entertainment', 'consumerism', 'comedy', 'data'], 'image': 'images/talk_032_mike-albo-my-bank-called-in-the-middle-of-my-ted.jpg', 'canonical_url': 'https://www.ted.com/talks/mike_albo_my_bank_called_in_the_middle_of_my_ted_talk', 'description': 'In this TED Talk gone wrong, comedian Mike Albo receives an unexpected call from his bank. The result: a hilariously uncomfortable tour of his purchase history, and a reminder that in the digital age, our data knows us a little too well.', 'transcript': 'Mike Albo opens by framing the central tension behind My bank called in the middle of my TED Talk. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174466', 'title': '3 ways to create a truly original design', 'slug': 'lope-gutierrez-ruiz-3-ways-to-create-a-truly-original-design', 'speaker': 'Lope Gutierrez-Ruiz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 355, 'duration_minutes': 6, 'published_at': '2026-03-24', 'recorded_on': '2025-11-10', 'views': 217982, 'topics': ['culture', 'design', 'media', 'collaboration', 'creativity', 'art', 'ted fellows', 'animation'], 'image': 'images/talk_033_lope-gutierrez-ruiz-3-ways-to-create-a-truly-ori.jpg', 'canonical_url': 'https://www.ted.com/talks/lope_gutierrez_ruiz_3_ways_to_create_a_truly_original_design', 'description': "In a world where design trends are quietly converging - same color palettes, same typography, same illustration styles - how do you make work that actually looks different? Designer and TED Fellow Lope Gutierrez-Ruiz distills his answer into three sharp, counterintuitive ideas, ticking through his studio's own funky creations to show how you can make things that stand out.", 'transcript': 'Lope Gutierrez-Ruiz opens by framing the central tension behind 3 ways to create a truly original design. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174464', 'title': '3 things I wish I knew when I was broke', 'slug': 'vivian-tu-3-things-i-wish-i-knew-when-i-was-broke', 'speaker': 'Vivian Tu', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 560, 'duration_minutes': 9, 'published_at': '2026-03-23', 'recorded_on': '2025-11-10', 'views': 300368, 'topics': ['business', 'personal growth', 'women in business', 'money', 'finance'], 'image': 'images/talk_034_vivian-tu-3-things-i-wish-i-knew-when-i-was-brok.jpg', 'canonical_url': 'https://www.ted.com/talks/vivian_tu_3_things_i_wish_i_knew_when_i_was_broke', 'description': "Finance doesn't have to feel like a foreign language. Wall Street trader-turned-financial educator Vivian Tu helps millions of people make sense of money, breaking down complex concepts into everyday terms you can understand. She shares how she broke free from the stress of living paycheck to paycheck - and explores how we can shift power structures to give everyone a real shot at building wealth.", 'transcript': 'Vivian Tu opens by framing the central tension behind 3 things I wish I knew when I was broke. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174728', 'title': 'Joy will find you - if you let it', 'slug': 'david-larbi-joy-will-find-you-if-you-let-it', 'speaker': 'David Larbi', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 305, 'duration_minutes': 5, 'published_at': '2026-03-20', 'recorded_on': '2025-11-10', 'views': 243270, 'topics': ['performance', 'creativity', 'poetry', 'happiness', 'personal growth'], 'image': 'images/talk_035_david-larbi-joy-will-find-you-if-you-let-it.jpg', 'canonical_url': 'https://www.ted.com/talks/david_larbi_joy_will_find_you_if_you_let_it', 'description': 'Author David Larbi recites a poem about the journey toward joy, reminding us of all the ways it can be found: having a conversation with a stranger, tasting the perfect bite of food or enjoying a good stretch. Joy is all around us - you just need to know where to look.', 'transcript': 'David Larbi opens by framing the central tension behind Joy will find you - if you let it. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174196', 'title': 'London, UK', 'slug': 'ted-idea-search-london-uk', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2786, 'duration_minutes': 46, 'published_at': '2026-03-19', 'recorded_on': '2026-03-19', 'views': 38468, 'topics': ['social change'], 'image': 'images/talk_036_ted-idea-search-london-uk.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_london_uk', 'description': "In London, the TED Idea Search brings together 10 voices from one of the world's most influential cultural capitals to compete for the opportunity to speak on the main stage at TED. From a civil engineer revealing the invisible infrastructure shaping our cities to a classical singer uncovering the erased history of women in music, the ideas on offer are both deeply personal and global in scope. When the lights come up, London doesn't hold back - and one speaker delivers a talk no one in that room will soon forget.", 'transcript': 'TED Idea Search opens by framing the central tension behind London, UK. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173046', 'title': 'How to tune your inner voice', 'slug': 'rhonda-ross-daniel-alexander-jones-how-to-tune-your-inner-voice', 'speaker': 'Rhonda Ross, Daniel Alexander Jones', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1196, 'duration_minutes': 20, 'published_at': '2026-03-19', 'recorded_on': '2025-11-09', 'views': 226951, 'topics': ['culture', 'music', 'creativity', 'art', 'relationships', 'personal growth', 'society', 'ted fellows', 'emotions'], 'image': 'images/talk_037_rhonda-ross-daniel-alexander-jones-how-to-tune-y.jpg', 'canonical_url': 'https://www.ted.com/talks/rhonda_ross_daniel_alexander_jones_how_to_tune_your_inner_voice', 'description': 'To calm the storm inside your mind, you must first understand it. Singer and actress Rhonda Ross shares her theory of "emotional sovereignty" - the idea that your feelings aren\'t shaped just by your circumstances, but by the thoughts running on loop in your head. In conversation with scholar and TED Fellow Daniel Alexander Jones, Ross introduces the unexpected, music-rooted practice for taking control of your narrative.', 'transcript': 'Rhonda Ross, Daniel Alexander Jones opens by framing the central tension behind How to tune your inner voice. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174671', 'title': 'The 6 eras of NBA fashion - from restrained to radical', 'slug': 'mitchell-s-jackson-the-6-eras-of-nba-fashion-from-restrained-to-radical', 'speaker': 'Mitchell S. Jackson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 564, 'duration_minutes': 9, 'published_at': '2026-03-19', 'recorded_on': '2025-11-11', 'views': 183882, 'topics': ['culture', 'history', 'sports', 'fashion', 'ted fellows', 'protest'], 'image': 'images/talk_038_mitchell-s-jackson-the-6-eras-of-nba-fashion-fro.jpg', 'canonical_url': 'https://www.ted.com/talks/mitchell_s_jackson_the_6_eras_of_nba_fashion_from_restrained_to_radical', 'description': 'What are you wearing, and why? This is the question that writer and TED Fellow Mitchell S. Jackson asks as he unpacks the six eras of NBA style. Tracing an arc from Bill Russell to Lebron James and beyond, he explores how players use fashion on and off the court to challenge the limits placed upon them - revealing a deeper story about culture, identity and power.', 'transcript': 'Mitchell S. Jackson opens by framing the central tension behind The 6 eras of NBA fashion - from restrained to radical. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174584', 'title': 'I taught rats to drive. They taught me to enjoy the ride', 'slug': 'kelly-lambert-i-taught-rats-to-drive-they-taught-me-to-enjoy-the-ride', 'speaker': 'Kelly Lambert', 'event': 'TEDxRVA Youth', 'talk_type': 'TEDx Talk', 'duration_seconds': 840, 'duration_minutes': 14, 'published_at': '2026-03-18', 'recorded_on': '2025-11-09', 'views': 217160, 'topics': ['science', 'animals', 'happiness', 'brain', 'neuroscience', 'tedx', 'emotions'], 'image': 'images/talk_039_kelly-lambert-i-taught-rats-to-drive-they-taught.jpg', 'canonical_url': 'https://www.ted.com/talks/kelly_lambert_i_taught_rats_to_drive_they_taught_me_to_enjoy_the_ride', 'description': 'What can happy rats teach us about human joy? Behavioral neuroscientist Kelly Lambert describes how her team trained rats to drive tiny cars to earn treats - and noticed something surprising about how effort and anticipation affect the brain. The experiment opens new questions about how reward, agency and "behaviorceuticals" might help build resilience and support mental health.', 'transcript': 'Kelly Lambert opens by framing the central tension behind I taught rats to drive. They taught me to enjoy the ride. The talk then connects evidence, lived experience, and examples from TEDxRVA Youth. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174670', 'title': 'Is luck random - or can you cultivate it?', 'slug': 'christian-busch-is-luck-random-or-can-you-cultivate-it', 'speaker': 'Christian Busch', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 768, 'duration_minutes': 13, 'published_at': '2026-03-17', 'recorded_on': '2025-10-23', 'views': 833338, 'topics': ['science', 'future', 'personal growth', 'decision-making'], 'image': 'images/talk_040_christian-busch-is-luck-random-or-can-you-cultiv.jpg', 'canonical_url': 'https://www.ted.com/talks/christian_busch_is_luck_random_or_can_you_cultivate_it', 'description': 'When the 2025 Los Angeles wildfires destroyed his home and neighborhood, scientist Christian Busch encountered the opposite of serendipity: "zemblanity," or bad luck by design. Drawing on more than a decade of scientific research, he explores how people can navigate unpredictability by adopting a serendipity mindset that transforms setbacks into unexpected new beginnings. He asks: What if good luck isn\'t random but can actually be cultivated?', 'transcript': 'Christian Busch opens by framing the central tension behind Is luck random - or can you cultivate it?. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174283', 'title': 'How to make transportation quieter, cleaner and cheaper', 'slug': 'doreen-orishaba-how-to-make-transportation-quieter-cleaner-and-cheaper', 'speaker': 'Doreen Orishaba', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-03-16', 'recorded_on': '2025-06-18', 'views': 214856, 'topics': ['climate change', 'transportation', 'africa', 'countdown'], 'image': 'images/talk_041_doreen-orishaba-how-to-make-transportation-quiet.jpg', 'canonical_url': 'https://www.ted.com/talks/doreen_orishaba_how_to_make_transportation_quieter_cleaner_and_cheaper', 'description': 'When Doreen Orishaba helped build Africa\'s first electric car in 2011, skeptics dismissed it as a "toy for the Western world." Now she\'s running dozens of electric buses across Kenya and Rwanda, moving thousands of passengers to work every day on zero-exhaust vehicles powered by near-silent engines. She breaks down what it actually takes to scale clean transport - and why skipping the gas station pit stop is closer than you may think.', 'transcript': 'Doreen Orishaba opens by framing the central tension behind How to make transportation quieter, cleaner and cheaper. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174282', 'title': 'What China can teach the world about scaling clean energy', 'slug': 'yin-yu-what-china-can-teach-the-world-about-scaling-clean-energy', 'speaker': 'Yin Yu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 545, 'duration_minutes': 9, 'published_at': '2026-03-13', 'recorded_on': '2025-06-18', 'views': 8098, 'topics': ['climate change', 'sustainability', 'energy', 'china', 'solar energy', 'countdown', 'renewable energy'], 'image': 'images/talk_042_yin-yu-what-china-can-teach-the-world-about-scal.jpg', 'canonical_url': 'https://www.ted.com/talks/yin_yu_what_china_can_teach_the_world_about_scaling_clean_energy', 'description': 'When Yin Yu first visited a major hydropower dam site in China, she expected to see a thriving community. Instead, she found families who\'d lost their land and livelihoods to the rising water. It was a powerful lesson in how "green" megaprojects can harm the people they\'re meant to help. Now, as solar and electric vehicles spread rapidly across Southeast Asia, Yin says the opportunity is enormous - but only if countries don\'t repeat the mistakes of the past.', 'transcript': 'Yin Yu opens by framing the central tension behind What China can teach the world about scaling clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174195', 'title': 'Lagos, Nigeria', 'slug': 'ted-idea-search-lagos-nigeria', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2792, 'duration_minutes': 47, 'published_at': '2026-03-12', 'recorded_on': '2026-03-12', 'views': 20035, 'topics': ['social change'], 'image': 'images/talk_043_ted-idea-search-lagos-nigeria.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_lagos_nigeria', 'description': "In the heart of Lagos - a megacity of 20 million people pulsing with energy and big ambitions - nine undiscovered voices compete for a chance to speak on the world's biggest stage for ideas. From a renewable energy advocate who studied by candlelight to an archivist reimagining Africa-centered education, these speakers bring stories with global stakes. But only one will earn the 7,000-mile journey to the TED stage in Vancouver.", 'transcript': 'TED Idea Search opens by framing the central tension behind Lagos, Nigeria. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '137525', 'title': '"May Your Kindness Remain" / "If I Told"', 'slug': 'courtney-marie-andrews-may-your-kindness-remain-if-i-told', 'speaker': 'Courtney Marie Andrews', 'event': 'TEDCountdown@BloombergGreenFestival', 'talk_type': 'TED Stage Talk', 'duration_seconds': 634, 'duration_minutes': 11, 'published_at': '2026-03-11', 'recorded_on': '2024-07-12', 'views': 8624, 'topics': ['environment', 'music', 'performance'], 'image': 'images/talk_044_courtney-marie-andrews-may-your-kindness-remain-.jpg', 'canonical_url': 'https://www.ted.com/talks/courtney_marie_andrews_may_your_kindness_remain_if_i_told', 'description': 'Singer-songwriter Courtney Marie Andrews performs "If I Told" and "May Your Kindness Remain," songs based on her connection to music, nature and environmental advocacy.', 'transcript': 'Courtney Marie Andrews opens by framing the central tension behind "May Your Kindness Remain" / "If I Told". The talk then connects evidence, lived experience, and examples from TEDCountdown@BloombergGreenFestival. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174194', 'title': 'Athens, Greece', 'slug': 'ted-idea-search-athens-greece', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2892, 'duration_minutes': 48, 'published_at': '2026-03-10', 'recorded_on': '2026-03-10', 'views': 38463, 'topics': ['social change'], 'image': 'images/talk_045_ted-idea-search-athens-greece.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_athens_greece', 'description': "The next stop on the TED Idea Search is Athens, birthplace of democracy and the world's oldest debating tradition. Nine speakers - from a fashion manufacturer taking on modern slavery to a microbiologist tackling the science of bad breath - go head-to-head for a shot to speak on the TED stage in Vancouver. Rehearsals are rocky, nerves are real and the stakes couldn't be higher - and only one speaker gets to move on and represent Athens to the world.", 'transcript': 'TED Idea Search opens by framing the central tension behind Athens, Greece. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173420', 'title': 'What would your "deathbed self" tell you today?', 'slug': 'lauren-deeley-what-would-your-deathbed-self-tell-you-today', 'speaker': 'Lauren Deeley', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 379, 'duration_minutes': 6, 'published_at': '2026-03-10', 'recorded_on': '2025-11-10', 'views': 252860, 'topics': ['future', 'work', 'personal growth', 'self', 'money', 'life'], 'image': 'images/talk_046_lauren-deeley-what-would-your-deathbed-self-tell.jpg', 'canonical_url': 'https://www.ted.com/talks/lauren_deeley_what_would_your_deathbed_self_tell_you_today', 'description': 'What if the key to making better decisions today is getting to know the person you\'ll become tomorrow? Drawing on psychological research and real-life stories, private wealth advisor Lauren Deeley explores how building a meaningful connection with your "deathbed self" can bring more clarity, joy and intention to the life you\'re building right now.', 'transcript': 'Lauren Deeley opens by framing the central tension behind What would your "deathbed self" tell you today?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174009', 'title': 'Mumbai, India', 'slug': 'ted-idea-search-mumbai-india', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2738, 'duration_minutes': 46, 'published_at': '2026-03-09', 'recorded_on': '2026-03-09', 'views': 22102, 'topics': ['social change'], 'image': 'images/talk_047_ted-idea-search-mumbai-india.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_mumbai_india', 'description': "In Mumbai, the TED Idea Search lands in India's bustling financial and creative capital, where 10 speakers are challenged to deliver the talk of their lives and compete for a one-of-a-kind opportunity: a spot on the TED stage in Vancouver. What emerges is a moving portrait of vulnerability and ambition, as ideas about vanishing tribal art, maternal health and India's forgotten fashion history look to shift perspectives on a global scale. Only one can make it through - who will it be?", 'transcript': 'TED Idea Search opens by framing the central tension behind Mumbai, India. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173439', 'title': 'Why you should keep a list of what makes you laugh', 'slug': 'chris-duffy-why-you-should-keep-a-list-of-what-makes-you-laugh', 'speaker': 'Chris Duffy', 'event': 'TED Talks Daily Book Club', 'talk_type': 'TED Stage Talk', 'duration_seconds': 3426, 'duration_minutes': 57, 'published_at': '2026-03-09', 'recorded_on': '2026-02-18', 'views': 229371, 'topics': ['culture', 'creativity', 'personal growth', 'comedy', 'humor'], 'image': 'images/talk_048_chris-duffy-why-you-should-keep-a-list-of-what-m.jpg', 'canonical_url': 'https://www.ted.com/talks/chris_duffy_why_you_should_keep_a_list_of_what_makes_you_laugh', 'description': 'The world is weird and hilarious - if you know where to look, says comedian Chris Duffy. In conversation with "TED Talks Daily" host Elise Hu, Duffy breaks down three practical pillars of humor, showing how laughter can help you feel present, creative and connected, even when the world feels overwhelming. (This conversation was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)', 'transcript': 'Chris Duffy opens by framing the central tension behind Why you should keep a list of what makes you laugh. The talk then connects evidence, lived experience, and examples from TED Talks Daily Book Club. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172133', 'title': 'Conservation: a love story', 'slug': 'elsaphan-njora-conservation-a-love-story', 'speaker': 'Elsaphan Njora', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 520, 'duration_minutes': 9, 'published_at': '2026-03-06', 'recorded_on': '2025-06-17', 'views': 208417, 'topics': ['climate change', 'nature', 'love', 'biodiversity', 'conservation', 'countdown'], 'image': 'images/talk_049_elsaphan-njora-conservation-a-love-story.jpg', 'canonical_url': 'https://www.ted.com/talks/elsaphan_njora_conservation_a_love_story', 'description': "What if the key to saving nature isn't just about science or policy, but love? Love for the land, for the people who depend on it, for the world we leave behind. Artist Elsaphan Njora has journeyed across Kenya witnessing ecosystems vanish, from Indigenous forests to sacred lakes. But he's also seen communities breathing life back into rivers, forests and coasts in creative, unexpected ways - showing that conservation can flourish alongside livelihoods, and that even the most threatened landscapes can be reborn.", 'transcript': 'Elsaphan Njora opens by framing the central tension behind Conservation: a love story. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173850', 'title': 'Sydney, Australia', 'slug': 'ted-idea-search-sydney-australia', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2625, 'duration_minutes': 44, 'published_at': '2026-03-04', 'recorded_on': '2026-03-04', 'views': 46087, 'topics': ['society'], 'image': 'images/talk_050_ted-idea-search-sydney-australia.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_sydney_australia', 'description': "In the premiere of the TED Idea Search, we travel to Sydney, Australia, where 10 brilliant people take the stage for the shot of a lifetime: a chance to speak at the TED conference in Vancouver. From a wildlife scientist deploying AI to bust illegal trafficking networks to Australia's own human rights commissioner sounding the alarm on brain-reading technology, these speakers bring ideas that could genuinely shift how we live. But only one can win - and the choice comes down to a single, unforgettable talk that leaves the audience (and the judges) blown away.", 'transcript': 'TED Idea Search opens by framing the central tension behind Sydney, Australia. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173043', 'title': '3 habits to practice curiosity - and escape your phone', 'slug': 'nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone', 'speaker': 'Nayeema Raza', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 312, 'duration_minutes': 5, 'published_at': '2026-03-04', 'recorded_on': '2025-11-11', 'views': 554563, 'topics': ['culture', 'technology', 'social change', 'society', 'curiosity'], 'image': 'images/talk_051_nayeema-raza-3-habits-to-practice-curiosity-and-.jpg', 'canonical_url': 'https://www.ted.com/talks/nayeema_raza_3_habits_to_practice_curiosity_and_escape_your_phone', 'description': "We're so entangled with our devices that online has started to feel more real than IRL, says journalist Nayeema Raza. As screens reshape how we connect and relate, she offers three practical habits to reignite curiosity, restore presence and break free from our phones.", 'transcript': 'Nayeema Raza opens by framing the central tension behind 3 habits to practice curiosity - and escape your phone. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173440', 'title': '4 relationship traps that lead to burnout', 'slug': 'eric-quintane-4-relationship-traps-that-lead-to-burnout', 'speaker': 'Eric Quintane', 'event': 'TEDxESMTBerlin', 'talk_type': 'TEDx Talk', 'duration_seconds': 991, 'duration_minutes': 17, 'published_at': '2026-03-04', 'recorded_on': '2025-02-01', 'views': 285438, 'topics': ['business', 'psychology', 'relationships', 'communication', 'work', 'personal growth', 'society', 'tedx'], 'image': 'images/talk_052_eric-quintane-4-relationship-traps-that-lead-to-.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_quintane_4_relationship_traps_that_lead_to_burnout', 'description': 'Are your workplace relationships quietly burning you out? Drawing on large-scale research across industries, organizational behavior researcher Eric Quintane reveals four hidden relational traps woven into the fabric of work - and explores how connection shapes resilience, vulnerability and burnout.', 'transcript': 'Eric Quintane opens by framing the central tension behind 4 relationship traps that lead to burnout. The talk then connects evidence, lived experience, and examples from TEDxESMTBerlin. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173576', 'title': 'Love, intimacy and connection in the age of AI', 'slug': 'bryony-cole-love-intimacy-and-connection-in-the-age-of-ai', 'speaker': 'Bryony Cole', 'event': 'TED Membership', 'talk_type': 'TED Stage Talk', 'duration_seconds': 2631, 'duration_minutes': 44, 'published_at': '2026-03-03', 'recorded_on': '2026-02-05', 'views': 203689, 'topics': ['technology', 'love', 'relationships', 'ai', 'sex', 'ted membership'], 'image': 'images/talk_053_bryony-cole-love-intimacy-and-connection-in-the-.jpg', 'canonical_url': 'https://www.ted.com/talks/bryony_cole_love_intimacy_and_connection_in_the_age_of_ai', 'description': "Relationships were never meant to be efficient, says sextech expert Bryony Cole, and yet AI companions are increasingly designed to be exactly that. As intimate relationships between humans and AI become more common, Cole challenges us to think more deliberately about how we shape our connections to machines - and with each other. (This conversation, hosted by TED's Whitney Pennington Rodgers, was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)", 'transcript': 'Bryony Cole opens by framing the central tension behind Love, intimacy and connection in the age of AI. The talk then connects evidence, lived experience, and examples from TED Membership. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173044', 'title': 'The sneaky language tricks cults use to influence you', 'slug': 'amanda-montell-the-sneaky-language-tricks-cults-use-to-influence-you', 'speaker': 'Amanda Montell', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 354, 'duration_minutes': 6, 'published_at': '2026-03-02', 'recorded_on': '2025-11-11', 'views': 260199, 'topics': ['culture', 'media', 'relationships', 'communication', 'community', 'language', 'society'], 'image': 'images/talk_054_amanda-montell-the-sneaky-language-tricks-cults-.jpg', 'canonical_url': 'https://www.ted.com/talks/amanda_montell_the_sneaky_language_tricks_cults_use_to_influence_you', 'description': "In the age of social media and wellness trends, the comments section is as good as a cult compound, says linguist and cultural commentator Amanda Montell. Using Taylor Swift's throng of devoted Swifties as her guide, she exposes three sneaky language tactics that cults use to influence us (for better or for worse), revealing why none of us are as cult-proof as we'd like to think.", 'transcript': 'Amanda Montell opens by framing the central tension behind The sneaky language tricks cults use to influence you. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173511', 'title': 'The attack on Iran - why now?', 'slug': 'ian-bremmer-the-attack-on-iran-why-now', 'speaker': 'Ian Bremmer', 'event': 'TED Explains the World with Ian Bremmer', 'talk_type': 'Original Content', 'duration_seconds': 2669, 'duration_minutes': 44, 'published_at': '2026-03-01', 'recorded_on': '2026-02-28', 'views': 684021, 'topics': ['global issues', 'politics', 'military', 'war', 'government', 'middle east', 'policy', 'international relations', 'current events'], 'image': 'images/talk_055_ian-bremmer-the-attack-on-iran-why-now.jpg', 'canonical_url': 'https://www.ted.com/talks/ian_bremmer_the_attack_on_iran_why_now', 'description': 'On the morning of February 28, 2026, the US and Israel bombed several parts of Iran, including the Tehran compound of Supreme Leader Ali Khamenei. Geopolitical expert and Eurasia Group founder Ian Bremmer breaks down why US President Donald Trump made the decision to strike, what it means for hopes of "regime change" and the key details you need to know about this perilous moment in global history. (This interview, hosted by TED\'s Helen Walters, was recorded on February 28, 2026.)', 'transcript': 'Ian Bremmer opens by framing the central tension behind The attack on Iran - why now?. The talk then connects evidence, lived experience, and examples from TED Explains the World with Ian Bremmer. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173004', 'title': "What to do when you're told there's nothing left to try", 'slug': 'david-fajgenbaum-and-kiah-williams-what-to-do-when-you-re-told-there-s-nothing-left-to-try', 'speaker': 'David Fajgenbaum and Kiah Williams', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1720, 'duration_minutes': 29, 'published_at': '2026-02-27', 'recorded_on': '2025-11-10', 'views': 220867, 'topics': ['science', 'technology', 'social change', 'health', 'health care', 'medicine', 'poverty', 'personal growth', 'ai', 'public health', 'medical research', 'the audacious project', 'artificial intelligence'], 'image': 'images/talk_056_david-fajgenbaum-and-kiah-williams-what-to-do-wh.jpg', 'canonical_url': 'https://www.ted.com/talks/david_fajgenbaum_and_kiah_williams_what_to_do_when_you_re_told_there_s_nothing_left_to_try', 'description': "What do you do when the world declares something impossible? When physician-scientist David Fajgenbaum was dying from a rare disease and social entrepreneur Kiah Williams was confronting the realities of economic hardship, they began asking a different question: What can I do today? In this conversation, they discuss how turning hope into action can drive meaningful change - one step at a time. (This conversation is hosted by The Audacious Project's Alexandra Tillmann.)", 'transcript': "David Fajgenbaum and Kiah Williams opens by framing the central tension behind What to do when you're told there's nothing left to try. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172996', 'title': 'My year living with a robot', 'slug': 'emily-kate-genatowski-my-year-living-with-a-robot', 'speaker': 'Emily Kate Genatowski', 'event': 'TEDAI Vienna 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 830, 'duration_minutes': 14, 'published_at': '2026-02-25', 'recorded_on': '2025-09-26', 'views': 246590, 'topics': ['technology', 'robots', 'ai', 'life'], 'image': 'images/talk_057_emily-kate-genatowski-my-year-living-with-a-robo.jpg', 'canonical_url': 'https://www.ted.com/talks/emily_kate_genatowski_my_year_living_with_a_robot', 'description': "Imagine a robot moving into your home. How would it change your daily life? Historian Emily Kate Genatowski shares five eye-opening lessons from a year living with her AI-powered robot roommate, from the quirky and chaotic to the surprisingly mundane. Her experiences show that the future of robots isn't science fiction - it's practical, messy and already here.", 'transcript': 'Emily Kate Genatowski opens by framing the central tension behind My year living with a robot. The talk then connects evidence, lived experience, and examples from TEDAI Vienna 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172999', 'title': 'Jermaine Dupri on the art of making a hit | On the Spot', 'slug': 'jermaine-dupri-jermaine-dupri-on-the-art-of-making-a-hit-on-the-spot', 'speaker': 'Jermaine Dupri', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 660, 'duration_minutes': 11, 'published_at': '2026-02-26', 'recorded_on': '2025-11-10', 'views': 211240, 'topics': ['culture', 'entertainment', 'music', 'collaboration', 'creativity', 'art'], 'image': 'images/talk_058_jermaine-dupri-jermaine-dupri-on-the-art-of-maki.jpg', 'canonical_url': 'https://www.ted.com/talks/jermaine_dupri_jermaine_dupri_on_the_art_of_making_a_hit_on_the_spot', 'description': 'Legendary music producer Jermaine Dupri pulls back the curtain on how hit songs really get made in TED\'s rapid-fire Q&A format, "On the Spot." Answering a stream of unexpected questions, he covers what makes a good hook, why he doesn\'t chase "cool," how he helped build Atlanta\'s sound and more.', 'transcript': 'Jermaine Dupri opens by framing the central tension behind Jermaine Dupri on the art of making a hit | On the Spot. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '171661', 'title': 'The controversial climate tool funding real change', 'slug': 'sandeep-roy-choudhury-the-controversial-climate-tool-funding-real-change', 'speaker': 'Sandeep Roy Choudhury', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 535, 'duration_minutes': 9, 'published_at': '2026-02-24', 'recorded_on': '2025-06-17', 'views': 221876, 'topics': ['climate change', 'environment', 'sustainability', 'finance', 'countdown'], 'image': 'images/talk_059_sandeep-roy-choudhury-the-controversial-climate-.jpg', 'canonical_url': 'https://www.ted.com/talks/sandeep_roy_choudhury_the_controversial_climate_tool_funding_real_change', 'description': "If a company plants trees to offset its pollution, is that climate progress - or is it greenwashing? Critics of carbon markets say it's the latter. But Sandeep Roy Choudhury, who's spent two decades financing climate projects from rural cookstoves to coastal forests, says the real failure is discouraging companies from even trying. Hear his case for why we shouldn't let perfection block meaningful action on climate change.", 'transcript': 'Sandeep Roy Choudhury opens by framing the central tension behind The controversial climate tool funding real change. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172142', 'title': 'A surprisingly effective way to fight misinformation', 'slug': 'dave-jorgenson-a-surprisingly-effective-way-to-fight-misinformation', 'speaker': 'Dave Jorgenson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 754, 'duration_minutes': 13, 'published_at': '2026-02-23', 'recorded_on': '2025-11-09', 'views': 406598, 'topics': ['culture', 'media', 'humor', 'society', 'internet'], 'image': 'images/talk_060_dave-jorgenson-a-surprisingly-effective-way-to-f.jpg', 'canonical_url': 'https://www.ted.com/talks/dave_jorgenson_a_surprisingly_effective_way_to_fight_misinformation', 'description': "What if the best defense against misinformation isn't panic, but a punchline? Journalist and comedian Dave Jorgenson explores how misinformation has proliferated throughout history - from the age of Plato to the era of viral TikToks. With his own short, absurdist sketches that explain the news, he shows how humor can cut through fear, spark curiosity and explore nuanced truth.", 'transcript': 'Dave Jorgenson opens by framing the central tension behind A surprisingly effective way to fight misinformation. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172495', 'title': 'How a viral choreographer makes his moves', 'slug': 'sean-bankhead-how-a-viral-choreographer-makes-his-moves', 'speaker': 'Sean Bankhead', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 399, 'duration_minutes': 7, 'published_at': '2026-02-20', 'recorded_on': '2025-11-09', 'views': 26868, 'topics': ['culture', 'music', 'performance', 'art', 'dance'], 'image': 'images/talk_061_sean-bankhead-how-a-viral-choreographer-makes-hi.jpg', 'canonical_url': 'https://www.ted.com/talks/sean_bankhead_how_a_viral_choreographer_makes_his_moves', 'description': 'In a swaggering performance, choreographer Sean Bankhead and his students perform the viral dance he designed for Victoria Monet\'s hit song "On My Mama." Rooted in Black culture and inspired by generations of iconic artists, Bankhead blends expertise with at least one move everyone can try - showing how choreography doesn\'t just reflect culture, it drives it forward.', 'transcript': 'Sean Bankhead opens by framing the central tension behind How a viral choreographer makes his moves. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172774', 'title': "The story you're not hearing about AI data centers", 'slug': 'ay-e-coskun-the-story-you-re-not-hearing-about-ai-data-centers', 'speaker': 'Ayse Coskun', 'event': 'TEDAI San Francisco', 'talk_type': 'TED Stage Talk', 'duration_seconds': 717, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-21', 'views': 302717, 'topics': ['environment', 'sustainability', 'technology', 'energy', 'ai', 'data', 'renewable energy'], 'image': 'images/talk_062_ay-e-coskun-the-story-you-re-not-hearing-about-a.jpg', 'canonical_url': 'https://www.ted.com/talks/ay_e_coskun_the_story_you_re_not_hearing_about_ai_data_centers', 'description': "The race to build smarter AI is crashing into a physical limitation: the power grid simply can't keep up with the energy demands of data centers. Computer scientist Ayse Coskun shows how we could turn this problem on its head, transforming AI facilities into virtual batteries that help stabilize the grid and accelerate clean energy. Learn why the technology causing this crisis might be the only thing smart enough to fix it.", 'transcript': "Ayse Coskun opens by framing the central tension behind The story you're not hearing about AI data centers. The talk then connects evidence, lived experience, and examples from TEDAI San Francisco. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '170176', 'title': 'How to be a great listener', 'slug': 'maegan-stephens-nicole-lowenbraun-how-to-be-a-great-listener', 'speaker': 'Maegan Stephens, Nicole Lowenbraun', 'event': 'TED@BCG', 'talk_type': 'TED Stage Talk', 'duration_seconds': 706, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-23', 'views': 357273, 'topics': ['communication', 'leadership', 'work', 'trust', 'goals'], 'image': 'images/talk_063_maegan-stephens-nicole-lowenbraun-how-to-be-a-gr.jpg', 'canonical_url': 'https://www.ted.com/talks/maegan_stephens_nicole_lowenbraun_how_to_be_a_great_listener', 'description': 'Have you ever left a meeting thinking: everyone talked, but nothing was achieved? Chances are that people were listening to each other, just not in the same way. Listening experts Maegan Stephens and Nicole Lowenbraun unpack the four different ways to listen, sharing a practical framework that could change how you respond, build trust and get results - starting with just one simple question.', 'transcript': 'Maegan Stephens, Nicole Lowenbraun opens by framing the central tension behind How to be a great listener. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '170828', 'title': "What you know that AI doesn't", 'slug': 'priyanka-vergadia-what-you-know-that-ai-doesn-t', 'speaker': 'Priyanka Vergadia', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 559, 'duration_minutes': 9, 'published_at': '2026-02-18', 'recorded_on': '2025-11-10', 'views': 278682, 'topics': ['technology', 'collaboration', 'work', 'ai', 'career'], 'image': 'images/talk_064_priyanka-vergadia-what-you-know-that-ai-doesn-t.jpg', 'canonical_url': 'https://www.ted.com/talks/priyanka_vergadia_what_you_know_that_ai_doesn_t', 'description': "AI is good at seeing patterns, but it's humans who figure out what to do next, says technologist Priyanka Vergadia. She shares three stories of human excellence sparked by AI insights and offers a pathway to identify and cultivate your irreplaceable qualities, turning the AI revolution from a threat into an opportunity.", 'transcript': "Priyanka Vergadia opens by framing the central tension behind What you know that AI doesn't. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}] + +PLAYLISTS = [{'slug': 'ai-and-society', 'title': 'AI, Society, and the Future', 'description': 'Talks about artificial intelligence, prediction, work, law, and public life.', 'topic': 'AI|artificial intelligence|future|technology|law'}, {'slug': 'design-and-creativity', 'title': 'Design, Creativity, and Art', 'description': 'A set of design and creativity talks for teams planning a workshop.', 'topic': 'design|creativity|art|architecture|innovation'}, {'slug': 'climate-nature-conservation', 'title': 'Climate, Nature, and Conservation', 'description': 'Talks about conservation, clean energy, oceans, animals, and climate action.', 'topic': 'nature|climate change|renewable energy|conservation|ocean|animals|wildlife'}, {'slug': 'health-science-body', 'title': 'Health, Science, and the Body', 'description': 'Science and medicine talks with practical questions for public health.', 'topic': 'health|health care|medicine|disease|biology|science'}, {'slug': 'culture-democracy-stories', 'title': 'Culture, Democracy, and Stories', 'description': 'Talks about culture, rights, media, storytelling, and civic life.', 'topic': 'culture|democracy|government|media|storytelling|society|social change'}, {'slug': 'work-business-leadership', 'title': 'Work, Business, and Leadership', 'description': 'Talks about leadership, organizations, money, careers, and decision-making.', 'topic': 'business|work|leadership|money|finance|economics'}, {'slug': 'music-performance-art', 'title': 'Music, Performance, and Art', 'description': 'Performances and creative talks for audiences comparing style, culture, and sound.', 'topic': 'music|performance|dance|sound|art'}] + +EVENTS = [{'slug': 'ted-countdown-summit-2025', 'name': 'TED Countdown Summit 2025', 'city': 'Nairobi', 'month': 'June 2025', 'track': 'Community', 'capacity': 500}, {'slug': 'ted-explains-the-world-with-ian-bremmer', 'name': 'TED Explains the World with Ian Bremmer', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 570}, {'slug': 'ted-membership', 'name': 'TED Membership', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 640}, {'slug': 'ted-originals', 'name': 'TED Originals', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 710}, {'slug': 'ted-talks-daily-book-club', 'name': 'TED Talks Daily Book Club', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 780}, {'slug': 'ted2026', 'name': 'TED2026', 'city': 'Vancouver', 'month': 'April 2026', 'track': 'Flagship', 'capacity': 850}, {'slug': 'ted-bcg', 'name': 'TED@BCG', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 920}, {'slug': 'tedai-san-francisco', 'name': 'TEDAI San Francisco', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 990}, {'slug': 'tedai-vienna-2025', 'name': 'TEDAI Vienna 2025', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 1060}, {'slug': 'tedcountdown-bloomberggreenfestival', 'name': 'TEDCountdown@BloombergGreenFestival', 'city': 'Nairobi', 'month': 'June 2025', 'track': 'Community', 'capacity': 1130}, {'slug': 'tednext-2025', 'name': 'TEDNext 2025', 'city': 'Atlanta', 'month': 'November 2025', 'track': 'Community', 'capacity': 1200}, {'slug': 'tedxesmtberlin', 'name': 'TEDxESMTBerlin', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1270}, {'slug': 'tedxmanchester', 'name': 'TEDxManchester', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1340}, {'slug': 'tedxmidatlantic', 'name': 'TEDxMidAtlantic', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1410}, {'slug': 'tedxmilehigh', 'name': 'TEDxMileHigh', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1480}, {'slug': 'tedxnova', 'name': 'TEDxNoVA', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1550}, {'slug': 'tedxrva-youth', 'name': 'TEDxRVA Youth', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1620}] diff --git a/sites/ted/static/css/.gitkeep b/sites/ted/static/css/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/sites/ted/static/css/main.css b/sites/ted/static/css/main.css new file mode 100644 index 00000000..eb91f6a8 --- /dev/null +++ b/sites/ted/static/css/main.css @@ -0,0 +1,99 @@ +:root { + --red: #eb0028; + --ink: #111; + --muted: #5f6268; + --line: #dedede; + --soft: #f7f7f7; +} +* { box-sizing: border-box; } +body { margin: 0; font-family: Arial, Helvetica, sans-serif; color: var(--ink); background: #fff; } +a { color: inherit; text-decoration: none; } +img { display: block; width: 100%; object-fit: cover; } +button, .button { border: 0; background: #111; color: #fff; padding: 11px 16px; font-weight: 700; cursor: pointer; } +input, select { border: 1px solid var(--line); padding: 11px 12px; font: inherit; width: 100%; } + +.topbar { position: sticky; top: 0; z-index: 5; display: grid; grid-template-columns: auto auto minmax(240px, 1fr) auto; gap: 24px; align-items: center; padding: 0 28px; min-height: 64px; background: #fff; border-bottom: 1px solid var(--line); } +.brand { display: flex; align-items: baseline; gap: 12px; } +.brand span { color: var(--red); font-size: 34px; font-weight: 900; letter-spacing: 0; } +.brand small { color: var(--muted); font-size: 13px; white-space: nowrap; } +nav, .auth { display: flex; gap: 18px; align-items: center; font-size: 13px; font-weight: 700; text-transform: uppercase; } +.join { color: var(--red); } +.quick-search { display: flex; gap: 8px; } +.quick-search button { background: var(--red); } +.flashes { max-width: 1180px; margin: 16px auto 0; padding: 0 24px; } +.flash { padding: 12px 14px; background: #f0f4ff; border-left: 4px solid #3b63d1; } +.flash.error { background: #fff0f1; border-color: var(--red); } +.flash.success { background: #effaf2; border-color: #138a37; } + +main { min-height: 68vh; } +.hero { display: grid; grid-template-columns: minmax(280px, 0.9fr) minmax(340px, 1.1fr); gap: 48px; align-items: center; max-width: 1180px; margin: 0 auto; padding: 56px 24px 36px; } +.hero h1, .page-head h1 { margin: 0; font-size: clamp(42px, 7vw, 86px); line-height: 0.93; letter-spacing: 0; } +.hero p { max-width: 560px; color: var(--muted); font-size: 18px; line-height: 1.5; } +.eyebrow { margin: 0 0 12px; color: var(--red); font-size: 13px; font-weight: 800; text-transform: uppercase; } +.hero-actions { display: flex; gap: 12px; margin-top: 26px; } +.button { display: inline-flex; align-items: center; background: #111; } +.button.primary { background: var(--red); } +.lead-card { border-bottom: 4px solid var(--red); background: var(--soft); } +.lead-card img { aspect-ratio: 16 / 9; } +.lead-card span, .lead-card h2, .lead-card p { display: block; margin-left: 20px; margin-right: 20px; } +.lead-card span { margin-top: 18px; color: var(--red); font-size: 13px; font-weight: 800; text-transform: uppercase; } +.lead-card h2 { margin-top: 8px; margin-bottom: 10px; font-size: 28px; line-height: 1.05; } +.lead-card p { margin-bottom: 22px; color: var(--muted); } + +.band, .split, .page-head, .topic-grid, .detail-hero, .auth-page { max-width: 1180px; margin: 0 auto; padding: 36px 24px; } +.section-head { display: flex; justify-content: space-between; align-items: center; gap: 16px; margin-bottom: 18px; } +.section-head h2, article h2, aside h2, .panel h2 { margin: 0; font-size: 24px; } +.section-head a { color: var(--red); font-weight: 700; } +.grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 22px; } +.talk-card { border-top: 1px solid var(--line); background: #fff; } +.talk-card img { aspect-ratio: 16 / 9; background: #ddd; } +.card-body { padding: 14px 0; } +.meta { color: var(--red); font-size: 12px; font-weight: 800; text-transform: uppercase; } +.talk-card h3 { margin: 8px 0; font-size: 20px; line-height: 1.12; } +.talk-card p { margin: 0 0 10px; color: var(--muted); } +.chips { display: flex; flex-wrap: wrap; gap: 7px; } +.chips span, .chips a { display: inline-flex; padding: 6px 9px; background: var(--soft); color: #333; font-size: 12px; } + +.split { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; } +.list { display: grid; gap: 8px; } +.row-link { display: grid; gap: 4px; padding: 14px 0; border-bottom: 1px solid var(--line); } +.row-link span { color: var(--muted); line-height: 1.35; } +.page-head { display: grid; gap: 14px; border-bottom: 1px solid var(--line); } +.page-head p { max-width: 720px; color: var(--muted); } +.filters { display: grid; grid-template-columns: minmax(220px, 1fr) 180px auto; gap: 12px; max-width: 720px; } + +.detail-hero { display: grid; grid-template-columns: minmax(360px, 1.08fr) minmax(300px, 0.92fr); gap: 38px; align-items: start; } +.detail-hero img { aspect-ratio: 16 / 9; } +.detail-hero h1 { margin: 0 0 10px; font-size: clamp(34px, 5vw, 64px); line-height: 0.98; } +.speaker { color: var(--muted); font-size: 20px; } +.stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin: 24px 0; } +.stats div { border-top: 3px solid #111; padding-top: 8px; } +.stats dt { color: var(--muted); font-size: 12px; text-transform: uppercase; } +.stats dd { margin: 4px 0 0; font-weight: 800; } +.save-form { display: grid; grid-template-columns: 1fr auto; gap: 10px; } + +.topic-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; } +.topic-grid a, .topic-grid article { display: grid; gap: 8px; min-height: 130px; padding: 20px; background: var(--soft); border-top: 3px solid var(--red); } +.topic-grid strong { font-size: 22px; } +.topic-grid span, .topic-grid p { color: var(--muted); margin: 0; } +.panel { display: grid; gap: 14px; padding: 24px; background: var(--soft); } +.panel label { display: grid; gap: 6px; font-weight: 700; } +.auth-page { display: grid; justify-content: center; } +.auth-page .panel { width: min(440px, calc(100vw - 48px)); } +.footer { margin-top: 36px; padding: 28px; display: flex; justify-content: space-between; gap: 28px; border-top: 1px solid var(--line); background: #111; color: #fff; } +.footer p { color: #c9c9c9; } +.topic-strip { display: flex; flex-wrap: wrap; gap: 10px; justify-content: flex-end; max-width: 620px; } +.topic-strip a { color: #fff; border: 1px solid #555; padding: 7px 9px; } + +@media (max-width: 900px) { + .topbar { grid-template-columns: 1fr; gap: 12px; padding: 14px 18px; } + nav, .auth { flex-wrap: wrap; } + .hero, .split, .detail-hero { grid-template-columns: 1fr; } + .grid, .topic-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .filters, .save-form { grid-template-columns: 1fr; } + .footer { display: grid; } +} +@media (max-width: 560px) { + .grid, .topic-grid, .stats { grid-template-columns: 1fr; } + .hero h1, .page-head h1 { font-size: 42px; } +} diff --git a/sites/ted/static/icons/.gitkeep b/sites/ted/static/icons/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/sites/ted/static/js/.gitkeep b/sites/ted/static/js/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/sites/ted/tasks.jsonl b/sites/ted/tasks.jsonl new file mode 100644 index 00000000..58c7f55a --- /dev/null +++ b/sites/ted/tasks.jsonl @@ -0,0 +1,18 @@ +{"web_name": "TED", "id": "TED--0", "ques": "Search for talks about AI and open the Anil Seth talk. What is the talk duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--1", "ques": "Find a TED2026 talk about driverless cars and save it to Alice Johnson's account with the note 'mobility planning'.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--2", "ques": "Browse the design topic and identify a talk from TEDNext 2025 that is shorter than 10 minutes.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--3", "ques": "Open the climate and nature playlist and name one talk recorded at the TED Countdown Summit 2025.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--4", "ques": "Log in as alice.j@test.com and change the newsletter topic to conservation.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--5", "ques": "Find the talk by Malala Yousafzai and list two topics attached to it.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--6", "ques": "Search for 'clean energy' and open the result by Kimiko Hirata. What event is it from?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--7", "ques": "Register interest in the TED Countdown Summit 2025 event while logged in as Alice Johnson.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--8", "ques": "Compare the talks by Alexi Pappas and Debbie Millman. Which one is shorter?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--9", "ques": "Find a talk about Parkinson's and save it to the current account with a note for public health review.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--10", "ques": "Open the AI, Society, and the Future playlist. Which included talk discusses a Supreme Court case?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--11", "ques": "Use filters to find TED2026 talks under 10 minutes and open the talk by Maya Higa.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--12", "ques": "Log in as alice.j@test.com and remove one saved talk that is not about AI from the account page.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--13", "ques": "Find the topic page for science and identify a TEDx talk about wine tasting.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--14", "ques": "Search for 'architecture 3D printing' and open the matching talk. Who is the speaker?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--15", "ques": "Find two talks in the music topic and determine which has more views.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--16", "ques": "Create a new account, save the Peter Steinberger AI agent talk, then confirm it appears under saved talks.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the city for the TEDNext 2025 event.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} diff --git a/sites/ted/templates/.gitkeep b/sites/ted/templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/sites/ted/templates/_talk_card.html b/sites/ted/templates/_talk_card.html new file mode 100644 index 00000000..50705bb5 --- /dev/null +++ b/sites/ted/templates/_talk_card.html @@ -0,0 +1,13 @@ + diff --git a/sites/ted/templates/account.html b/sites/ted/templates/account.html new file mode 100644 index 00000000..0ab7441e --- /dev/null +++ b/sites/ted/templates/account.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} +{% block content %} +
+

Account

+

{{ user.display_name }}

+
+
+
+

Profile

+ + + + + +
+
+

Event registrations

+ {% for reg in registrations %} + + {% else %} +

No event registrations yet.

+ {% endfor %} +
+
+
+

Saved talks

+
+ {% for saved_item in saved %} + + {% else %} +

No saved talks yet.

+ {% endfor %} +
+
+{% endblock %} diff --git a/sites/ted/templates/base.html b/sites/ted/templates/base.html new file mode 100644 index 00000000..4b1e669a --- /dev/null +++ b/sites/ted/templates/base.html @@ -0,0 +1,57 @@ + + + + + + {% block title %}TED: Ideas change everything{% endblock %} + + + +
+ TEDIdeas change everything + + +
+ {% if current_user %} + {{ current_user.display_name }} + Log out + {% else %} + Log in + Join + {% endif %} +
+
+ + {% with messages = get_flashed_messages(with_categories=true) %} + {% if messages %} +
+ {% for category, message in messages %} +
{{ message }}
+ {% endfor %} +
+ {% endif %} + {% endwith %} + +
{% block content %}{% endblock %}
+ +
+
+ TED +

A local WebHarbor mirror for talks, topics, playlists, and event workflows.

+
+
+ {% for topic in nav_topics %} + {{ topic }} + {% endfor %} +
+
+ + diff --git a/sites/ted/templates/events.html b/sites/ted/templates/events.html new file mode 100644 index 00000000..f52cd9be --- /dev/null +++ b/sites/ted/templates/events.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} +{% block content %} +
+

Attend

+

Events

+
+
+ {% for event in events %} +
+ {{ event.name }} + {{ event.city }} - {{ event.month }} - {{ event.track }} +

{{ event.capacity }} seats

+
+ + +
+
+ {% endfor %} +
+{% endblock %} diff --git a/sites/ted/templates/index.html b/sites/ted/templates/index.html new file mode 100644 index 00000000..28517698 --- /dev/null +++ b/sites/ted/templates/index.html @@ -0,0 +1,58 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Newest from TED

+

Ideas change everything

+

Browse talks, save ideas to your account, compare speakers and topics, and register interest in TED events.

+ +
+ {% set lead = featured[0] %} + + + {{ lead.event }} +

{{ lead.title }}

+

{{ lead.speaker }}

+
+
+ +
+
+

Latest talks

+ See all +
+
+ {% for talk in featured %} + {% include "_talk_card.html" %} + {% endfor %} +
+
+ +
+ +
+

Curated playlists

+
+ {% for playlist in playlists %} + + {{ playlist.title }} + {{ playlist.description }} + + {% endfor %} +
+
+
+{% endblock %} diff --git a/sites/ted/templates/login.html b/sites/ted/templates/login.html new file mode 100644 index 00000000..151cafd2 --- /dev/null +++ b/sites/ted/templates/login.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Log in

+ + + +
+
+{% endblock %} diff --git a/sites/ted/templates/playlist_detail.html b/sites/ted/templates/playlist_detail.html new file mode 100644 index 00000000..8f4cd2b1 --- /dev/null +++ b/sites/ted/templates/playlist_detail.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} +{% block content %} +
+

Playlist

+

{{ playlist.title }}

+

{{ playlist.description }}

+
+
+
+ {% for link in links %} + {% set talk = link.talk %} + {% include "_talk_card.html" %} + {% endfor %} +
+
+{% endblock %} diff --git a/sites/ted/templates/playlists.html b/sites/ted/templates/playlists.html new file mode 100644 index 00000000..69ddf3b4 --- /dev/null +++ b/sites/ted/templates/playlists.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% block content %} +
+

Watch

+

Playlists

+
+
+ {% for playlist in playlists %} + {{ playlist.title }}{{ playlist.description }} + {% endfor %} +
+{% endblock %} diff --git a/sites/ted/templates/register.html b/sites/ted/templates/register.html new file mode 100644 index 00000000..60f1412e --- /dev/null +++ b/sites/ted/templates/register.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block content %} +
+
+

Create account

+ + + + + +
+
+{% endblock %} diff --git a/sites/ted/templates/search.html b/sites/ted/templates/search.html new file mode 100644 index 00000000..f8b91a50 --- /dev/null +++ b/sites/ted/templates/search.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% block title %}Search TED{% endblock %} +{% block content %} +
+

Search

+

{% if q %}Results for "{{ q }}"{% else %}Search TED{% endif %}

+
+
+
+ {% for talk in talks %} + {% include "_talk_card.html" %} + {% else %} +

Try a query such as AI, climate, design, science, democracy, or health.

+ {% endfor %} +
+
+{% endblock %} diff --git a/sites/ted/templates/talk_detail.html b/sites/ted/templates/talk_detail.html new file mode 100644 index 00000000..223145a5 --- /dev/null +++ b/sites/ted/templates/talk_detail.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} +{% block title %}{{ talk.title }} | TED{% endblock %} +{% block content %} +
+ +
+

{{ talk.event }} - {{ talk.talk_type }}

+

{{ talk.title }}

+

{{ talk.speaker }}

+

{{ talk.description }}

+
+
Duration
{{ talk.minutes }} minutes
+
Published
{{ talk.published_at|date_label }}
+
Views
{{ talk.views_label }}
+
+
+ + +
+
+
+
+
+

Transcript excerpt

+

{{ talk.transcript }}

+

Topics

+
+ {% for topic in talk.topics %}{{ topic }}{% endfor %} +
+
+ +
+{% endblock %} diff --git a/sites/ted/templates/talks.html b/sites/ted/templates/talks.html new file mode 100644 index 00000000..14e23a19 --- /dev/null +++ b/sites/ted/templates/talks.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{% block title %}TED Talks{% endblock %} +{% block content %} +
+

Watch

+

{% if topic %}Talks about {{ topic }}{% else %}TED Talks{% endif %}

+
+ + + {% if topic %}{% endif %} + +
+
+
+
+ {% for talk in talks %} + {% include "_talk_card.html" %} + {% else %} +

No talks matched those filters.

+ {% endfor %} +
+
+{% endblock %} diff --git a/sites/ted/templates/topics.html b/sites/ted/templates/topics.html new file mode 100644 index 00000000..4e2ad258 --- /dev/null +++ b/sites/ted/templates/topics.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% block content %} +
+

Discover

+

Topics

+
+
+ {% for topic, count in counts %} + {{ topic }}{{ count }} talks + {% endfor %} +
+{% endblock %} diff --git a/websyn_start.sh b/websyn_start.sh index 4d690d78..ae5dd0c2 100644 --- a/websyn_start.sh +++ b/websyn_start.sh @@ -1,11 +1,11 @@ #!/bin/bash -# WebSyn startup: launch all 16 mirror sites, then exec the original CMD. +# WebSyn startup: launch all 17 mirror sites, then exec the original CMD. # This preserves the base image's browser env server (port 8100) as PID 1. set -e SITES=(allrecipes amazon apple arxiv bbc_news booking github google_flights google_map google_search huggingface wolfram_alpha - cambridge_dictionary coursera espn merriam_webster) + cambridge_dictionary coursera espn merriam_webster ted) BASE_PORT=40000 PID_DIR=/tmp/websyn_pids mkdir -p "$PID_DIR" @@ -17,7 +17,7 @@ for d in "${SITES[@]}"; do cp -a "/opt/WebSyn/$d/instance_seed" "/opt/WebSyn/$d/instance" done -echo "[WebSyn] Starting 16 sites on ports ${BASE_PORT}-$((BASE_PORT + 15))..." +echo "[WebSyn] Starting 17 sites on ports ${BASE_PORT}-$((BASE_PORT + 16))..." for i in "${!SITES[@]}"; do site="${SITES[$i]}" port=$((BASE_PORT + i)) @@ -51,8 +51,8 @@ except Exception: exit(1) ready=$((ready + 1)) fi done - echo " [${elapsed}/${max_wait}s] ${ready}/16 sites ready" - if [ $ready -eq 16 ]; then + echo " [${elapsed}/${max_wait}s] ${ready}/17 sites ready" + if [ $ready -eq 17 ]; then break fi done @@ -78,6 +78,6 @@ done echo "[WebSyn] Starting control server on :8101 (PID 1)..." # Control server becomes PID 1 — receives SIGTERM on `docker stop`, -# keeps the container alive as long as it's running. The 16 site +# keeps the container alive as long as it's running. The site # subprocesses are managed via /tmp/websyn_pids/.pid. exec python3 /opt/control_server.py --port 8101 From ad303a9bf31e3e74ef0aaea882211e8e3c53cab5 Mon Sep 17 00:00:00 2001 From: shanjiaming Date: Sun, 21 Jun 2026 12:06:39 -0700 Subject: [PATCH 02/15] fix(ted): hide durations in listings --- sites/ted/templates/_talk_card.html | 2 +- sites/ted/templates/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sites/ted/templates/_talk_card.html b/sites/ted/templates/_talk_card.html index 50705bb5..dd8e09ab 100644 --- a/sites/ted/templates/_talk_card.html +++ b/sites/ted/templates/_talk_card.html @@ -2,7 +2,7 @@ {% if talk.image %}{% endif %}
-

{{ talk.event }} - {{ talk.minutes }} min

+

{{ talk.event }}

{{ talk.title }}

{{ talk.speaker }}

From 6945aa514caa694513324b2995253ba36b427278 Mon Sep 17 00:00:00 2001 From: shanjiaming Date: Thu, 2 Jul 2026 13:14:30 +0800 Subject: [PATCH 03/15] fix(ted): address review feedback --- .assets-revision | 2 +- sites/ted/app.py | 8 ++++---- sites/ted/seed_data.py | 4 ++-- sites/ted/tasks.jsonl | 10 +++++----- sites/ted/templates/_talk_card.html | 9 +++------ sites/ted/templates/base.html | 7 ++++--- sites/ted/templates/index.html | 6 +++--- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/.assets-revision b/.assets-revision index 5c22104e..6f9abfe6 100644 --- a/.assets-revision +++ b/.assets-revision @@ -5,4 +5,4 @@ # is a git revision (branch name like `main`, a tag, or a specific commit # sha). Override at runtime with the ASSETS_REVISION env var. repo: ChilleD/WebHarbor -revision: 54882a6a66a17a3e43455057e7c9e0d103cd8b81 +revision: 0126c722e74be5fb26b82471007feea3b439073d diff --git a/sites/ted/app.py b/sites/ted/app.py index 10cf72f5..65b2aa2b 100644 --- a/sites/ted/app.py +++ b/sites/ted/app.py @@ -136,8 +136,7 @@ def require_login(): @app.context_processor def inject_globals(): - topics = sorted({topic for talk in Talk.query.all() for topic in talk.topics}) - return {"current_user": current_user(), "nav_topics": topics[:10]} + return {"current_user": current_user()} @app.template_filter("date_label") @@ -158,8 +157,9 @@ def scored_talks(query, talks): return list(talks) ranked = [] for talk in talks: - text = " ".join([talk.title, talk.speaker, talk.event, talk.description, talk.transcript, " ".join(talk.topics)]).lower() - score = sum(1 for token in tokens if token in text) + text = " ".join([talk.title, talk.speaker, talk.event, talk.description, talk.transcript, " ".join(talk.topics)]) + text_tokens = set(tokenize(text)) + score = sum(1 for token in tokens if token in text_tokens) if score: ranked.append((score, talk.views, talk)) return [talk for _, _, talk in sorted(ranked, key=lambda item: (-item[0], -item[1]))] diff --git a/sites/ted/seed_data.py b/sites/ted/seed_data.py index 53b0e292..9df5ee9e 100644 --- a/sites/ted/seed_data.py +++ b/sites/ted/seed_data.py @@ -1,7 +1,7 @@ """Seed data for the TED WebHarbor mirror.""" -TALKS = [{'source_id': '178768', 'title': 'The wildlife sanctuary you can visit from anywhere', 'slug': 'maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere', 'speaker': 'Maya Higa', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 568, 'duration_minutes': 9, 'published_at': '2026-05-12', 'recorded_on': '2026-04-14', 'views': 150000, 'topics': ['media', 'social change', 'animals', 'nature', 'social media', 'internet', 'conservation', 'wildlife'], 'image': 'images/talk_001_maya-higa-the-wildlife-sanctuary-you-can-visit-f.jpg', 'canonical_url': 'https://www.ted.com/talks/maya_higa_the_wildlife_sanctuary_you_can_visit_from_anywhere', 'description': 'Creator Maya Higa is on a mission to use the internet to build the next generation of conservationists. Her virtual education center, Alveus Sanctuary, is one of the most-watched sanctuaries on Earth, with dozens of rescued animals and cameras livestreaming to a community of millions inspired to help protect the wildlife. Visit with Bean the Hawk, Winnie the Moo and more - and see what the future of conservation looks like.', 'transcript': 'Maya Higa opens by framing the central tension behind The wildlife sanctuary you can visit from anywhere. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178681', 'title': "Waymo's case for a driverless future", 'slug': 'tekedra-mawakana-sal-khan-waymo-s-case-for-a-driverless-future', 'speaker': 'Tekedra Mawakana, Sal Khan', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1154, 'duration_minutes': 19, 'published_at': '2026-05-11', 'recorded_on': '2026-04-15', 'views': 157919, 'topics': ['technology', 'future', 'society', 'driverless cars'], 'image': 'images/talk_002_tekedra-mawakana-sal-khan-waymo-s-case-for-a-dri.jpg', 'canonical_url': 'https://www.ted.com/talks/tekedra_mawakana_sal_khan_waymo_s_case_for_a_driverless_future', 'description': "What if we could solve the problem of fatal car accidents? Waymo co-CEO Tekedra Mawakana joins TED's Sal Khan to explore why fully autonomous vehicles (where you never have to touch the wheel) could end the dangerous status quo of traffic deaths. She makes the case for why self-driving cars are more than a tech novelty - they're an urgently needed upgrade that could make the world safer for everyone.", 'transcript': "Tekedra Mawakana, Sal Khan opens by framing the central tension behind Waymo's case for a driverless future. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177895', 'title': 'Why I love my bad days', 'slug': 'alexi-pappas-why-i-love-my-bad-days', 'speaker': 'Alexi Pappas', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 310, 'duration_minutes': 5, 'published_at': '2026-05-08', 'recorded_on': '2025-11-11', 'views': 6052, 'topics': ['psychology', 'philosophy', 'happiness', 'sports', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_003_alexi-pappas-why-i-love-my-bad-days.jpg', 'canonical_url': 'https://www.ted.com/talks/alexi_pappas_why_i_love_my_bad_days', 'description': "One month before the Rio Olympics, runner Alexi Pappas couldn't hit her splits in practice. She was begging her watch to change its mind. Then her coach told her to take it off - and shared the best advice she's ever received. That single piece of wisdom led her to break a national record and changed how she chases her goals, carrying her through ultramarathons, a memoir and three films. Bad days aren't a detour, she says - they mean you're right on track.", 'transcript': 'Alexi Pappas opens by framing the central tension behind Why I love my bad days. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178367', 'title': 'What really won the trillion-dollar Supreme Court case', 'slug': 'neal-kumar-katyal-what-really-won-the-trillion-dollar-supreme-court-case', 'speaker': 'Neal Kumar Katyal', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1091, 'duration_minutes': 18, 'published_at': '2026-05-07', 'recorded_on': '2026-04-17', 'views': 154312, 'topics': ['culture', 'ai', 'law', 'society', 'policy'], 'image': 'images/talk_004_neal-kumar-katyal-what-really-won-the-trillion-d.jpg', 'canonical_url': 'https://www.ted.com/talks/neal_kumar_katyal_what_really_won_the_trillion_dollar_supreme_court_case', 'description': "In November 2025, Neal Kumar Katyal was asked to do what no US Supreme Court litigator had ever done: convince the justices to strike down a sitting president's signature initiative. After enlisting the help of four unlikely coaches - and one secret weapon he hasn't told anyone about until now - he walked into the courtroom ready for anything. What he discovered about winning and connecting might just change how you think about performing under pressure.", 'transcript': 'Neal Kumar Katyal opens by framing the central tension behind What really won the trillion-dollar Supreme Court case. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '178175', 'title': 'The rising cost of dissent in America', 'slug': 'miles-taylor-the-rising-cost-of-dissent-in-america-may-2026', 'speaker': 'Miles Taylor', 'event': 'TEDxMidAtlantic', 'talk_type': 'TEDx Talk', 'duration_seconds': 1166, 'duration_minutes': 19, 'published_at': '2026-05-04', 'recorded_on': '2025-11-01', 'views': 154789, 'topics': ['politics', 'media', 'social change', 'united states', 'democracy', 'government'], 'image': 'images/talk_005_miles-taylor-the-rising-cost-of-dissent-in-ameri.jpg', 'canonical_url': 'https://www.ted.com/talks/miles_taylor_the_rising_cost_of_dissent_in_america_may_2026', 'description': "Former senior US national security official Miles Taylor shares a personal account that raises a broader civic concern: the growing cost of dissent in American public life. Drawing on his experience inside government and living the consequences of speaking openly, he says that the real threat to US democracy isn't the politicians or hard-liners - it's the two-thirds of Americans who don't speak up. (This talk contains mature language.)", 'transcript': 'Miles Taylor opens by framing the central tension behind The rising cost of dissent in America. The talk then connects evidence, lived experience, and examples from TEDxMidAtlantic. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178086', 'title': 'Why AI is unlikely to become conscious', 'slug': 'anil-seth-why-ai-is-unlikely-to-become-conscious', 'speaker': 'Anil Seth', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 897, 'duration_minutes': 15, 'published_at': '2026-05-01', 'recorded_on': '2026-04-16', 'views': 191682, 'topics': ['technology', 'future', 'brain', 'consciousness', 'ai'], 'image': 'images/talk_006_anil-seth-why-ai-is-unlikely-to-become-conscious.jpg', 'canonical_url': 'https://www.ted.com/talks/anil_seth_why_ai_is_unlikely_to_become_conscious', 'description': 'We see consciousness in AI the same way we see faces in clouds, says neuroscientist Anil Seth. He explores the all-too-human tendency to project inner life onto machines that are brilliant mimics, not sentient beings, and gives a definitive answer to the urgent question: Will AI ever gain consciousness?', 'transcript': 'Anil Seth opens by framing the central tension behind Why AI is unlikely to become conscious. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175757', 'title': 'Reimagining traditional architecture for modern needs', 'slug': 'riyad-joucka-reimagining-traditional-architecture-for-modern-needs', 'speaker': 'Riyad Joucka', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 492, 'duration_minutes': 8, 'published_at': '2026-04-30', 'recorded_on': '2025-10-23', 'views': 153822, 'topics': ['technology', 'design', 'architecture', 'urban planning', 'innovation', '3d printing'], 'image': 'images/talk_007_riyad-joucka-reimagining-traditional-architectur.jpg', 'canonical_url': 'https://www.ted.com/talks/riyad_joucka_reimagining_traditional_architecture_for_modern_needs', 'description': "Architect Riyad Joucka believes your home should be a mirror of who you are. Using 3D printing and ancient architectural wisdom, he's designing efficient, personal homes that respond to context, climate and culture without sacrificing character. He makes the case that we should start designing for people, not the market.", 'transcript': 'Riyad Joucka opens by framing the central tension behind Reimagining traditional architecture for modern needs. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176563', 'title': 'How to invite creativity into your life', 'slug': 'rose-b-simpson-debbie-millman-how-to-invite-creativity-into-your-life', 'speaker': 'Rose B. Simpson, Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1065, 'duration_minutes': 18, 'published_at': '2026-04-29', 'recorded_on': '2025-11-10', 'views': 170066, 'topics': ['culture', 'nature', 'creativity', 'art', 'storytelling', 'mindfulness'], 'image': 'images/talk_008_rose-b-simpson-debbie-millman-how-to-invite-crea.jpg', 'canonical_url': 'https://www.ted.com/talks/rose_b_simpson_debbie_millman_how_to_invite_creativity_into_your_life', 'description': 'What do you hear when you sit in silence? For artist Rose B. Simpson, that question is the beginning of all art. She comes from a line of ceramic artists stretching back generations and, as part of her multidisciplinary work, she also builds custom lowrider cars. (If that sounds like a contradiction, that\'s kind of the point.) In conversation with "Design Matters" podcast host Debbie Millman, Simpson invites you to find your own aesthetic - not by searching, but by listening.', 'transcript': 'Rose B. Simpson, Debbie Millman opens by framing the central tension behind How to invite creativity into your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175453', 'title': 'You got what you wanted. Now what?', 'slug': 'debbie-millman-you-got-what-you-wanted-now-what', 'speaker': 'Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 473, 'duration_minutes': 8, 'published_at': '2026-04-27', 'recorded_on': '2025-11-09', 'views': 190209, 'topics': ['design', 'creativity', 'personal growth'], 'image': 'images/talk_009_debbie-millman-you-got-what-you-wanted-now-what.jpg', 'canonical_url': 'https://www.ted.com/talks/debbie_millman_you_got_what_you_wanted_now_what', 'description': 'Over two decades of interviewing countless creative people, Debbie Millman (host of the iconic "Design Matters" podcast) had a realization: the pride and joy of accomplishing something often evaporates almost instantly. She explains how to stop chasing external validation for your achievements and instead live for the act of creation itself.', 'transcript': 'Debbie Millman opens by framing the central tension behind You got what you wanted. Now what?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177490', 'title': 'What Kosovo can teach the world about freedom', 'slug': 'vjosa-osmani-sadriu-what-kosovo-can-teach-the-world-about-freedom', 'speaker': 'Vjosa Osmani Sadriu', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1047, 'duration_minutes': 17, 'published_at': '2026-04-24', 'recorded_on': '2026-04-14', 'views': 176972, 'topics': ['politics', 'social change', 'leadership', 'democracy', 'government'], 'image': 'images/talk_010_vjosa-osmani-sadriu-what-kosovo-can-teach-the-wo.jpg', 'canonical_url': 'https://www.ted.com/talks/vjosa_osmani_sadriu_what_kosovo_can_teach_the_world_about_freedom', 'description': '"Truth is the real oxygen for democracy," says Vjosa Osmani Sadriu, the 6th President of the Republic of Kosovo. As a child of war, she once longed for someone to save her people. Now she\'s been in the rooms where decisions are made - and she\'s never forgotten what brought her there. In conversation with solutions journalist Angus Hervey, she reflects on what it takes to defend democracy in a world where truth itself is under threat. (Recorded on April 14, 2026)', 'transcript': 'Vjosa Osmani Sadriu opens by framing the central tension behind What Kosovo can teach the world about freedom. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177489', 'title': 'Beware the power of prediction', 'slug': 'carissa-veliz-beware-the-power-of-prediction', 'speaker': 'Carissa Veliz', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 728, 'duration_minutes': 12, 'published_at': '2026-04-23', 'recorded_on': '2026-04-14', 'views': 267371, 'topics': ['technology', 'future', 'ai', 'ethics'], 'image': 'images/talk_011_carissa-veliz-beware-the-power-of-prediction.jpg', 'canonical_url': 'https://www.ted.com/talks/carissa_veliz_beware_the_power_of_prediction', 'description': "What do the story of Oedipus and your insurance premiums have in common? They are both driven by self-fulfilling prophecies. Philosopher and TED Fellow Carissa Veliz traces the hidden power of prediction, from Roman emperors who banned prophets to the AI algorithms quietly making decisions about your life right now. We tend to associate predictions with knowledge, she says, but they're actually attempts to grab power. So the next time someone tells you a specific outcome is inevitable, remember: they aren't describing the future - they're selling it.", 'transcript': 'Carissa Veliz opens by framing the central tension behind Beware the power of prediction. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177096', 'title': 'The problem with billionaires - and the debut of True Net Worth', 'slug': 'randall-lane-the-problem-with-billionaires-and-the-debut-of-true-net-worth', 'speaker': 'Randall Lane', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 499, 'duration_minutes': 8, 'published_at': '2026-04-20', 'recorded_on': '2026-04-16', 'views': 221434, 'topics': ['culture', 'economics', 'philanthropy', 'society', 'money', 'finance'], 'image': 'images/talk_012_randall-lane-the-problem-with-billionaires-and-t.jpg', 'canonical_url': 'https://www.ted.com/talks/randall_lane_the_problem_with_billionaires_and_the_debut_of_true_net_worth', 'description': "As chief content officer of Forbes, Randall Lane oversees the magazine's signature list of billionaires, tracking the richest people on Earth. But he has noticed that this prompts the ultra-wealthy to stockpile their money instead of spending it on the public good. He debuts a new ranking - True Net Worth - that applauds billionaires for their philanthropy and rewards generosity. Guess who's in the top five?", 'transcript': 'Randall Lane opens by framing the central tension behind The problem with billionaires - and the debut of True Net Worth. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175050', 'title': 'A cheat sheet for accelerating clean energy', 'slug': 'kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy', 'speaker': 'Kimiko Hirata', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 586, 'duration_minutes': 10, 'published_at': '2026-04-20', 'recorded_on': '2025-06-18', 'views': 191819, 'topics': ['climate change', 'policy', 'countdown', 'renewable energy', 'fossil fuels'], 'image': 'images/talk_013_kimiko-hirata-a-cheat-sheet-for-accelerating-cle.jpg', 'canonical_url': 'https://www.ted.com/talks/kimiko_hirata_a_cheat_sheet_for_accelerating_clean_energy', 'description': 'After the Fukushima disaster shut down Japan\'s nuclear reactors, the coal industry rushed in to fill the energy gap. As climate advocate Kimiko Hirata watched dozens of new coal plant proposals quietly surface across the country - each one locking in decades of future emissions - she resolved to make them impossible to ignore. She shares how a small, scrappy civil society movement took on a fossil-fuel-dependent economy and got people to say "yes" to a renewable future.', 'transcript': 'Kimiko Hirata opens by framing the central tension behind A cheat sheet for accelerating clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176964', 'title': 'How I created OpenClaw, the breakthrough AI agent', 'slug': 'peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent', 'speaker': 'Peter Steinberger', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1055, 'duration_minutes': 18, 'published_at': '2026-04-17', 'recorded_on': '2026-04-16', 'views': 551544, 'topics': ['technology', 'computers', 'ai', 'internet', 'machine learning', 'artificial intelligence'], 'image': 'images/talk_014_peter-steinberger-how-i-created-openclaw-the-bre.jpg', 'canonical_url': 'https://www.ted.com/talks/peter_steinberger_how_i_created_openclaw_the_breakthrough_ai_agent', 'description': 'OpenClaw creator Peter Steinberger takes us back to the transformative moment he let his AI agent loose on the internet, igniting one of the world\'s fastest-growing open-source projects. He makes a fascinating (and slightly unnerving) case that agents are a real shift, not just better versions of chatbots, and explores how they might reshape your ability to work, build and create. "The lobster is loose, and it\'s not going back into the tank," he says. (Followed by a brief Q&A with TED Chairman Chris Anderson)', 'transcript': 'Peter Steinberger opens by framing the central tension behind How I created OpenClaw, the breakthrough AI agent. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176887', 'title': 'A plan to stop AI from automating our decline', 'slug': 'gina-raimondo-a-plan-to-stop-ai-from-automating-our-decline', 'speaker': 'Gina Raimondo', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 951, 'duration_minutes': 16, 'published_at': '2026-04-16', 'recorded_on': '2026-04-14', 'views': 229795, 'topics': ['politics', 'technology', 'business', 'social change', 'work', 'ai'], 'image': 'images/talk_015_gina-raimondo-a-plan-to-stop-ai-from-automating-.jpg', 'canonical_url': 'https://www.ted.com/talks/gina_raimondo_a_plan_to_stop_ai_from_automating_our_decline', 'description': 'The United States is on track to win the AI race - and hollow itself out in the process, says Gina Raimondo, former Governor of Rhode Island and US Secretary of Commerce. In this unflinching look at the threat of AI-induced economic disruption and social unrest, she offers a concrete blueprint to prepare workers for what\'s coming next. "AI is a 100-year technology and needs a 100-year response," she says. Is America up to the challenge?', 'transcript': 'Gina Raimondo opens by framing the central tension behind A plan to stop AI from automating our decline. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175041', 'title': 'East African sound meets cosmic trap', 'slug': 'akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap', 'speaker': 'Akoth Jumadi and Mr. Lu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 483, 'duration_minutes': 8, 'published_at': '2026-04-15', 'recorded_on': '2025-06-18', 'views': 2781, 'topics': ['music', 'performance', 'africa', 'art', 'sound'], 'image': 'images/talk_016_akoth-jumadi-and-mr-lu-east-african-sound-meets-.jpg', 'canonical_url': 'https://www.ted.com/talks/akoth_jumadi_and_mr_lu_east_african_sound_meets_cosmic_trap', 'description': 'Kenyan music duo Akoth Jumadi and MR. LU* fuse tribal roots with cosmic trap and celestial R&B, creating a hypnotic sound where ancient rhythms meet the future.', 'transcript': 'Akoth Jumadi and Mr. Lu opens by framing the central tension behind East African sound meets cosmic trap. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176566', 'title': 'What I got wrong about changing the world', 'slug': 'malala-yousafzai-what-i-got-wrong-about-changing-the-world', 'speaker': 'Malala Yousafzai', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 703, 'duration_minutes': 12, 'published_at': '2026-04-14', 'recorded_on': '2026-04-14', 'views': 349363, 'topics': ['education', 'social change', 'activism', 'middle east', 'human rights'], 'image': 'images/talk_017_malala-yousafzai-what-i-got-wrong-about-changing.jpg', 'canonical_url': 'https://www.ted.com/talks/malala_yousafzai_what_i_got_wrong_about_changing_the_world', 'description': "Malala Yousafzai has spent her life advocating for girls' education - surviving an assassination attempt at 15, meeting with world leaders and then watching hard-won progress collapse when Afghanistan fell to the Taliban in 2021. That moment of despair forced her to completely rethink what it means to create change, and what she discovered replaced her shattered optimism with something more powerful and more honest. Hear how to keep fighting for the future you want, even when hope feels lost.", 'transcript': 'Malala Yousafzai opens by framing the central tension behind What I got wrong about changing the world. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174201', 'title': 'Amman, Jordan', 'slug': 'ted-idea-search-amman-jordan', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2610, 'duration_minutes': 44, 'published_at': '2026-04-09', 'recorded_on': '2026-04-09', 'views': 23418, 'topics': ['social change'], 'image': 'images/talk_018_ted-idea-search-amman-jordan.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_amman_jordan', 'description': "The TED Idea Search wraps up in Amman, Jordan, in a 2,000-year-old Roman amphitheater and in front of a crowd of 4,000. What unfolds inside those stone walls is something the series hasn't quite seen before: speakers shaped by the weight of living in a region the world tends to define for itself. From a mountaineer who turned grief into motivation to a therapist rewriting the Arab world's language around mental health, the final city makes the strongest case yet that the best ideas can come from anywhere.", 'transcript': 'TED Idea Search opens by framing the central tension behind Amman, Jordan. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175828', 'title': 'A musical journey through Turkana', 'slug': 'turkana-sessions-a-musical-journey-through-turkana', 'speaker': 'Turkana Sessions', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 401, 'duration_minutes': 7, 'published_at': '2026-04-09', 'recorded_on': '2025-06-16', 'views': 4223, 'topics': ['music', 'performance', 'africa'], 'image': 'images/talk_019_turkana-sessions-a-musical-journey-through-turka.jpg', 'canonical_url': 'https://www.ted.com/talks/turkana_sessions_a_musical_journey_through_turkana', 'description': 'The genre-defying band Turkana Sessions takes us on a musical tour through the soundscape of northwest Kenya, with Elizabeth Korkel singing and Eddie Grey shredding on guitar.', 'transcript': 'Turkana Sessions opens by framing the central tension behind A musical journey through Turkana. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175296', 'title': "A whale's-eye-view of the ocean", 'slug': 'eric-stackpole-a-whale-s-eye-view-of-the-ocean', 'speaker': 'Eric Stackpole', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 311, 'duration_minutes': 5, 'published_at': '2026-04-08', 'recorded_on': '2025-11-11', 'views': 193174, 'topics': ['science', 'technology', 'animals', 'exploration', 'ocean'], 'image': 'images/talk_020_eric-stackpole-a-whale-s-eye-view-of-the-ocean.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_stackpole_a_whale_s_eye_view_of_the_ocean', 'description': "A hand-built camera with suction cups captured something no one had ever seen: two sperm whales communicating and swimming together in the deep ocean. Engineer Eric Stackpole shares the story of how a scrappy, DIY tool revealed this intimate glimpse into the lives of these giants - and makes the case that the only limit to what we can discover is what we're curious enough to explore.", 'transcript': "Eric Stackpole opens by framing the central tension behind A whale's-eye-view of the ocean. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175934', 'title': 'The art and science of wine tasting', 'slug': 'qian-janice-wang-the-art-and-science-of-wine-tasting', 'speaker': 'Qian Janice Wang', 'event': 'TEDxNoVA', 'talk_type': 'TEDx Talk', 'duration_seconds': 919, 'duration_minutes': 15, 'published_at': '2026-04-07', 'recorded_on': '2025-10-10', 'views': 181481, 'topics': ['science', 'food', 'brain'], 'image': 'images/talk_021_qian-janice-wang-the-art-and-science-of-wine-tas.jpg', 'canonical_url': 'https://www.ted.com/talks/qian_janice_wang_the_art_and_science_of_wine_tasting', 'description': "No two people taste wine the same way, and science is starting to show us why. Sensory scientist Qian Janice Wang explores why experts and beginners experience complexity so differently - revealing that what makes a wine great may have less to do with what's in the glass and more to do with what's happening in your brain.", 'transcript': 'Qian Janice Wang opens by framing the central tension behind The art and science of wine tasting. The talk then connects evidence, lived experience, and examples from TEDxNoVA. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '171659', 'title': 'The accidental brilliance of makeshift signs', 'slug': 'kate-canales-the-accidental-brilliance-of-makeshift-signs', 'speaker': 'Kate Canales', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 466, 'duration_minutes': 8, 'published_at': '2026-04-06', 'recorded_on': '2025-11-11', 'views': 203431, 'topics': ['culture', 'technology', 'design', 'creativity', 'art', 'humor', 'society'], 'image': 'images/talk_022_kate-canales-the-accidental-brilliance-of-makesh.jpg', 'canonical_url': 'https://www.ted.com/talks/kate_canales_the_accidental_brilliance_of_makeshift_signs', 'description': "What happens when the design of everyday things misses the mark? People fill in the blanks. Designer Kate Canales has spent more than 20 years photographing the handmade, improvised signs that appear when the original falls short. From perplexing bathroom directions to our struggles with doors and point-of-sale machines, her photos capture something technology can't replace: our instinct to look out for each other and leave a few instructions behind.", 'transcript': 'Kate Canales opens by framing the central tension behind The accidental brilliance of makeshift signs. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175830', 'title': "The nurse who can smell Parkinson's", 'slug': 'joy-milne-the-nurse-who-can-smell-parkinson-s', 'speaker': 'Joy Milne', 'event': 'TEDxManchester', 'talk_type': 'TEDx Talk', 'duration_seconds': 1077, 'duration_minutes': 18, 'published_at': '2026-04-03', 'recorded_on': '2023-03-04', 'views': 203929, 'topics': ['science', 'innovation', 'disease', 'health', 'health care', 'biology', 'medicine'], 'image': 'images/talk_023_joy-milne-the-nurse-who-can-smell-parkinson-s.jpg', 'canonical_url': 'https://www.ted.com/talks/joy_milne_the_nurse_who_can_smell_parkinson_s', 'description': "What does Parkinson's smell like? Ask nurse Joy Milne. Born with a hypersensitive nose, she spent a lifetime learning to recognize diseases through their scents. When she smelled Parkinson's on her husband years before his diagnosis, she decided to put her gift to the test. Today, her extraordinary nose has been translated into a non-invasive test - helping researchers diagnose what was right under their noses all along.", 'transcript': "Joy Milne opens by framing the central tension behind The nurse who can smell Parkinson's. The talk then connects evidence, lived experience, and examples from TEDxManchester. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174199', 'title': 'Buenos Aires, Argentina', 'slug': 'ted-idea-search-buenos-aires-argentina', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2561, 'duration_minutes': 43, 'published_at': '2026-04-02', 'recorded_on': '2026-04-02', 'views': 31212, 'topics': ['social change'], 'image': 'images/talk_024_ted-idea-search-buenos-aires-argentina.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_buenos_aires_argentina', 'description': 'The TED Idea Search arrives in Buenos Aires, a city with a fierce intellectual tradition, as 10 speakers deliver talks in a stunning warehouse that\'s home to the city\'s iconic opera sets, competing for a chance to speak on the TED main stage. Watch as a Gen Z voice reframes "brain rot" as a secret diplomatic tool and a surgeon explores the future of robotic medicine, reminding us why the human touch still matters - and much more. Choosing just one to represent Buenos Aires to the world turns out to be one of the hardest decisions yet.', 'transcript': 'TED Idea Search opens by framing the central tension behind Buenos Aires, Argentina. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175297', 'title': "I let DaddyGPT parent my kids. Here's what I learned", 'slug': 'stephen-remedios-i-let-daddygpt-parent-my-kids-here-s-what-i-learned', 'speaker': 'Stephen Remedios', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-04-02', 'recorded_on': '2025-10-23', 'views': 201276, 'topics': ['technology', 'parenting', 'ai', 'kids'], 'image': 'images/talk_025_stephen-remedios-i-let-daddygpt-parent-my-kids-h.jpg', 'canonical_url': 'https://www.ted.com/talks/stephen_remedios_i_let_daddygpt_parent_my_kids_here_s_what_i_learned', 'description': "As the world races toward digital perfection, tech humanist Stephen Remedios tried to optimize the messiest and most imperfect of all human work: parenting. He shares the story of DaddyGPT, a digital version of himself built to help raise his kids - until they began to prefer it over him. What unfolds is a personal look at the limits of AI, and a reminder that what matters most isn't getting it right every time but showing up with the authentic imperfection only humans have.", 'transcript': "Stephen Remedios opens by framing the central tension behind I let DaddyGPT parent my kids. Here's what I learned. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175452', 'title': 'A brilliant blend of ballet, hip-hop and African dance', 'slug': 'ghetto-classics-dance-a-brilliant-blend-of-ballet-hip-hop-and-african-dance', 'speaker': 'Ghetto Classics Dance', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 434, 'duration_minutes': 7, 'published_at': '2026-04-01', 'recorded_on': '2025-06-17', 'views': 3772, 'topics': ['performance', 'africa', 'art', 'dance', 'countdown'], 'image': 'images/talk_026_ghetto-classics-dance-a-brilliant-blend-of-balle.jpg', 'canonical_url': 'https://www.ted.com/talks/ghetto_classics_dance_a_brilliant_blend_of_ballet_hip_hop_and_african_dance', 'description': "Watch the performers of Ghetto Classics Dance light up the stage with a breathtaking fusion of traditional African dance, classical ballet and modern hip-hop. Founded in Korogocho, one of Nairobi's most under-resourced neighborhoods, this community-driven program empowers dancers through intensive training and mentorship.", 'transcript': 'Ghetto Classics Dance opens by framing the central tension behind A brilliant blend of ballet, hip-hop and African dance. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175374', 'title': '5 practical ways to take control of your life', 'slug': 'jim-vandehei-5-practical-ways-to-take-control-of-your-life', 'speaker': 'Jim VandeHei', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 654, 'duration_minutes': 11, 'published_at': '2026-03-31', 'recorded_on': '2025-11-11', 'views': 243174, 'topics': ['leadership', 'success', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_027_jim-vandehei-5-practical-ways-to-take-control-of.jpg', 'canonical_url': 'https://www.ted.com/talks/jim_vandehei_5_practical_ways_to_take_control_of_your_life', 'description': 'You can\'t control the world - but you can control you. That\'s the mantra that took Axios CEO Jim VandeHei, a once "unremarkably unremarkable 20-year-old," all the way to launching companies and interviewing presidents. He breaks down a career\'s worth of observations into five deceptively simple things you can control, and explores why mastering them can change the trajectory of your life.', 'transcript': 'Jim VandeHei opens by framing the central tension behind 5 practical ways to take control of your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175298', 'title': 'Stress resets, the ultimate mental health hack', 'slug': 'jenny-taitz-stress-resets-the-ultimate-mental-health-hack', 'speaker': 'Jenny Taitz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 630, 'duration_minutes': 10, 'published_at': '2026-03-30', 'recorded_on': '2025-11-10', 'views': 263345, 'topics': ['science', 'psychology', 'relationships', 'personal growth', 'mental health', 'emotions'], 'image': 'images/talk_028_jenny-taitz-stress-resets-the-ultimate-mental-he.jpg', 'canonical_url': 'https://www.ted.com/talks/jenny_taitz_stress_resets_the_ultimate_mental_health_hack', 'description': 'Stress is contagious - but so is calm. Psychologist Jenny Taitz explains why one stressful moment tends to snowball into the next, and shares small, immediate resets you can practice anywhere to break the spiral before it starts.', 'transcript': 'Jenny Taitz opens by framing the central tension behind Stress resets, the ultimate mental health hack. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174198', 'title': 'Chicago, USA', 'slug': 'ted-idea-search-chicago-usa', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2769, 'duration_minutes': 46, 'published_at': '2026-03-27', 'recorded_on': '2026-03-27', 'views': 28577, 'topics': ['social change'], 'image': 'images/talk_029_ted-idea-search-chicago-usa.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_chicago_usa', 'description': 'In the Windy City, 10 Chicagoans step onto the iconic red circle, each with six minutes to prove they have an idea that could change everything. Among them: a chemist who believes we can deploy precision medicine to save endangered species, a journalist creating tools to navigate difficult conversations and a runner challenging the narrative of a divided city by exploring every one of its streets. The stakes are personal, the competition is fierce - and one speaker will earn the chance to take their idea to the main stage at TED in Vancouver.', 'transcript': 'TED Idea Search opens by framing the central tension behind Chicago, USA. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175334', 'title': 'Why the world is still not built for women', 'slug': 'virginia-santy-why-the-world-is-still-not-built-for-women', 'speaker': 'Virginia Santy', 'event': 'TEDxMileHigh', 'talk_type': 'TEDx Talk', 'duration_seconds': 804, 'duration_minutes': 13, 'published_at': '2026-03-26', 'recorded_on': '2022-11-12', 'views': 214046, 'topics': ['design', 'cities', 'urban planning', 'social change', 'women', 'tedx', 'feminism'], 'image': 'images/talk_030_virginia-santy-why-the-world-is-still-not-built-.jpg', 'canonical_url': 'https://www.ted.com/talks/virginia_santy_why_the_world_is_still_not_built_for_women', 'description': 'Design consultant Virginia Santy set out to create an office space built specifically for women, flipping the script on the subtle (and not-so-subtle) ways that workplaces and cities still fail them. The results were striking: greater productivity, deeper collaboration and an environment where women felt genuinely valued, leading her to ask a simple question: What would the world look like if we designed with women in mind?', 'transcript': 'Virginia Santy opens by framing the central tension behind Why the world is still not built for women. The talk then connects evidence, lived experience, and examples from TEDxMileHigh. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174197', 'title': 'Singapore', 'slug': 'ted-idea-search-singapore', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 0, 'duration_minutes': 1, 'published_at': '2026-03-25', 'recorded_on': '2026-03-25', 'views': 23267, 'topics': ['social change'], 'image': 'images/talk_031_ted-idea-search-singapore.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_singapore', 'description': "The TED Idea Search touches down in Singapore, where eight speakers compete for an extraordinary prize. From a diver-turned-ocean-restorer reviving dead coral reefs to a scientist growing sustainable building materials out of fungus and a government insider reimagining public institutions, the ideas are as diverse as the Lion City itself. As TED's coaches push each speaker to transform their thinking into a powerful narrative, nerves rise, breakthroughs emerge and one speaker earns the opportunity to share their idea on the global stage.", 'transcript': 'TED Idea Search opens by framing the central tension behind Singapore. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174672', 'title': 'My bank called in the middle of my TED Talk', 'slug': 'mike-albo-my-bank-called-in-the-middle-of-my-ted-talk', 'speaker': 'Mike Albo', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 344, 'duration_minutes': 6, 'published_at': '2026-03-25', 'recorded_on': '2025-11-10', 'views': 197679, 'topics': ['culture', 'technology', 'entertainment', 'consumerism', 'comedy', 'data'], 'image': 'images/talk_032_mike-albo-my-bank-called-in-the-middle-of-my-ted.jpg', 'canonical_url': 'https://www.ted.com/talks/mike_albo_my_bank_called_in_the_middle_of_my_ted_talk', 'description': 'In this TED Talk gone wrong, comedian Mike Albo receives an unexpected call from his bank. The result: a hilariously uncomfortable tour of his purchase history, and a reminder that in the digital age, our data knows us a little too well.', 'transcript': 'Mike Albo opens by framing the central tension behind My bank called in the middle of my TED Talk. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174466', 'title': '3 ways to create a truly original design', 'slug': 'lope-gutierrez-ruiz-3-ways-to-create-a-truly-original-design', 'speaker': 'Lope Gutierrez-Ruiz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 355, 'duration_minutes': 6, 'published_at': '2026-03-24', 'recorded_on': '2025-11-10', 'views': 217982, 'topics': ['culture', 'design', 'media', 'collaboration', 'creativity', 'art', 'ted fellows', 'animation'], 'image': 'images/talk_033_lope-gutierrez-ruiz-3-ways-to-create-a-truly-ori.jpg', 'canonical_url': 'https://www.ted.com/talks/lope_gutierrez_ruiz_3_ways_to_create_a_truly_original_design', 'description': "In a world where design trends are quietly converging - same color palettes, same typography, same illustration styles - how do you make work that actually looks different? Designer and TED Fellow Lope Gutierrez-Ruiz distills his answer into three sharp, counterintuitive ideas, ticking through his studio's own funky creations to show how you can make things that stand out.", 'transcript': 'Lope Gutierrez-Ruiz opens by framing the central tension behind 3 ways to create a truly original design. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174464', 'title': '3 things I wish I knew when I was broke', 'slug': 'vivian-tu-3-things-i-wish-i-knew-when-i-was-broke', 'speaker': 'Vivian Tu', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 560, 'duration_minutes': 9, 'published_at': '2026-03-23', 'recorded_on': '2025-11-10', 'views': 300368, 'topics': ['business', 'personal growth', 'women in business', 'money', 'finance'], 'image': 'images/talk_034_vivian-tu-3-things-i-wish-i-knew-when-i-was-brok.jpg', 'canonical_url': 'https://www.ted.com/talks/vivian_tu_3_things_i_wish_i_knew_when_i_was_broke', 'description': "Finance doesn't have to feel like a foreign language. Wall Street trader-turned-financial educator Vivian Tu helps millions of people make sense of money, breaking down complex concepts into everyday terms you can understand. She shares how she broke free from the stress of living paycheck to paycheck - and explores how we can shift power structures to give everyone a real shot at building wealth.", 'transcript': 'Vivian Tu opens by framing the central tension behind 3 things I wish I knew when I was broke. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174728', 'title': 'Joy will find you - if you let it', 'slug': 'david-larbi-joy-will-find-you-if-you-let-it', 'speaker': 'David Larbi', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 305, 'duration_minutes': 5, 'published_at': '2026-03-20', 'recorded_on': '2025-11-10', 'views': 243270, 'topics': ['performance', 'creativity', 'poetry', 'happiness', 'personal growth'], 'image': 'images/talk_035_david-larbi-joy-will-find-you-if-you-let-it.jpg', 'canonical_url': 'https://www.ted.com/talks/david_larbi_joy_will_find_you_if_you_let_it', 'description': 'Author David Larbi recites a poem about the journey toward joy, reminding us of all the ways it can be found: having a conversation with a stranger, tasting the perfect bite of food or enjoying a good stretch. Joy is all around us - you just need to know where to look.', 'transcript': 'David Larbi opens by framing the central tension behind Joy will find you - if you let it. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174196', 'title': 'London, UK', 'slug': 'ted-idea-search-london-uk', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2786, 'duration_minutes': 46, 'published_at': '2026-03-19', 'recorded_on': '2026-03-19', 'views': 38468, 'topics': ['social change'], 'image': 'images/talk_036_ted-idea-search-london-uk.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_london_uk', 'description': "In London, the TED Idea Search brings together 10 voices from one of the world's most influential cultural capitals to compete for the opportunity to speak on the main stage at TED. From a civil engineer revealing the invisible infrastructure shaping our cities to a classical singer uncovering the erased history of women in music, the ideas on offer are both deeply personal and global in scope. When the lights come up, London doesn't hold back - and one speaker delivers a talk no one in that room will soon forget.", 'transcript': 'TED Idea Search opens by framing the central tension behind London, UK. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173046', 'title': 'How to tune your inner voice', 'slug': 'rhonda-ross-daniel-alexander-jones-how-to-tune-your-inner-voice', 'speaker': 'Rhonda Ross, Daniel Alexander Jones', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1196, 'duration_minutes': 20, 'published_at': '2026-03-19', 'recorded_on': '2025-11-09', 'views': 226951, 'topics': ['culture', 'music', 'creativity', 'art', 'relationships', 'personal growth', 'society', 'ted fellows', 'emotions'], 'image': 'images/talk_037_rhonda-ross-daniel-alexander-jones-how-to-tune-y.jpg', 'canonical_url': 'https://www.ted.com/talks/rhonda_ross_daniel_alexander_jones_how_to_tune_your_inner_voice', 'description': 'To calm the storm inside your mind, you must first understand it. Singer and actress Rhonda Ross shares her theory of "emotional sovereignty" - the idea that your feelings aren\'t shaped just by your circumstances, but by the thoughts running on loop in your head. In conversation with scholar and TED Fellow Daniel Alexander Jones, Ross introduces the unexpected, music-rooted practice for taking control of your narrative.', 'transcript': 'Rhonda Ross, Daniel Alexander Jones opens by framing the central tension behind How to tune your inner voice. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174671', 'title': 'The 6 eras of NBA fashion - from restrained to radical', 'slug': 'mitchell-s-jackson-the-6-eras-of-nba-fashion-from-restrained-to-radical', 'speaker': 'Mitchell S. Jackson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 564, 'duration_minutes': 9, 'published_at': '2026-03-19', 'recorded_on': '2025-11-11', 'views': 183882, 'topics': ['culture', 'history', 'sports', 'fashion', 'ted fellows', 'protest'], 'image': 'images/talk_038_mitchell-s-jackson-the-6-eras-of-nba-fashion-fro.jpg', 'canonical_url': 'https://www.ted.com/talks/mitchell_s_jackson_the_6_eras_of_nba_fashion_from_restrained_to_radical', 'description': 'What are you wearing, and why? This is the question that writer and TED Fellow Mitchell S. Jackson asks as he unpacks the six eras of NBA style. Tracing an arc from Bill Russell to Lebron James and beyond, he explores how players use fashion on and off the court to challenge the limits placed upon them - revealing a deeper story about culture, identity and power.', 'transcript': 'Mitchell S. Jackson opens by framing the central tension behind The 6 eras of NBA fashion - from restrained to radical. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174584', 'title': 'I taught rats to drive. They taught me to enjoy the ride', 'slug': 'kelly-lambert-i-taught-rats-to-drive-they-taught-me-to-enjoy-the-ride', 'speaker': 'Kelly Lambert', 'event': 'TEDxRVA Youth', 'talk_type': 'TEDx Talk', 'duration_seconds': 840, 'duration_minutes': 14, 'published_at': '2026-03-18', 'recorded_on': '2025-11-09', 'views': 217160, 'topics': ['science', 'animals', 'happiness', 'brain', 'neuroscience', 'tedx', 'emotions'], 'image': 'images/talk_039_kelly-lambert-i-taught-rats-to-drive-they-taught.jpg', 'canonical_url': 'https://www.ted.com/talks/kelly_lambert_i_taught_rats_to_drive_they_taught_me_to_enjoy_the_ride', 'description': 'What can happy rats teach us about human joy? Behavioral neuroscientist Kelly Lambert describes how her team trained rats to drive tiny cars to earn treats - and noticed something surprising about how effort and anticipation affect the brain. The experiment opens new questions about how reward, agency and "behaviorceuticals" might help build resilience and support mental health.', 'transcript': 'Kelly Lambert opens by framing the central tension behind I taught rats to drive. They taught me to enjoy the ride. The talk then connects evidence, lived experience, and examples from TEDxRVA Youth. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174670', 'title': 'Is luck random - or can you cultivate it?', 'slug': 'christian-busch-is-luck-random-or-can-you-cultivate-it', 'speaker': 'Christian Busch', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 768, 'duration_minutes': 13, 'published_at': '2026-03-17', 'recorded_on': '2025-10-23', 'views': 833338, 'topics': ['science', 'future', 'personal growth', 'decision-making'], 'image': 'images/talk_040_christian-busch-is-luck-random-or-can-you-cultiv.jpg', 'canonical_url': 'https://www.ted.com/talks/christian_busch_is_luck_random_or_can_you_cultivate_it', 'description': 'When the 2025 Los Angeles wildfires destroyed his home and neighborhood, scientist Christian Busch encountered the opposite of serendipity: "zemblanity," or bad luck by design. Drawing on more than a decade of scientific research, he explores how people can navigate unpredictability by adopting a serendipity mindset that transforms setbacks into unexpected new beginnings. He asks: What if good luck isn\'t random but can actually be cultivated?', 'transcript': 'Christian Busch opens by framing the central tension behind Is luck random - or can you cultivate it?. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174283', 'title': 'How to make transportation quieter, cleaner and cheaper', 'slug': 'doreen-orishaba-how-to-make-transportation-quieter-cleaner-and-cheaper', 'speaker': 'Doreen Orishaba', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-03-16', 'recorded_on': '2025-06-18', 'views': 214856, 'topics': ['climate change', 'transportation', 'africa', 'countdown'], 'image': 'images/talk_041_doreen-orishaba-how-to-make-transportation-quiet.jpg', 'canonical_url': 'https://www.ted.com/talks/doreen_orishaba_how_to_make_transportation_quieter_cleaner_and_cheaper', 'description': 'When Doreen Orishaba helped build Africa\'s first electric car in 2011, skeptics dismissed it as a "toy for the Western world." Now she\'s running dozens of electric buses across Kenya and Rwanda, moving thousands of passengers to work every day on zero-exhaust vehicles powered by near-silent engines. She breaks down what it actually takes to scale clean transport - and why skipping the gas station pit stop is closer than you may think.', 'transcript': 'Doreen Orishaba opens by framing the central tension behind How to make transportation quieter, cleaner and cheaper. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174282', 'title': 'What China can teach the world about scaling clean energy', 'slug': 'yin-yu-what-china-can-teach-the-world-about-scaling-clean-energy', 'speaker': 'Yin Yu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 545, 'duration_minutes': 9, 'published_at': '2026-03-13', 'recorded_on': '2025-06-18', 'views': 8098, 'topics': ['climate change', 'sustainability', 'energy', 'china', 'solar energy', 'countdown', 'renewable energy'], 'image': 'images/talk_042_yin-yu-what-china-can-teach-the-world-about-scal.jpg', 'canonical_url': 'https://www.ted.com/talks/yin_yu_what_china_can_teach_the_world_about_scaling_clean_energy', 'description': 'When Yin Yu first visited a major hydropower dam site in China, she expected to see a thriving community. Instead, she found families who\'d lost their land and livelihoods to the rising water. It was a powerful lesson in how "green" megaprojects can harm the people they\'re meant to help. Now, as solar and electric vehicles spread rapidly across Southeast Asia, Yin says the opportunity is enormous - but only if countries don\'t repeat the mistakes of the past.', 'transcript': 'Yin Yu opens by framing the central tension behind What China can teach the world about scaling clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174195', 'title': 'Lagos, Nigeria', 'slug': 'ted-idea-search-lagos-nigeria', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2792, 'duration_minutes': 47, 'published_at': '2026-03-12', 'recorded_on': '2026-03-12', 'views': 20035, 'topics': ['social change'], 'image': 'images/talk_043_ted-idea-search-lagos-nigeria.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_lagos_nigeria', 'description': "In the heart of Lagos - a megacity of 20 million people pulsing with energy and big ambitions - nine undiscovered voices compete for a chance to speak on the world's biggest stage for ideas. From a renewable energy advocate who studied by candlelight to an archivist reimagining Africa-centered education, these speakers bring stories with global stakes. But only one will earn the 7,000-mile journey to the TED stage in Vancouver.", 'transcript': 'TED Idea Search opens by framing the central tension behind Lagos, Nigeria. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '137525', 'title': '"May Your Kindness Remain" / "If I Told"', 'slug': 'courtney-marie-andrews-may-your-kindness-remain-if-i-told', 'speaker': 'Courtney Marie Andrews', 'event': 'TEDCountdown@BloombergGreenFestival', 'talk_type': 'TED Stage Talk', 'duration_seconds': 634, 'duration_minutes': 11, 'published_at': '2026-03-11', 'recorded_on': '2024-07-12', 'views': 8624, 'topics': ['environment', 'music', 'performance'], 'image': 'images/talk_044_courtney-marie-andrews-may-your-kindness-remain-.jpg', 'canonical_url': 'https://www.ted.com/talks/courtney_marie_andrews_may_your_kindness_remain_if_i_told', 'description': 'Singer-songwriter Courtney Marie Andrews performs "If I Told" and "May Your Kindness Remain," songs based on her connection to music, nature and environmental advocacy.', 'transcript': 'Courtney Marie Andrews opens by framing the central tension behind "May Your Kindness Remain" / "If I Told". The talk then connects evidence, lived experience, and examples from TEDCountdown@BloombergGreenFestival. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174194', 'title': 'Athens, Greece', 'slug': 'ted-idea-search-athens-greece', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2892, 'duration_minutes': 48, 'published_at': '2026-03-10', 'recorded_on': '2026-03-10', 'views': 38463, 'topics': ['social change'], 'image': 'images/talk_045_ted-idea-search-athens-greece.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_athens_greece', 'description': "The next stop on the TED Idea Search is Athens, birthplace of democracy and the world's oldest debating tradition. Nine speakers - from a fashion manufacturer taking on modern slavery to a microbiologist tackling the science of bad breath - go head-to-head for a shot to speak on the TED stage in Vancouver. Rehearsals are rocky, nerves are real and the stakes couldn't be higher - and only one speaker gets to move on and represent Athens to the world.", 'transcript': 'TED Idea Search opens by framing the central tension behind Athens, Greece. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173420', 'title': 'What would your "deathbed self" tell you today?', 'slug': 'lauren-deeley-what-would-your-deathbed-self-tell-you-today', 'speaker': 'Lauren Deeley', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 379, 'duration_minutes': 6, 'published_at': '2026-03-10', 'recorded_on': '2025-11-10', 'views': 252860, 'topics': ['future', 'work', 'personal growth', 'self', 'money', 'life'], 'image': 'images/talk_046_lauren-deeley-what-would-your-deathbed-self-tell.jpg', 'canonical_url': 'https://www.ted.com/talks/lauren_deeley_what_would_your_deathbed_self_tell_you_today', 'description': 'What if the key to making better decisions today is getting to know the person you\'ll become tomorrow? Drawing on psychological research and real-life stories, private wealth advisor Lauren Deeley explores how building a meaningful connection with your "deathbed self" can bring more clarity, joy and intention to the life you\'re building right now.', 'transcript': 'Lauren Deeley opens by framing the central tension behind What would your "deathbed self" tell you today?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174009', 'title': 'Mumbai, India', 'slug': 'ted-idea-search-mumbai-india', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2738, 'duration_minutes': 46, 'published_at': '2026-03-09', 'recorded_on': '2026-03-09', 'views': 22102, 'topics': ['social change'], 'image': 'images/talk_047_ted-idea-search-mumbai-india.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_mumbai_india', 'description': "In Mumbai, the TED Idea Search lands in India's bustling financial and creative capital, where 10 speakers are challenged to deliver the talk of their lives and compete for a one-of-a-kind opportunity: a spot on the TED stage in Vancouver. What emerges is a moving portrait of vulnerability and ambition, as ideas about vanishing tribal art, maternal health and India's forgotten fashion history look to shift perspectives on a global scale. Only one can make it through - who will it be?", 'transcript': 'TED Idea Search opens by framing the central tension behind Mumbai, India. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173439', 'title': 'Why you should keep a list of what makes you laugh', 'slug': 'chris-duffy-why-you-should-keep-a-list-of-what-makes-you-laugh', 'speaker': 'Chris Duffy', 'event': 'TED Talks Daily Book Club', 'talk_type': 'TED Stage Talk', 'duration_seconds': 3426, 'duration_minutes': 57, 'published_at': '2026-03-09', 'recorded_on': '2026-02-18', 'views': 229371, 'topics': ['culture', 'creativity', 'personal growth', 'comedy', 'humor'], 'image': 'images/talk_048_chris-duffy-why-you-should-keep-a-list-of-what-m.jpg', 'canonical_url': 'https://www.ted.com/talks/chris_duffy_why_you_should_keep_a_list_of_what_makes_you_laugh', 'description': 'The world is weird and hilarious - if you know where to look, says comedian Chris Duffy. In conversation with "TED Talks Daily" host Elise Hu, Duffy breaks down three practical pillars of humor, showing how laughter can help you feel present, creative and connected, even when the world feels overwhelming. (This conversation was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)', 'transcript': 'Chris Duffy opens by framing the central tension behind Why you should keep a list of what makes you laugh. The talk then connects evidence, lived experience, and examples from TED Talks Daily Book Club. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172133', 'title': 'Conservation: a love story', 'slug': 'elsaphan-njora-conservation-a-love-story', 'speaker': 'Elsaphan Njora', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 520, 'duration_minutes': 9, 'published_at': '2026-03-06', 'recorded_on': '2025-06-17', 'views': 208417, 'topics': ['climate change', 'nature', 'love', 'biodiversity', 'conservation', 'countdown'], 'image': 'images/talk_049_elsaphan-njora-conservation-a-love-story.jpg', 'canonical_url': 'https://www.ted.com/talks/elsaphan_njora_conservation_a_love_story', 'description': "What if the key to saving nature isn't just about science or policy, but love? Love for the land, for the people who depend on it, for the world we leave behind. Artist Elsaphan Njora has journeyed across Kenya witnessing ecosystems vanish, from Indigenous forests to sacred lakes. But he's also seen communities breathing life back into rivers, forests and coasts in creative, unexpected ways - showing that conservation can flourish alongside livelihoods, and that even the most threatened landscapes can be reborn.", 'transcript': 'Elsaphan Njora opens by framing the central tension behind Conservation: a love story. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173850', 'title': 'Sydney, Australia', 'slug': 'ted-idea-search-sydney-australia', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2625, 'duration_minutes': 44, 'published_at': '2026-03-04', 'recorded_on': '2026-03-04', 'views': 46087, 'topics': ['society'], 'image': 'images/talk_050_ted-idea-search-sydney-australia.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_sydney_australia', 'description': "In the premiere of the TED Idea Search, we travel to Sydney, Australia, where 10 brilliant people take the stage for the shot of a lifetime: a chance to speak at the TED conference in Vancouver. From a wildlife scientist deploying AI to bust illegal trafficking networks to Australia's own human rights commissioner sounding the alarm on brain-reading technology, these speakers bring ideas that could genuinely shift how we live. But only one can win - and the choice comes down to a single, unforgettable talk that leaves the audience (and the judges) blown away.", 'transcript': 'TED Idea Search opens by framing the central tension behind Sydney, Australia. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173043', 'title': '3 habits to practice curiosity - and escape your phone', 'slug': 'nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone', 'speaker': 'Nayeema Raza', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 312, 'duration_minutes': 5, 'published_at': '2026-03-04', 'recorded_on': '2025-11-11', 'views': 554563, 'topics': ['culture', 'technology', 'social change', 'society', 'curiosity'], 'image': 'images/talk_051_nayeema-raza-3-habits-to-practice-curiosity-and-.jpg', 'canonical_url': 'https://www.ted.com/talks/nayeema_raza_3_habits_to_practice_curiosity_and_escape_your_phone', 'description': "We're so entangled with our devices that online has started to feel more real than IRL, says journalist Nayeema Raza. As screens reshape how we connect and relate, she offers three practical habits to reignite curiosity, restore presence and break free from our phones.", 'transcript': 'Nayeema Raza opens by framing the central tension behind 3 habits to practice curiosity - and escape your phone. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173440', 'title': '4 relationship traps that lead to burnout', 'slug': 'eric-quintane-4-relationship-traps-that-lead-to-burnout', 'speaker': 'Eric Quintane', 'event': 'TEDxESMTBerlin', 'talk_type': 'TEDx Talk', 'duration_seconds': 991, 'duration_minutes': 17, 'published_at': '2026-03-04', 'recorded_on': '2025-02-01', 'views': 285438, 'topics': ['business', 'psychology', 'relationships', 'communication', 'work', 'personal growth', 'society', 'tedx'], 'image': 'images/talk_052_eric-quintane-4-relationship-traps-that-lead-to-.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_quintane_4_relationship_traps_that_lead_to_burnout', 'description': 'Are your workplace relationships quietly burning you out? Drawing on large-scale research across industries, organizational behavior researcher Eric Quintane reveals four hidden relational traps woven into the fabric of work - and explores how connection shapes resilience, vulnerability and burnout.', 'transcript': 'Eric Quintane opens by framing the central tension behind 4 relationship traps that lead to burnout. The talk then connects evidence, lived experience, and examples from TEDxESMTBerlin. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173576', 'title': 'Love, intimacy and connection in the age of AI', 'slug': 'bryony-cole-love-intimacy-and-connection-in-the-age-of-ai', 'speaker': 'Bryony Cole', 'event': 'TED Membership', 'talk_type': 'TED Stage Talk', 'duration_seconds': 2631, 'duration_minutes': 44, 'published_at': '2026-03-03', 'recorded_on': '2026-02-05', 'views': 203689, 'topics': ['technology', 'love', 'relationships', 'ai', 'sex', 'ted membership'], 'image': 'images/talk_053_bryony-cole-love-intimacy-and-connection-in-the-.jpg', 'canonical_url': 'https://www.ted.com/talks/bryony_cole_love_intimacy_and_connection_in_the_age_of_ai', 'description': "Relationships were never meant to be efficient, says sextech expert Bryony Cole, and yet AI companions are increasingly designed to be exactly that. As intimate relationships between humans and AI become more common, Cole challenges us to think more deliberately about how we shape our connections to machines - and with each other. (This conversation, hosted by TED's Whitney Pennington Rodgers, was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)", 'transcript': 'Bryony Cole opens by framing the central tension behind Love, intimacy and connection in the age of AI. The talk then connects evidence, lived experience, and examples from TED Membership. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173044', 'title': 'The sneaky language tricks cults use to influence you', 'slug': 'amanda-montell-the-sneaky-language-tricks-cults-use-to-influence-you', 'speaker': 'Amanda Montell', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 354, 'duration_minutes': 6, 'published_at': '2026-03-02', 'recorded_on': '2025-11-11', 'views': 260199, 'topics': ['culture', 'media', 'relationships', 'communication', 'community', 'language', 'society'], 'image': 'images/talk_054_amanda-montell-the-sneaky-language-tricks-cults-.jpg', 'canonical_url': 'https://www.ted.com/talks/amanda_montell_the_sneaky_language_tricks_cults_use_to_influence_you', 'description': "In the age of social media and wellness trends, the comments section is as good as a cult compound, says linguist and cultural commentator Amanda Montell. Using Taylor Swift's throng of devoted Swifties as her guide, she exposes three sneaky language tactics that cults use to influence us (for better or for worse), revealing why none of us are as cult-proof as we'd like to think.", 'transcript': 'Amanda Montell opens by framing the central tension behind The sneaky language tricks cults use to influence you. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173511', 'title': 'The attack on Iran - why now?', 'slug': 'ian-bremmer-the-attack-on-iran-why-now', 'speaker': 'Ian Bremmer', 'event': 'TED Explains the World with Ian Bremmer', 'talk_type': 'Original Content', 'duration_seconds': 2669, 'duration_minutes': 44, 'published_at': '2026-03-01', 'recorded_on': '2026-02-28', 'views': 684021, 'topics': ['global issues', 'politics', 'military', 'war', 'government', 'middle east', 'policy', 'international relations', 'current events'], 'image': 'images/talk_055_ian-bremmer-the-attack-on-iran-why-now.jpg', 'canonical_url': 'https://www.ted.com/talks/ian_bremmer_the_attack_on_iran_why_now', 'description': 'On the morning of February 28, 2026, the US and Israel bombed several parts of Iran, including the Tehran compound of Supreme Leader Ali Khamenei. Geopolitical expert and Eurasia Group founder Ian Bremmer breaks down why US President Donald Trump made the decision to strike, what it means for hopes of "regime change" and the key details you need to know about this perilous moment in global history. (This interview, hosted by TED\'s Helen Walters, was recorded on February 28, 2026.)', 'transcript': 'Ian Bremmer opens by framing the central tension behind The attack on Iran - why now?. The talk then connects evidence, lived experience, and examples from TED Explains the World with Ian Bremmer. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173004', 'title': "What to do when you're told there's nothing left to try", 'slug': 'david-fajgenbaum-and-kiah-williams-what-to-do-when-you-re-told-there-s-nothing-left-to-try', 'speaker': 'David Fajgenbaum and Kiah Williams', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1720, 'duration_minutes': 29, 'published_at': '2026-02-27', 'recorded_on': '2025-11-10', 'views': 220867, 'topics': ['science', 'technology', 'social change', 'health', 'health care', 'medicine', 'poverty', 'personal growth', 'ai', 'public health', 'medical research', 'the audacious project', 'artificial intelligence'], 'image': 'images/talk_056_david-fajgenbaum-and-kiah-williams-what-to-do-wh.jpg', 'canonical_url': 'https://www.ted.com/talks/david_fajgenbaum_and_kiah_williams_what_to_do_when_you_re_told_there_s_nothing_left_to_try', 'description': "What do you do when the world declares something impossible? When physician-scientist David Fajgenbaum was dying from a rare disease and social entrepreneur Kiah Williams was confronting the realities of economic hardship, they began asking a different question: What can I do today? In this conversation, they discuss how turning hope into action can drive meaningful change - one step at a time. (This conversation is hosted by The Audacious Project's Alexandra Tillmann.)", 'transcript': "David Fajgenbaum and Kiah Williams opens by framing the central tension behind What to do when you're told there's nothing left to try. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172996', 'title': 'My year living with a robot', 'slug': 'emily-kate-genatowski-my-year-living-with-a-robot', 'speaker': 'Emily Kate Genatowski', 'event': 'TEDAI Vienna 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 830, 'duration_minutes': 14, 'published_at': '2026-02-25', 'recorded_on': '2025-09-26', 'views': 246590, 'topics': ['technology', 'robots', 'ai', 'life'], 'image': 'images/talk_057_emily-kate-genatowski-my-year-living-with-a-robo.jpg', 'canonical_url': 'https://www.ted.com/talks/emily_kate_genatowski_my_year_living_with_a_robot', 'description': "Imagine a robot moving into your home. How would it change your daily life? Historian Emily Kate Genatowski shares five eye-opening lessons from a year living with her AI-powered robot roommate, from the quirky and chaotic to the surprisingly mundane. Her experiences show that the future of robots isn't science fiction - it's practical, messy and already here.", 'transcript': 'Emily Kate Genatowski opens by framing the central tension behind My year living with a robot. The talk then connects evidence, lived experience, and examples from TEDAI Vienna 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172999', 'title': 'Jermaine Dupri on the art of making a hit | On the Spot', 'slug': 'jermaine-dupri-jermaine-dupri-on-the-art-of-making-a-hit-on-the-spot', 'speaker': 'Jermaine Dupri', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 660, 'duration_minutes': 11, 'published_at': '2026-02-26', 'recorded_on': '2025-11-10', 'views': 211240, 'topics': ['culture', 'entertainment', 'music', 'collaboration', 'creativity', 'art'], 'image': 'images/talk_058_jermaine-dupri-jermaine-dupri-on-the-art-of-maki.jpg', 'canonical_url': 'https://www.ted.com/talks/jermaine_dupri_jermaine_dupri_on_the_art_of_making_a_hit_on_the_spot', 'description': 'Legendary music producer Jermaine Dupri pulls back the curtain on how hit songs really get made in TED\'s rapid-fire Q&A format, "On the Spot." Answering a stream of unexpected questions, he covers what makes a good hook, why he doesn\'t chase "cool," how he helped build Atlanta\'s sound and more.', 'transcript': 'Jermaine Dupri opens by framing the central tension behind Jermaine Dupri on the art of making a hit | On the Spot. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '171661', 'title': 'The controversial climate tool funding real change', 'slug': 'sandeep-roy-choudhury-the-controversial-climate-tool-funding-real-change', 'speaker': 'Sandeep Roy Choudhury', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 535, 'duration_minutes': 9, 'published_at': '2026-02-24', 'recorded_on': '2025-06-17', 'views': 221876, 'topics': ['climate change', 'environment', 'sustainability', 'finance', 'countdown'], 'image': 'images/talk_059_sandeep-roy-choudhury-the-controversial-climate-.jpg', 'canonical_url': 'https://www.ted.com/talks/sandeep_roy_choudhury_the_controversial_climate_tool_funding_real_change', 'description': "If a company plants trees to offset its pollution, is that climate progress - or is it greenwashing? Critics of carbon markets say it's the latter. But Sandeep Roy Choudhury, who's spent two decades financing climate projects from rural cookstoves to coastal forests, says the real failure is discouraging companies from even trying. Hear his case for why we shouldn't let perfection block meaningful action on climate change.", 'transcript': 'Sandeep Roy Choudhury opens by framing the central tension behind The controversial climate tool funding real change. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172142', 'title': 'A surprisingly effective way to fight misinformation', 'slug': 'dave-jorgenson-a-surprisingly-effective-way-to-fight-misinformation', 'speaker': 'Dave Jorgenson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 754, 'duration_minutes': 13, 'published_at': '2026-02-23', 'recorded_on': '2025-11-09', 'views': 406598, 'topics': ['culture', 'media', 'humor', 'society', 'internet'], 'image': 'images/talk_060_dave-jorgenson-a-surprisingly-effective-way-to-f.jpg', 'canonical_url': 'https://www.ted.com/talks/dave_jorgenson_a_surprisingly_effective_way_to_fight_misinformation', 'description': "What if the best defense against misinformation isn't panic, but a punchline? Journalist and comedian Dave Jorgenson explores how misinformation has proliferated throughout history - from the age of Plato to the era of viral TikToks. With his own short, absurdist sketches that explain the news, he shows how humor can cut through fear, spark curiosity and explore nuanced truth.", 'transcript': 'Dave Jorgenson opens by framing the central tension behind A surprisingly effective way to fight misinformation. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172495', 'title': 'How a viral choreographer makes his moves', 'slug': 'sean-bankhead-how-a-viral-choreographer-makes-his-moves', 'speaker': 'Sean Bankhead', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 399, 'duration_minutes': 7, 'published_at': '2026-02-20', 'recorded_on': '2025-11-09', 'views': 26868, 'topics': ['culture', 'music', 'performance', 'art', 'dance'], 'image': 'images/talk_061_sean-bankhead-how-a-viral-choreographer-makes-hi.jpg', 'canonical_url': 'https://www.ted.com/talks/sean_bankhead_how_a_viral_choreographer_makes_his_moves', 'description': 'In a swaggering performance, choreographer Sean Bankhead and his students perform the viral dance he designed for Victoria Monet\'s hit song "On My Mama." Rooted in Black culture and inspired by generations of iconic artists, Bankhead blends expertise with at least one move everyone can try - showing how choreography doesn\'t just reflect culture, it drives it forward.', 'transcript': 'Sean Bankhead opens by framing the central tension behind How a viral choreographer makes his moves. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172774', 'title': "The story you're not hearing about AI data centers", 'slug': 'ay-e-coskun-the-story-you-re-not-hearing-about-ai-data-centers', 'speaker': 'Ayse Coskun', 'event': 'TEDAI San Francisco', 'talk_type': 'TED Stage Talk', 'duration_seconds': 717, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-21', 'views': 302717, 'topics': ['environment', 'sustainability', 'technology', 'energy', 'ai', 'data', 'renewable energy'], 'image': 'images/talk_062_ay-e-coskun-the-story-you-re-not-hearing-about-a.jpg', 'canonical_url': 'https://www.ted.com/talks/ay_e_coskun_the_story_you_re_not_hearing_about_ai_data_centers', 'description': "The race to build smarter AI is crashing into a physical limitation: the power grid simply can't keep up with the energy demands of data centers. Computer scientist Ayse Coskun shows how we could turn this problem on its head, transforming AI facilities into virtual batteries that help stabilize the grid and accelerate clean energy. Learn why the technology causing this crisis might be the only thing smart enough to fix it.", 'transcript': "Ayse Coskun opens by framing the central tension behind The story you're not hearing about AI data centers. The talk then connects evidence, lived experience, and examples from TEDAI San Francisco. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '170176', 'title': 'How to be a great listener', 'slug': 'maegan-stephens-nicole-lowenbraun-how-to-be-a-great-listener', 'speaker': 'Maegan Stephens, Nicole Lowenbraun', 'event': 'TED@BCG', 'talk_type': 'TED Stage Talk', 'duration_seconds': 706, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-23', 'views': 357273, 'topics': ['communication', 'leadership', 'work', 'trust', 'goals'], 'image': 'images/talk_063_maegan-stephens-nicole-lowenbraun-how-to-be-a-gr.jpg', 'canonical_url': 'https://www.ted.com/talks/maegan_stephens_nicole_lowenbraun_how_to_be_a_great_listener', 'description': 'Have you ever left a meeting thinking: everyone talked, but nothing was achieved? Chances are that people were listening to each other, just not in the same way. Listening experts Maegan Stephens and Nicole Lowenbraun unpack the four different ways to listen, sharing a practical framework that could change how you respond, build trust and get results - starting with just one simple question.', 'transcript': 'Maegan Stephens, Nicole Lowenbraun opens by framing the central tension behind How to be a great listener. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '170828', 'title': "What you know that AI doesn't", 'slug': 'priyanka-vergadia-what-you-know-that-ai-doesn-t', 'speaker': 'Priyanka Vergadia', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 559, 'duration_minutes': 9, 'published_at': '2026-02-18', 'recorded_on': '2025-11-10', 'views': 278682, 'topics': ['technology', 'collaboration', 'work', 'ai', 'career'], 'image': 'images/talk_064_priyanka-vergadia-what-you-know-that-ai-doesn-t.jpg', 'canonical_url': 'https://www.ted.com/talks/priyanka_vergadia_what_you_know_that_ai_doesn_t', 'description': "AI is good at seeing patterns, but it's humans who figure out what to do next, says technologist Priyanka Vergadia. She shares three stories of human excellence sparked by AI insights and offers a pathway to identify and cultivate your irreplaceable qualities, turning the AI revolution from a threat into an opportunity.", 'transcript': "Priyanka Vergadia opens by framing the central tension behind What you know that AI doesn't. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}] +TALKS = [{'source_id': '178768', 'title': 'The wildlife sanctuary you can visit from anywhere', 'slug': 'maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere', 'speaker': 'Maya Higa', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 568, 'duration_minutes': 9, 'published_at': '2026-05-12', 'recorded_on': '2026-04-14', 'views': 150000, 'topics': ['media', 'social change', 'animals', 'nature', 'social media', 'internet', 'conservation', 'wildlife'], 'image': 'images/talk_001_maya-higa-the-wildlife-sanctuary-you-can-visit-f.jpg', 'canonical_url': 'https://www.ted.com/talks/maya_higa_the_wildlife_sanctuary_you_can_visit_from_anywhere', 'description': 'Creator Maya Higa is on a mission to use the internet to build the next generation of conservationists. Her virtual education center, Alveus Sanctuary, is one of the most-watched sanctuaries on Earth, with dozens of rescued animals and cameras livestreaming to a community of millions inspired to help protect the wildlife. Visit with Bean the Hawk, Winnie the Moo and more - and see what the future of conservation looks like.', 'transcript': 'Maya Higa opens by framing the central tension behind The wildlife sanctuary you can visit from anywhere. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178681', 'title': "Waymo's case for a driverless future", 'slug': 'tekedra-mawakana-sal-khan-waymo-s-case-for-a-driverless-future', 'speaker': 'Tekedra Mawakana, Sal Khan', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1154, 'duration_minutes': 19, 'published_at': '2026-05-11', 'recorded_on': '2026-04-15', 'views': 157919, 'topics': ['technology', 'future', 'society', 'driverless cars'], 'image': 'images/talk_002_tekedra-mawakana-sal-khan-waymo-s-case-for-a-dri.jpg', 'canonical_url': 'https://www.ted.com/talks/tekedra_mawakana_sal_khan_waymo_s_case_for_a_driverless_future', 'description': "What if we could solve the problem of fatal car accidents? Waymo co-CEO Tekedra Mawakana joins TED's Sal Khan to explore why fully autonomous vehicles (where you never have to touch the wheel) could end the dangerous status quo of traffic deaths. She makes the case for why self-driving cars are more than a tech novelty - they're an urgently needed upgrade that could make the world safer for everyone.", 'transcript': "Tekedra Mawakana, Sal Khan opens by framing the central tension behind Waymo's case for a driverless future. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177895', 'title': 'Why I love my bad days', 'slug': 'alexi-pappas-why-i-love-my-bad-days', 'speaker': 'Alexi Pappas', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 310, 'duration_minutes': 5, 'published_at': '2026-05-08', 'recorded_on': '2025-11-11', 'views': 6052, 'topics': ['psychology', 'philosophy', 'happiness', 'sports', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_003_alexi-pappas-why-i-love-my-bad-days.jpg', 'canonical_url': 'https://www.ted.com/talks/alexi_pappas_why_i_love_my_bad_days', 'description': "One month before the Rio Olympics, runner Alexi Pappas couldn't hit her splits in practice. She was begging her watch to change its mind. Then her coach told her to take it off - and shared the best advice she's ever received. That single piece of wisdom led her to break a national record and changed how she chases her goals, carrying her through ultramarathons, a memoir and three films. Bad days aren't a detour, she says - they mean you're right on track.", 'transcript': 'Alexi Pappas opens by framing the central tension behind Why I love my bad days. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178367', 'title': 'What really won the trillion-dollar Supreme Court case', 'slug': 'neal-kumar-katyal-what-really-won-the-trillion-dollar-supreme-court-case', 'speaker': 'Neal Kumar Katyal', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1091, 'duration_minutes': 18, 'published_at': '2026-05-07', 'recorded_on': '2026-04-17', 'views': 154312, 'topics': ['culture', 'ai', 'law', 'society', 'policy'], 'image': 'images/talk_004_neal-kumar-katyal-what-really-won-the-trillion-d.jpg', 'canonical_url': 'https://www.ted.com/talks/neal_kumar_katyal_what_really_won_the_trillion_dollar_supreme_court_case', 'description': "In November 2025, Neal Kumar Katyal was asked to do what no US Supreme Court litigator had ever done: convince the justices to strike down a sitting president's signature initiative. After enlisting the help of four unlikely coaches - and one secret weapon he hasn't told anyone about until now - he walked into the courtroom ready for anything. What he discovered about winning and connecting might just change how you think about performing under pressure.", 'transcript': 'Neal Kumar Katyal opens by framing the central tension behind What really won the trillion-dollar Supreme Court case. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '178175', 'title': 'The rising cost of dissent in America', 'slug': 'miles-taylor-the-rising-cost-of-dissent-in-america-may-2026', 'speaker': 'Miles Taylor', 'event': 'TEDxMidAtlantic', 'talk_type': 'TEDx Talk', 'duration_seconds': 1166, 'duration_minutes': 19, 'published_at': '2026-05-04', 'recorded_on': '2025-11-01', 'views': 154789, 'topics': ['politics', 'media', 'social change', 'united states', 'democracy', 'government'], 'image': 'images/talk_005_miles-taylor-the-rising-cost-of-dissent-in-ameri.jpg', 'canonical_url': 'https://www.ted.com/talks/miles_taylor_the_rising_cost_of_dissent_in_america_may_2026', 'description': "Former senior US national security official Miles Taylor shares a personal account that raises a broader civic concern: the growing cost of dissent in American public life. Drawing on his experience inside government and living the consequences of speaking openly, he says that the real threat to US democracy isn't the politicians or hard-liners - it's the two-thirds of Americans who don't speak up. (This talk contains mature language.)", 'transcript': 'Miles Taylor opens by framing the central tension behind The rising cost of dissent in America. The talk then connects evidence, lived experience, and examples from TEDxMidAtlantic. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178086', 'title': 'Why AI is unlikely to become conscious', 'slug': 'anil-seth-why-ai-is-unlikely-to-become-conscious', 'speaker': 'Anil Seth', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 897, 'duration_minutes': 15, 'published_at': '2026-05-01', 'recorded_on': '2026-04-16', 'views': 191682, 'topics': ['technology', 'future', 'brain', 'consciousness', 'ai'], 'image': 'images/talk_006_anil-seth-why-ai-is-unlikely-to-become-conscious.jpg', 'canonical_url': 'https://www.ted.com/talks/anil_seth_why_ai_is_unlikely_to_become_conscious', 'description': 'We see consciousness in AI the same way we see faces in clouds, says neuroscientist Anil Seth. He explores the all-too-human tendency to project inner life onto machines that are brilliant mimics, not sentient beings, and gives a definitive answer to the urgent question: Will AI ever gain consciousness?', 'transcript': 'Anil Seth opens by framing the central tension behind Why AI is unlikely to become conscious. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175757', 'title': 'Reimagining traditional architecture for modern needs', 'slug': 'riyad-joucka-reimagining-traditional-architecture-for-modern-needs', 'speaker': 'Riyad Joucka', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 492, 'duration_minutes': 8, 'published_at': '2026-04-30', 'recorded_on': '2025-10-23', 'views': 153822, 'topics': ['technology', 'design', 'architecture', 'urban planning', 'innovation', '3d printing'], 'image': 'images/talk_007_riyad-joucka-reimagining-traditional-architectur.jpg', 'canonical_url': 'https://www.ted.com/talks/riyad_joucka_reimagining_traditional_architecture_for_modern_needs', 'description': "Architect Riyad Joucka believes your home should be a mirror of who you are. Using 3D printing and ancient architectural wisdom, he's designing efficient, personal homes that respond to context, climate and culture without sacrificing character. He makes the case that we should start designing for people, not the market.", 'transcript': 'Riyad Joucka opens by framing the central tension behind Reimagining traditional architecture for modern needs. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176563', 'title': 'How to invite creativity into your life', 'slug': 'rose-b-simpson-debbie-millman-how-to-invite-creativity-into-your-life', 'speaker': 'Rose B. Simpson, Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1065, 'duration_minutes': 18, 'published_at': '2026-04-29', 'recorded_on': '2025-11-10', 'views': 170066, 'topics': ['culture', 'nature', 'creativity', 'art', 'storytelling', 'mindfulness'], 'image': 'images/talk_008_rose-b-simpson-debbie-millman-how-to-invite-crea.jpg', 'canonical_url': 'https://www.ted.com/talks/rose_b_simpson_debbie_millman_how_to_invite_creativity_into_your_life', 'description': 'What do you hear when you sit in silence? For artist Rose B. Simpson, that question is the beginning of all art. She comes from a line of ceramic artists stretching back generations and, as part of her multidisciplinary work, she also builds custom lowrider cars. (If that sounds like a contradiction, that\'s kind of the point.) In conversation with "Design Matters" podcast host Debbie Millman, Simpson invites you to find your own aesthetic - not by searching, but by listening.', 'transcript': 'Rose B. Simpson, Debbie Millman opens by framing the central tension behind How to invite creativity into your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175453', 'title': 'You got what you wanted. Now what?', 'slug': 'debbie-millman-you-got-what-you-wanted-now-what', 'speaker': 'Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 473, 'duration_minutes': 8, 'published_at': '2026-04-27', 'recorded_on': '2025-11-09', 'views': 190209, 'topics': ['design', 'creativity', 'personal growth'], 'image': 'images/talk_009_debbie-millman-you-got-what-you-wanted-now-what.jpg', 'canonical_url': 'https://www.ted.com/talks/debbie_millman_you_got_what_you_wanted_now_what', 'description': 'Over two decades of interviewing countless creative people, Debbie Millman (host of the iconic "Design Matters" podcast) had a realization: the pride and joy of accomplishing something often evaporates almost instantly. She explains how to stop chasing external validation for your achievements and instead live for the act of creation itself.', 'transcript': 'Debbie Millman opens by framing the central tension behind You got what you wanted. Now what?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177490', 'title': 'What Kosovo can teach the world about freedom', 'slug': 'vjosa-osmani-sadriu-what-kosovo-can-teach-the-world-about-freedom', 'speaker': 'Vjosa Osmani Sadriu', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1047, 'duration_minutes': 17, 'published_at': '2026-04-24', 'recorded_on': '2026-04-14', 'views': 176972, 'topics': ['politics', 'social change', 'leadership', 'democracy', 'government'], 'image': 'images/talk_010_vjosa-osmani-sadriu-what-kosovo-can-teach-the-wo.jpg', 'canonical_url': 'https://www.ted.com/talks/vjosa_osmani_sadriu_what_kosovo_can_teach_the_world_about_freedom', 'description': '"Truth is the real oxygen for democracy," says Vjosa Osmani Sadriu, the 6th President of the Republic of Kosovo. As a child of war, she once longed for someone to save her people. Now she\'s been in the rooms where decisions are made - and she\'s never forgotten what brought her there. In conversation with solutions journalist Angus Hervey, she reflects on what it takes to defend democracy in a world where truth itself is under threat. (Recorded on April 14, 2026)', 'transcript': 'Vjosa Osmani Sadriu opens by framing the central tension behind What Kosovo can teach the world about freedom. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177489', 'title': 'Beware the power of prediction', 'slug': 'carissa-veliz-beware-the-power-of-prediction', 'speaker': 'Carissa Veliz', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 728, 'duration_minutes': 12, 'published_at': '2026-04-23', 'recorded_on': '2026-04-14', 'views': 267371, 'topics': ['technology', 'future', 'ai', 'ethics'], 'image': 'images/talk_011_carissa-veliz-beware-the-power-of-prediction.jpg', 'canonical_url': 'https://www.ted.com/talks/carissa_veliz_beware_the_power_of_prediction', 'description': "What do the story of Oedipus and your insurance premiums have in common? They are both driven by self-fulfilling prophecies. Philosopher and TED Fellow Carissa Veliz traces the hidden power of prediction, from Roman emperors who banned prophets to the AI algorithms quietly making decisions about your life right now. We tend to associate predictions with knowledge, she says, but they're actually attempts to grab power. So the next time someone tells you a specific outcome is inevitable, remember: they aren't describing the future - they're selling it.", 'transcript': 'Carissa Veliz opens by framing the central tension behind Beware the power of prediction. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177096', 'title': 'The problem with billionaires - and the debut of True Net Worth', 'slug': 'randall-lane-the-problem-with-billionaires-and-the-debut-of-true-net-worth', 'speaker': 'Randall Lane', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 499, 'duration_minutes': 8, 'published_at': '2026-04-20', 'recorded_on': '2026-04-16', 'views': 221434, 'topics': ['culture', 'economics', 'philanthropy', 'society', 'money', 'finance'], 'image': 'images/talk_012_randall-lane-the-problem-with-billionaires-and-t.jpg', 'canonical_url': 'https://www.ted.com/talks/randall_lane_the_problem_with_billionaires_and_the_debut_of_true_net_worth', 'description': "As chief content officer of Forbes, Randall Lane oversees the magazine's signature list of billionaires, tracking the richest people on Earth. But he has noticed that this prompts the ultra-wealthy to stockpile their money instead of spending it on the public good. He debuts a new ranking - True Net Worth - that applauds billionaires for their philanthropy and rewards generosity. Guess who's in the top five?", 'transcript': 'Randall Lane opens by framing the central tension behind The problem with billionaires - and the debut of True Net Worth. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175050', 'title': 'A cheat sheet for accelerating clean energy', 'slug': 'kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy', 'speaker': 'Kimiko Hirata', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 586, 'duration_minutes': 10, 'published_at': '2026-04-20', 'recorded_on': '2025-06-18', 'views': 191819, 'topics': ['climate change', 'policy', 'countdown', 'renewable energy', 'fossil fuels'], 'image': 'images/talk_013_kimiko-hirata-a-cheat-sheet-for-accelerating-cle.jpg', 'canonical_url': 'https://www.ted.com/talks/kimiko_hirata_a_cheat_sheet_for_accelerating_clean_energy', 'description': 'After the Fukushima disaster shut down Japan\'s nuclear reactors, the coal industry rushed in to fill the energy gap. As climate advocate Kimiko Hirata watched dozens of new coal plant proposals quietly surface across the country - each one locking in decades of future emissions - she resolved to make them impossible to ignore. She shares how a small, scrappy civil society movement took on a fossil-fuel-dependent economy and got people to say "yes" to a renewable future.', 'transcript': 'Kimiko Hirata opens by framing the central tension behind A cheat sheet for accelerating clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176964', 'title': 'How I created OpenClaw, the breakthrough AI agent', 'slug': 'peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent', 'speaker': 'Peter Steinberger', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1055, 'duration_minutes': 18, 'published_at': '2026-04-17', 'recorded_on': '2026-04-16', 'views': 551544, 'topics': ['technology', 'computers', 'ai', 'internet', 'machine learning', 'artificial intelligence'], 'image': 'images/talk_014_peter-steinberger-how-i-created-openclaw-the-bre.jpg', 'canonical_url': 'https://www.ted.com/talks/peter_steinberger_how_i_created_openclaw_the_breakthrough_ai_agent', 'description': 'OpenClaw creator Peter Steinberger takes us back to the transformative moment he let his AI agent loose on the internet, igniting one of the world\'s fastest-growing open-source projects. He makes a fascinating (and slightly unnerving) case that agents are a real shift, not just better versions of chatbots, and explores how they might reshape your ability to work, build and create. "The lobster is loose, and it\'s not going back into the tank," he says. (Followed by a brief Q&A with TED Chairman Chris Anderson)', 'transcript': 'Peter Steinberger opens by framing the central tension behind How I created OpenClaw, the breakthrough AI agent. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176887', 'title': 'A plan to stop AI from automating our decline', 'slug': 'gina-raimondo-a-plan-to-stop-ai-from-automating-our-decline', 'speaker': 'Gina Raimondo', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 951, 'duration_minutes': 16, 'published_at': '2026-04-16', 'recorded_on': '2026-04-14', 'views': 229795, 'topics': ['politics', 'technology', 'business', 'social change', 'work', 'ai'], 'image': 'images/talk_015_gina-raimondo-a-plan-to-stop-ai-from-automating-.jpg', 'canonical_url': 'https://www.ted.com/talks/gina_raimondo_a_plan_to_stop_ai_from_automating_our_decline', 'description': 'The United States is on track to win the AI race - and hollow itself out in the process, says Gina Raimondo, former Governor of Rhode Island and US Secretary of Commerce. In this unflinching look at the threat of AI-induced economic disruption and social unrest, she offers a concrete blueprint to prepare workers for what\'s coming next. "AI is a 100-year technology and needs a 100-year response," she says. Is America up to the challenge?', 'transcript': 'Gina Raimondo opens by framing the central tension behind A plan to stop AI from automating our decline. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175041', 'title': 'East African sound meets cosmic trap', 'slug': 'akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap', 'speaker': 'Akoth Jumadi and Mr. Lu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 483, 'duration_minutes': 8, 'published_at': '2026-04-15', 'recorded_on': '2025-06-18', 'views': 2781, 'topics': ['music', 'performance', 'africa', 'art', 'sound'], 'image': 'images/talk_016_akoth-jumadi-and-mr-lu-east-african-sound-meets-.jpg', 'canonical_url': 'https://www.ted.com/talks/akoth_jumadi_and_mr_lu_east_african_sound_meets_cosmic_trap', 'description': 'Kenyan music duo Akoth Jumadi and MR. LU* fuse tribal roots with cosmic trap and celestial R&B, creating a hypnotic sound where ancient rhythms meet the future.', 'transcript': 'Akoth Jumadi and Mr. Lu opens by framing the central tension behind East African sound meets cosmic trap. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176566', 'title': 'What I got wrong about changing the world', 'slug': 'malala-yousafzai-what-i-got-wrong-about-changing-the-world', 'speaker': 'Malala Yousafzai', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 703, 'duration_minutes': 12, 'published_at': '2026-04-14', 'recorded_on': '2026-04-14', 'views': 349363, 'topics': ['education', 'social change', 'activism', 'middle east', 'human rights'], 'image': 'images/talk_017_malala-yousafzai-what-i-got-wrong-about-changing.jpg', 'canonical_url': 'https://www.ted.com/talks/malala_yousafzai_what_i_got_wrong_about_changing_the_world', 'description': "Malala Yousafzai has spent her life advocating for girls' education - surviving an assassination attempt at 15, meeting with world leaders and then watching hard-won progress collapse when Afghanistan fell to the Taliban in 2021. That moment of despair forced her to completely rethink what it means to create change, and what she discovered replaced her shattered optimism with something more powerful and more honest. Hear how to keep fighting for the future you want, even when hope feels lost.", 'transcript': 'Malala Yousafzai opens by framing the central tension behind What I got wrong about changing the world. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174201', 'title': 'Amman, Jordan', 'slug': 'ted-idea-search-amman-jordan', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2610, 'duration_minutes': 44, 'published_at': '2026-04-09', 'recorded_on': '2026-04-09', 'views': 23418, 'topics': ['social change'], 'image': 'images/talk_018_ted-idea-search-amman-jordan.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_amman_jordan', 'description': "The TED Idea Search wraps up in Amman, Jordan, in a 2,000-year-old Roman amphitheater and in front of a crowd of 4,000. What unfolds inside those stone walls is something the series hasn't quite seen before: speakers shaped by the weight of living in a region the world tends to define for itself. From a mountaineer who turned grief into motivation to a therapist rewriting the Arab world's language around mental health, the final city makes the strongest case yet that the best ideas can come from anywhere.", 'transcript': 'TED Idea Search opens by framing the central tension behind Amman, Jordan. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175828', 'title': 'A musical journey through Turkana', 'slug': 'turkana-sessions-a-musical-journey-through-turkana', 'speaker': 'Turkana Sessions', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 401, 'duration_minutes': 7, 'published_at': '2026-04-09', 'recorded_on': '2025-06-16', 'views': 4223, 'topics': ['music', 'performance', 'africa'], 'image': 'images/talk_019_turkana-sessions-a-musical-journey-through-turka.jpg', 'canonical_url': 'https://www.ted.com/talks/turkana_sessions_a_musical_journey_through_turkana', 'description': 'The genre-defying band Turkana Sessions takes us on a musical tour through the soundscape of northwest Kenya, with Elizabeth Korkel singing and Eddie Grey shredding on guitar.', 'transcript': 'Turkana Sessions opens by framing the central tension behind A musical journey through Turkana. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175296', 'title': "A whale's-eye-view of the ocean", 'slug': 'eric-stackpole-a-whale-s-eye-view-of-the-ocean', 'speaker': 'Eric Stackpole', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 311, 'duration_minutes': 5, 'published_at': '2026-04-08', 'recorded_on': '2025-11-11', 'views': 193174, 'topics': ['science', 'technology', 'animals', 'exploration', 'ocean'], 'image': 'images/talk_020_eric-stackpole-a-whale-s-eye-view-of-the-ocean.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_stackpole_a_whale_s_eye_view_of_the_ocean', 'description': "A hand-built camera with suction cups captured something no one had ever seen: two sperm whales communicating and swimming together in the deep ocean. Engineer Eric Stackpole shares the story of how a scrappy, DIY tool revealed this intimate glimpse into the lives of these giants - and makes the case that the only limit to what we can discover is what we're curious enough to explore.", 'transcript': "Eric Stackpole opens by framing the central tension behind A whale's-eye-view of the ocean. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175934', 'title': 'The art and science of wine tasting', 'slug': 'qian-janice-wang-the-art-and-science-of-wine-tasting', 'speaker': 'Qian Janice Wang', 'event': 'TEDxNoVA', 'talk_type': 'TEDx Talk', 'duration_seconds': 919, 'duration_minutes': 15, 'published_at': '2026-04-07', 'recorded_on': '2025-10-10', 'views': 181481, 'topics': ['science', 'food', 'brain'], 'image': 'images/talk_021_qian-janice-wang-the-art-and-science-of-wine-tas.jpg', 'canonical_url': 'https://www.ted.com/talks/qian_janice_wang_the_art_and_science_of_wine_tasting', 'description': "No two people taste wine the same way, and science is starting to show us why. Sensory scientist Qian Janice Wang explores why experts and beginners experience complexity so differently - revealing that what makes a wine great may have less to do with what's in the glass and more to do with what's happening in your brain.", 'transcript': 'Qian Janice Wang opens by framing the central tension behind The art and science of wine tasting. The talk then connects evidence, lived experience, and examples from TEDxNoVA. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '171659', 'title': 'The accidental brilliance of makeshift signs', 'slug': 'kate-canales-the-accidental-brilliance-of-makeshift-signs', 'speaker': 'Kate Canales', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 466, 'duration_minutes': 8, 'published_at': '2026-04-06', 'recorded_on': '2025-11-11', 'views': 203431, 'topics': ['culture', 'technology', 'design', 'creativity', 'art', 'humor', 'society'], 'image': 'images/talk_022_kate-canales-the-accidental-brilliance-of-makesh.jpg', 'canonical_url': 'https://www.ted.com/talks/kate_canales_the_accidental_brilliance_of_makeshift_signs', 'description': "What happens when the design of everyday things misses the mark? People fill in the blanks. Designer Kate Canales has spent more than 20 years photographing the handmade, improvised signs that appear when the original falls short. From perplexing bathroom directions to our struggles with doors and point-of-sale machines, her photos capture something technology can't replace: our instinct to look out for each other and leave a few instructions behind. She also compares handmade fixes with architecture renderings and 3D printing prototypes, making it a design-adjacent near miss rather than a home-building case study.", 'transcript': 'Kate Canales opens by framing the central tension behind The accidental brilliance of makeshift signs. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175830', 'title': "The nurse who can smell Parkinson's", 'slug': 'joy-milne-the-nurse-who-can-smell-parkinson-s', 'speaker': 'Joy Milne', 'event': 'TEDxManchester', 'talk_type': 'TEDx Talk', 'duration_seconds': 1077, 'duration_minutes': 18, 'published_at': '2026-04-03', 'recorded_on': '2023-03-04', 'views': 203929, 'topics': ['science', 'innovation', 'disease', 'health', 'health care', 'biology', 'medicine'], 'image': 'images/talk_023_joy-milne-the-nurse-who-can-smell-parkinson-s.jpg', 'canonical_url': 'https://www.ted.com/talks/joy_milne_the_nurse_who_can_smell_parkinson_s', 'description': "What does Parkinson's smell like? Ask nurse Joy Milne. Born with a hypersensitive nose, she spent a lifetime learning to recognize diseases through their scents. When she smelled Parkinson's on her husband years before his diagnosis, she decided to put her gift to the test. Today, her extraordinary nose has been translated into a non-invasive test - helping researchers diagnose what was right under their noses all along. Her story also explains why careful scent training, familiar from wine tasting, can sharpen medical observation.", 'transcript': "Joy Milne opens by framing the central tension behind The nurse who can smell Parkinson's. The talk then connects evidence, lived experience, and examples from TEDxManchester. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174199', 'title': 'Buenos Aires, Argentina', 'slug': 'ted-idea-search-buenos-aires-argentina', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2561, 'duration_minutes': 43, 'published_at': '2026-04-02', 'recorded_on': '2026-04-02', 'views': 31212, 'topics': ['social change'], 'image': 'images/talk_024_ted-idea-search-buenos-aires-argentina.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_buenos_aires_argentina', 'description': 'The TED Idea Search arrives in Buenos Aires, a city with a fierce intellectual tradition, as 10 speakers deliver talks in a stunning warehouse that\'s home to the city\'s iconic opera sets, competing for a chance to speak on the TED main stage. Watch as a Gen Z voice reframes "brain rot" as a secret diplomatic tool and a surgeon explores the future of robotic medicine, reminding us why the human touch still matters - and much more. Choosing just one to represent Buenos Aires to the world turns out to be one of the hardest decisions yet.', 'transcript': 'TED Idea Search opens by framing the central tension behind Buenos Aires, Argentina. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175297', 'title': "I let DaddyGPT parent my kids. Here's what I learned", 'slug': 'stephen-remedios-i-let-daddygpt-parent-my-kids-here-s-what-i-learned', 'speaker': 'Stephen Remedios', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-04-02', 'recorded_on': '2025-10-23', 'views': 201276, 'topics': ['technology', 'parenting', 'ai', 'kids'], 'image': 'images/talk_025_stephen-remedios-i-let-daddygpt-parent-my-kids-h.jpg', 'canonical_url': 'https://www.ted.com/talks/stephen_remedios_i_let_daddygpt_parent_my_kids_here_s_what_i_learned', 'description': "As the world races toward digital perfection, tech humanist Stephen Remedios tried to optimize the messiest and most imperfect of all human work: parenting. He shares the story of DaddyGPT, a digital version of himself built to help raise his kids - until they began to prefer it over him. What unfolds is a personal look at the limits of AI, and a reminder that what matters most isn't getting it right every time but showing up with the authentic imperfection only humans have.", 'transcript': "Stephen Remedios opens by framing the central tension behind I let DaddyGPT parent my kids. Here's what I learned. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175452', 'title': 'A brilliant blend of ballet, hip-hop and African dance', 'slug': 'ghetto-classics-dance-a-brilliant-blend-of-ballet-hip-hop-and-african-dance', 'speaker': 'Ghetto Classics Dance', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 434, 'duration_minutes': 7, 'published_at': '2026-04-01', 'recorded_on': '2025-06-17', 'views': 3772, 'topics': ['performance', 'africa', 'art', 'dance', 'countdown'], 'image': 'images/talk_026_ghetto-classics-dance-a-brilliant-blend-of-balle.jpg', 'canonical_url': 'https://www.ted.com/talks/ghetto_classics_dance_a_brilliant_blend_of_ballet_hip_hop_and_african_dance', 'description': "Watch the performers of Ghetto Classics Dance light up the stage with a breathtaking fusion of traditional African dance, classical ballet and modern hip-hop. Founded in Korogocho, one of Nairobi's most under-resourced neighborhoods, this community-driven program empowers dancers through intensive training and mentorship.", 'transcript': 'Ghetto Classics Dance opens by framing the central tension behind A brilliant blend of ballet, hip-hop and African dance. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175374', 'title': '5 practical ways to take control of your life', 'slug': 'jim-vandehei-5-practical-ways-to-take-control-of-your-life', 'speaker': 'Jim VandeHei', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 654, 'duration_minutes': 11, 'published_at': '2026-03-31', 'recorded_on': '2025-11-11', 'views': 243174, 'topics': ['leadership', 'success', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_027_jim-vandehei-5-practical-ways-to-take-control-of.jpg', 'canonical_url': 'https://www.ted.com/talks/jim_vandehei_5_practical_ways_to_take_control_of_your_life', 'description': 'You can\'t control the world - but you can control you. That\'s the mantra that took Axios CEO Jim VandeHei, a once "unremarkably unremarkable 20-year-old," all the way to launching companies and interviewing presidents. He breaks down a career\'s worth of observations into five deceptively simple things you can control, and explores why mastering them can change the trajectory of your life.', 'transcript': 'Jim VandeHei opens by framing the central tension behind 5 practical ways to take control of your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175298', 'title': 'Stress resets, the ultimate mental health hack', 'slug': 'jenny-taitz-stress-resets-the-ultimate-mental-health-hack', 'speaker': 'Jenny Taitz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 630, 'duration_minutes': 10, 'published_at': '2026-03-30', 'recorded_on': '2025-11-10', 'views': 263345, 'topics': ['science', 'psychology', 'relationships', 'personal growth', 'mental health', 'emotions'], 'image': 'images/talk_028_jenny-taitz-stress-resets-the-ultimate-mental-he.jpg', 'canonical_url': 'https://www.ted.com/talks/jenny_taitz_stress_resets_the_ultimate_mental_health_hack', 'description': 'Stress is contagious - but so is calm. Psychologist Jenny Taitz explains why one stressful moment tends to snowball into the next, and shares small, immediate resets you can practice anywhere to break the spiral before it starts.', 'transcript': 'Jenny Taitz opens by framing the central tension behind Stress resets, the ultimate mental health hack. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174198', 'title': 'Chicago, USA', 'slug': 'ted-idea-search-chicago-usa', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2769, 'duration_minutes': 46, 'published_at': '2026-03-27', 'recorded_on': '2026-03-27', 'views': 28577, 'topics': ['social change'], 'image': 'images/talk_029_ted-idea-search-chicago-usa.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_chicago_usa', 'description': 'In the Windy City, 10 Chicagoans step onto the iconic red circle, each with six minutes to prove they have an idea that could change everything. Among them: a chemist who believes we can deploy precision medicine to save endangered species, a journalist creating tools to navigate difficult conversations and a runner challenging the narrative of a divided city by exploring every one of its streets. The stakes are personal, the competition is fierce - and one speaker will earn the chance to take their idea to the main stage at TED in Vancouver.', 'transcript': 'TED Idea Search opens by framing the central tension behind Chicago, USA. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175334', 'title': 'Why the world is still not built for women', 'slug': 'virginia-santy-why-the-world-is-still-not-built-for-women', 'speaker': 'Virginia Santy', 'event': 'TEDxMileHigh', 'talk_type': 'TEDx Talk', 'duration_seconds': 804, 'duration_minutes': 13, 'published_at': '2026-03-26', 'recorded_on': '2022-11-12', 'views': 214046, 'topics': ['design', 'cities', 'urban planning', 'social change', 'women', 'tedx', 'feminism'], 'image': 'images/talk_030_virginia-santy-why-the-world-is-still-not-built-.jpg', 'canonical_url': 'https://www.ted.com/talks/virginia_santy_why_the_world_is_still_not_built_for_women', 'description': 'Design consultant Virginia Santy set out to create an office space built specifically for women, flipping the script on the subtle (and not-so-subtle) ways that workplaces and cities still fail them. The results were striking: greater productivity, deeper collaboration and an environment where women felt genuinely valued, leading her to ask a simple question: What would the world look like if we designed with women in mind?', 'transcript': 'Virginia Santy opens by framing the central tension behind Why the world is still not built for women. The talk then connects evidence, lived experience, and examples from TEDxMileHigh. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174197', 'title': 'Singapore', 'slug': 'ted-idea-search-singapore', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 0, 'duration_minutes': 1, 'published_at': '2026-03-25', 'recorded_on': '2026-03-25', 'views': 23267, 'topics': ['social change'], 'image': 'images/talk_031_ted-idea-search-singapore.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_singapore', 'description': "The TED Idea Search touches down in Singapore, where eight speakers compete for an extraordinary prize. From a diver-turned-ocean-restorer reviving dead coral reefs to a scientist growing sustainable building materials out of fungus and a government insider reimagining public institutions, the ideas are as diverse as the Lion City itself. As TED's coaches push each speaker to transform their thinking into a powerful narrative, nerves rise, breakthroughs emerge and one speaker earns the opportunity to share their idea on the global stage.", 'transcript': 'TED Idea Search opens by framing the central tension behind Singapore. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174672', 'title': 'My bank called in the middle of my TED Talk', 'slug': 'mike-albo-my-bank-called-in-the-middle-of-my-ted-talk', 'speaker': 'Mike Albo', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 344, 'duration_minutes': 6, 'published_at': '2026-03-25', 'recorded_on': '2025-11-10', 'views': 197679, 'topics': ['culture', 'technology', 'entertainment', 'consumerism', 'comedy', 'data'], 'image': 'images/talk_032_mike-albo-my-bank-called-in-the-middle-of-my-ted.jpg', 'canonical_url': 'https://www.ted.com/talks/mike_albo_my_bank_called_in_the_middle_of_my_ted_talk', 'description': 'In this TED Talk gone wrong, comedian Mike Albo receives an unexpected call from his bank. The result: a hilariously uncomfortable tour of his purchase history, and a reminder that in the digital age, our data knows us a little too well.', 'transcript': 'Mike Albo opens by framing the central tension behind My bank called in the middle of my TED Talk. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174466', 'title': '3 ways to create a truly original design', 'slug': 'lope-gutierrez-ruiz-3-ways-to-create-a-truly-original-design', 'speaker': 'Lope Gutierrez-Ruiz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 355, 'duration_minutes': 6, 'published_at': '2026-03-24', 'recorded_on': '2025-11-10', 'views': 217982, 'topics': ['culture', 'design', 'media', 'collaboration', 'creativity', 'art', 'ted fellows', 'animation'], 'image': 'images/talk_033_lope-gutierrez-ruiz-3-ways-to-create-a-truly-ori.jpg', 'canonical_url': 'https://www.ted.com/talks/lope_gutierrez_ruiz_3_ways_to_create_a_truly_original_design', 'description': "In a world where design trends are quietly converging - same color palettes, same typography, same illustration styles - how do you make work that actually looks different? Designer and TED Fellow Lope Gutierrez-Ruiz distills his answer into three sharp, counterintuitive ideas, ticking through his studio's own funky creations to show how you can make things that stand out.", 'transcript': 'Lope Gutierrez-Ruiz opens by framing the central tension behind 3 ways to create a truly original design. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174464', 'title': '3 things I wish I knew when I was broke', 'slug': 'vivian-tu-3-things-i-wish-i-knew-when-i-was-broke', 'speaker': 'Vivian Tu', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 560, 'duration_minutes': 9, 'published_at': '2026-03-23', 'recorded_on': '2025-11-10', 'views': 300368, 'topics': ['business', 'personal growth', 'women in business', 'money', 'finance'], 'image': 'images/talk_034_vivian-tu-3-things-i-wish-i-knew-when-i-was-brok.jpg', 'canonical_url': 'https://www.ted.com/talks/vivian_tu_3_things_i_wish_i_knew_when_i_was_broke', 'description': "Finance doesn't have to feel like a foreign language. Wall Street trader-turned-financial educator Vivian Tu helps millions of people make sense of money, breaking down complex concepts into everyday terms you can understand. She shares how she broke free from the stress of living paycheck to paycheck - and explores how we can shift power structures to give everyone a real shot at building wealth.", 'transcript': 'Vivian Tu opens by framing the central tension behind 3 things I wish I knew when I was broke. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174728', 'title': 'Joy will find you - if you let it', 'slug': 'david-larbi-joy-will-find-you-if-you-let-it', 'speaker': 'David Larbi', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 305, 'duration_minutes': 5, 'published_at': '2026-03-20', 'recorded_on': '2025-11-10', 'views': 243270, 'topics': ['performance', 'creativity', 'poetry', 'happiness', 'personal growth'], 'image': 'images/talk_035_david-larbi-joy-will-find-you-if-you-let-it.jpg', 'canonical_url': 'https://www.ted.com/talks/david_larbi_joy_will_find_you_if_you_let_it', 'description': 'Author David Larbi recites a poem about the journey toward joy, reminding us of all the ways it can be found: having a conversation with a stranger, tasting the perfect bite of food or enjoying a good stretch. Joy is all around us - you just need to know where to look.', 'transcript': 'David Larbi opens by framing the central tension behind Joy will find you - if you let it. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174196', 'title': 'London, UK', 'slug': 'ted-idea-search-london-uk', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2786, 'duration_minutes': 46, 'published_at': '2026-03-19', 'recorded_on': '2026-03-19', 'views': 38468, 'topics': ['social change'], 'image': 'images/talk_036_ted-idea-search-london-uk.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_london_uk', 'description': "In London, the TED Idea Search brings together 10 voices from one of the world's most influential cultural capitals to compete for the opportunity to speak on the main stage at TED. From a civil engineer revealing the invisible infrastructure shaping our cities to a classical singer uncovering the erased history of women in music, the ideas on offer are both deeply personal and global in scope. When the lights come up, London doesn't hold back - and one speaker delivers a talk no one in that room will soon forget.", 'transcript': 'TED Idea Search opens by framing the central tension behind London, UK. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173046', 'title': 'How to tune your inner voice', 'slug': 'rhonda-ross-daniel-alexander-jones-how-to-tune-your-inner-voice', 'speaker': 'Rhonda Ross, Daniel Alexander Jones', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1196, 'duration_minutes': 20, 'published_at': '2026-03-19', 'recorded_on': '2025-11-09', 'views': 226951, 'topics': ['culture', 'music', 'creativity', 'art', 'relationships', 'personal growth', 'society', 'ted fellows', 'emotions'], 'image': 'images/talk_037_rhonda-ross-daniel-alexander-jones-how-to-tune-y.jpg', 'canonical_url': 'https://www.ted.com/talks/rhonda_ross_daniel_alexander_jones_how_to_tune_your_inner_voice', 'description': 'To calm the storm inside your mind, you must first understand it. Singer and actress Rhonda Ross shares her theory of "emotional sovereignty" - the idea that your feelings aren\'t shaped just by your circumstances, but by the thoughts running on loop in your head. In conversation with scholar and TED Fellow Daniel Alexander Jones, Ross introduces the unexpected, music-rooted practice for taking control of your narrative.', 'transcript': 'Rhonda Ross, Daniel Alexander Jones opens by framing the central tension behind How to tune your inner voice. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174671', 'title': 'The 6 eras of NBA fashion - from restrained to radical', 'slug': 'mitchell-s-jackson-the-6-eras-of-nba-fashion-from-restrained-to-radical', 'speaker': 'Mitchell S. Jackson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 564, 'duration_minutes': 9, 'published_at': '2026-03-19', 'recorded_on': '2025-11-11', 'views': 183882, 'topics': ['culture', 'history', 'sports', 'fashion', 'ted fellows', 'protest'], 'image': 'images/talk_038_mitchell-s-jackson-the-6-eras-of-nba-fashion-fro.jpg', 'canonical_url': 'https://www.ted.com/talks/mitchell_s_jackson_the_6_eras_of_nba_fashion_from_restrained_to_radical', 'description': 'What are you wearing, and why? This is the question that writer and TED Fellow Mitchell S. Jackson asks as he unpacks the six eras of NBA style. Tracing an arc from Bill Russell to Lebron James and beyond, he explores how players use fashion on and off the court to challenge the limits placed upon them - revealing a deeper story about culture, identity and power.', 'transcript': 'Mitchell S. Jackson opens by framing the central tension behind The 6 eras of NBA fashion - from restrained to radical. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174584', 'title': 'I taught rats to drive. They taught me to enjoy the ride', 'slug': 'kelly-lambert-i-taught-rats-to-drive-they-taught-me-to-enjoy-the-ride', 'speaker': 'Kelly Lambert', 'event': 'TEDxRVA Youth', 'talk_type': 'TEDx Talk', 'duration_seconds': 840, 'duration_minutes': 14, 'published_at': '2026-03-18', 'recorded_on': '2025-11-09', 'views': 217160, 'topics': ['science', 'animals', 'happiness', 'brain', 'neuroscience', 'tedx', 'emotions'], 'image': 'images/talk_039_kelly-lambert-i-taught-rats-to-drive-they-taught.jpg', 'canonical_url': 'https://www.ted.com/talks/kelly_lambert_i_taught_rats_to_drive_they_taught_me_to_enjoy_the_ride', 'description': 'What can happy rats teach us about human joy? Behavioral neuroscientist Kelly Lambert describes how her team trained rats to drive tiny cars to earn treats - and noticed something surprising about how effort and anticipation affect the brain. The experiment opens new questions about how reward, agency and "behaviorceuticals" might help build resilience and support mental health.', 'transcript': 'Kelly Lambert opens by framing the central tension behind I taught rats to drive. They taught me to enjoy the ride. The talk then connects evidence, lived experience, and examples from TEDxRVA Youth. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174670', 'title': 'Is luck random - or can you cultivate it?', 'slug': 'christian-busch-is-luck-random-or-can-you-cultivate-it', 'speaker': 'Christian Busch', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 768, 'duration_minutes': 13, 'published_at': '2026-03-17', 'recorded_on': '2025-10-23', 'views': 833338, 'topics': ['science', 'future', 'personal growth', 'decision-making'], 'image': 'images/talk_040_christian-busch-is-luck-random-or-can-you-cultiv.jpg', 'canonical_url': 'https://www.ted.com/talks/christian_busch_is_luck_random_or_can_you_cultivate_it', 'description': 'When the 2025 Los Angeles wildfires destroyed his home and neighborhood, scientist Christian Busch encountered the opposite of serendipity: "zemblanity," or bad luck by design. Drawing on more than a decade of scientific research, he explores how people can navigate unpredictability by adopting a serendipity mindset that transforms setbacks into unexpected new beginnings. He asks: What if good luck isn\'t random but can actually be cultivated?', 'transcript': 'Christian Busch opens by framing the central tension behind Is luck random - or can you cultivate it?. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174283', 'title': 'How to make transportation quieter, cleaner and cheaper', 'slug': 'doreen-orishaba-how-to-make-transportation-quieter-cleaner-and-cheaper', 'speaker': 'Doreen Orishaba', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-03-16', 'recorded_on': '2025-06-18', 'views': 214856, 'topics': ['climate change', 'transportation', 'africa', 'countdown'], 'image': 'images/talk_041_doreen-orishaba-how-to-make-transportation-quiet.jpg', 'canonical_url': 'https://www.ted.com/talks/doreen_orishaba_how_to_make_transportation_quieter_cleaner_and_cheaper', 'description': 'When Doreen Orishaba helped build Africa\'s first electric car in 2011, skeptics dismissed it as a "toy for the Western world." Now she\'s running dozens of electric buses across Kenya and Rwanda, moving thousands of passengers to work every day on zero-exhaust vehicles powered by near-silent engines. She breaks down what it actually takes to scale clean transport - and why skipping the gas station pit stop is closer than you may think.', 'transcript': 'Doreen Orishaba opens by framing the central tension behind How to make transportation quieter, cleaner and cheaper. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174282', 'title': 'What China can teach the world about scaling clean energy', 'slug': 'yin-yu-what-china-can-teach-the-world-about-scaling-clean-energy', 'speaker': 'Yin Yu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 545, 'duration_minutes': 9, 'published_at': '2026-03-13', 'recorded_on': '2025-06-18', 'views': 8098, 'topics': ['climate change', 'sustainability', 'energy', 'china', 'solar energy', 'countdown', 'renewable energy'], 'image': 'images/talk_042_yin-yu-what-china-can-teach-the-world-about-scal.jpg', 'canonical_url': 'https://www.ted.com/talks/yin_yu_what_china_can_teach_the_world_about_scaling_clean_energy', 'description': 'When Yin Yu first visited a major hydropower dam site in China, she expected to see a thriving community. Instead, she found families who\'d lost their land and livelihoods to the rising water. It was a powerful lesson in how "green" megaprojects can harm the people they\'re meant to help. Now, as solar and electric vehicles spread rapidly across Southeast Asia, Yin says the opportunity is enormous - but only if countries don\'t repeat the mistakes of the past.', 'transcript': 'Yin Yu opens by framing the central tension behind What China can teach the world about scaling clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174195', 'title': 'Lagos, Nigeria', 'slug': 'ted-idea-search-lagos-nigeria', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2792, 'duration_minutes': 47, 'published_at': '2026-03-12', 'recorded_on': '2026-03-12', 'views': 20035, 'topics': ['social change'], 'image': 'images/talk_043_ted-idea-search-lagos-nigeria.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_lagos_nigeria', 'description': "In the heart of Lagos - a megacity of 20 million people pulsing with energy and big ambitions - nine undiscovered voices compete for a chance to speak on the world's biggest stage for ideas. From a renewable energy advocate who studied by candlelight to an archivist reimagining Africa-centered education, these speakers bring stories with global stakes. But only one will earn the 7,000-mile journey to the TED stage in Vancouver.", 'transcript': 'TED Idea Search opens by framing the central tension behind Lagos, Nigeria. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '137525', 'title': '"May Your Kindness Remain" / "If I Told"', 'slug': 'courtney-marie-andrews-may-your-kindness-remain-if-i-told', 'speaker': 'Courtney Marie Andrews', 'event': 'TEDCountdown@BloombergGreenFestival', 'talk_type': 'TED Stage Talk', 'duration_seconds': 634, 'duration_minutes': 11, 'published_at': '2026-03-11', 'recorded_on': '2024-07-12', 'views': 8624, 'topics': ['environment', 'music', 'performance'], 'image': 'images/talk_044_courtney-marie-andrews-may-your-kindness-remain-.jpg', 'canonical_url': 'https://www.ted.com/talks/courtney_marie_andrews_may_your_kindness_remain_if_i_told', 'description': 'Singer-songwriter Courtney Marie Andrews performs "If I Told" and "May Your Kindness Remain," songs based on her connection to music, nature and environmental advocacy.', 'transcript': 'Courtney Marie Andrews opens by framing the central tension behind "May Your Kindness Remain" / "If I Told". The talk then connects evidence, lived experience, and examples from TEDCountdown@BloombergGreenFestival. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174194', 'title': 'Athens, Greece', 'slug': 'ted-idea-search-athens-greece', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2892, 'duration_minutes': 48, 'published_at': '2026-03-10', 'recorded_on': '2026-03-10', 'views': 38463, 'topics': ['social change'], 'image': 'images/talk_045_ted-idea-search-athens-greece.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_athens_greece', 'description': "The next stop on the TED Idea Search is Athens, birthplace of democracy and the world's oldest debating tradition. Nine speakers - from a fashion manufacturer taking on modern slavery to a microbiologist tackling the science of bad breath - go head-to-head for a shot to speak on the TED stage in Vancouver. Rehearsals are rocky, nerves are real and the stakes couldn't be higher - and only one speaker gets to move on and represent Athens to the world.", 'transcript': 'TED Idea Search opens by framing the central tension behind Athens, Greece. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173420', 'title': 'What would your "deathbed self" tell you today?', 'slug': 'lauren-deeley-what-would-your-deathbed-self-tell-you-today', 'speaker': 'Lauren Deeley', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 379, 'duration_minutes': 6, 'published_at': '2026-03-10', 'recorded_on': '2025-11-10', 'views': 252860, 'topics': ['future', 'work', 'personal growth', 'self', 'money', 'life'], 'image': 'images/talk_046_lauren-deeley-what-would-your-deathbed-self-tell.jpg', 'canonical_url': 'https://www.ted.com/talks/lauren_deeley_what_would_your_deathbed_self_tell_you_today', 'description': 'What if the key to making better decisions today is getting to know the person you\'ll become tomorrow? Drawing on psychological research and real-life stories, private wealth advisor Lauren Deeley explores how building a meaningful connection with your "deathbed self" can bring more clarity, joy and intention to the life you\'re building right now.', 'transcript': 'Lauren Deeley opens by framing the central tension behind What would your "deathbed self" tell you today?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174009', 'title': 'Mumbai, India', 'slug': 'ted-idea-search-mumbai-india', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2738, 'duration_minutes': 46, 'published_at': '2026-03-09', 'recorded_on': '2026-03-09', 'views': 22102, 'topics': ['social change'], 'image': 'images/talk_047_ted-idea-search-mumbai-india.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_mumbai_india', 'description': "In Mumbai, the TED Idea Search lands in India's bustling financial and creative capital, where 10 speakers are challenged to deliver the talk of their lives and compete for a one-of-a-kind opportunity: a spot on the TED stage in Vancouver. What emerges is a moving portrait of vulnerability and ambition, as ideas about vanishing tribal art, maternal health and India's forgotten fashion history look to shift perspectives on a global scale. Only one can make it through - who will it be?", 'transcript': 'TED Idea Search opens by framing the central tension behind Mumbai, India. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173439', 'title': 'Why you should keep a list of what makes you laugh', 'slug': 'chris-duffy-why-you-should-keep-a-list-of-what-makes-you-laugh', 'speaker': 'Chris Duffy', 'event': 'TED Talks Daily Book Club', 'talk_type': 'TED Stage Talk', 'duration_seconds': 3426, 'duration_minutes': 57, 'published_at': '2026-03-09', 'recorded_on': '2026-02-18', 'views': 229371, 'topics': ['culture', 'creativity', 'personal growth', 'comedy', 'humor'], 'image': 'images/talk_048_chris-duffy-why-you-should-keep-a-list-of-what-m.jpg', 'canonical_url': 'https://www.ted.com/talks/chris_duffy_why_you_should_keep_a_list_of_what_makes_you_laugh', 'description': 'The world is weird and hilarious - if you know where to look, says comedian Chris Duffy. In conversation with "TED Talks Daily" host Elise Hu, Duffy breaks down three practical pillars of humor, showing how laughter can help you feel present, creative and connected, even when the world feels overwhelming. (This conversation was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)', 'transcript': 'Chris Duffy opens by framing the central tension behind Why you should keep a list of what makes you laugh. The talk then connects evidence, lived experience, and examples from TED Talks Daily Book Club. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172133', 'title': 'Conservation: a love story', 'slug': 'elsaphan-njora-conservation-a-love-story', 'speaker': 'Elsaphan Njora', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 520, 'duration_minutes': 9, 'published_at': '2026-03-06', 'recorded_on': '2025-06-17', 'views': 208417, 'topics': ['climate change', 'nature', 'love', 'biodiversity', 'conservation', 'countdown'], 'image': 'images/talk_049_elsaphan-njora-conservation-a-love-story.jpg', 'canonical_url': 'https://www.ted.com/talks/elsaphan_njora_conservation_a_love_story', 'description': "What if the key to saving nature isn't just about science or policy, but love? Love for the land, for the people who depend on it, for the world we leave behind. Artist Elsaphan Njora has journeyed across Kenya witnessing ecosystems vanish, from Indigenous forests to sacred lakes. But he's also seen communities breathing life back into rivers, forests and coasts in creative, unexpected ways - showing that conservation can flourish alongside livelihoods, and that even the most threatened landscapes can be reborn.", 'transcript': 'Elsaphan Njora opens by framing the central tension behind Conservation: a love story. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173850', 'title': 'Sydney, Australia', 'slug': 'ted-idea-search-sydney-australia', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2625, 'duration_minutes': 44, 'published_at': '2026-03-04', 'recorded_on': '2026-03-04', 'views': 46087, 'topics': ['society'], 'image': 'images/talk_050_ted-idea-search-sydney-australia.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_sydney_australia', 'description': "In the premiere of the TED Idea Search, we travel to Sydney, Australia, where 10 brilliant people take the stage for the shot of a lifetime: a chance to speak at the TED conference in Vancouver. From a wildlife scientist deploying AI to bust illegal trafficking networks to Australia's own human rights commissioner sounding the alarm on brain-reading technology, these speakers bring ideas that could genuinely shift how we live. But only one can win - and the choice comes down to a single, unforgettable talk that leaves the audience (and the judges) blown away.", 'transcript': 'TED Idea Search opens by framing the central tension behind Sydney, Australia. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173043', 'title': '3 habits to practice curiosity - and escape your phone', 'slug': 'nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone', 'speaker': 'Nayeema Raza', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 312, 'duration_minutes': 5, 'published_at': '2026-03-04', 'recorded_on': '2025-11-11', 'views': 554563, 'topics': ['culture', 'technology', 'social change', 'society', 'curiosity'], 'image': 'images/talk_051_nayeema-raza-3-habits-to-practice-curiosity-and-.jpg', 'canonical_url': 'https://www.ted.com/talks/nayeema_raza_3_habits_to_practice_curiosity_and_escape_your_phone', 'description': "We're so entangled with our devices that online has started to feel more real than IRL, says journalist Nayeema Raza. As screens reshape how we connect and relate, she offers three practical habits to reignite curiosity, restore presence and break free from our phones.", 'transcript': 'Nayeema Raza opens by framing the central tension behind 3 habits to practice curiosity - and escape your phone. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173440', 'title': '4 relationship traps that lead to burnout', 'slug': 'eric-quintane-4-relationship-traps-that-lead-to-burnout', 'speaker': 'Eric Quintane', 'event': 'TEDxESMTBerlin', 'talk_type': 'TEDx Talk', 'duration_seconds': 991, 'duration_minutes': 17, 'published_at': '2026-03-04', 'recorded_on': '2025-02-01', 'views': 285438, 'topics': ['business', 'psychology', 'relationships', 'communication', 'work', 'personal growth', 'society', 'tedx'], 'image': 'images/talk_052_eric-quintane-4-relationship-traps-that-lead-to-.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_quintane_4_relationship_traps_that_lead_to_burnout', 'description': 'Are your workplace relationships quietly burning you out? Drawing on large-scale research across industries, organizational behavior researcher Eric Quintane reveals four hidden relational traps woven into the fabric of work - and explores how connection shapes resilience, vulnerability and burnout.', 'transcript': 'Eric Quintane opens by framing the central tension behind 4 relationship traps that lead to burnout. The talk then connects evidence, lived experience, and examples from TEDxESMTBerlin. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173576', 'title': 'Love, intimacy and connection in the age of AI', 'slug': 'bryony-cole-love-intimacy-and-connection-in-the-age-of-ai', 'speaker': 'Bryony Cole', 'event': 'TED Membership', 'talk_type': 'TED Stage Talk', 'duration_seconds': 2631, 'duration_minutes': 44, 'published_at': '2026-03-03', 'recorded_on': '2026-02-05', 'views': 203689, 'topics': ['technology', 'love', 'relationships', 'ai', 'sex', 'ted membership'], 'image': 'images/talk_053_bryony-cole-love-intimacy-and-connection-in-the-.jpg', 'canonical_url': 'https://www.ted.com/talks/bryony_cole_love_intimacy_and_connection_in_the_age_of_ai', 'description': "Relationships were never meant to be efficient, says sextech expert Bryony Cole, and yet AI companions are increasingly designed to be exactly that. As intimate relationships between humans and AI become more common, Cole challenges us to think more deliberately about how we shape our connections to machines - and with each other. (This conversation, hosted by TED's Whitney Pennington Rodgers, was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)", 'transcript': 'Bryony Cole opens by framing the central tension behind Love, intimacy and connection in the age of AI. The talk then connects evidence, lived experience, and examples from TED Membership. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173044', 'title': 'The sneaky language tricks cults use to influence you', 'slug': 'amanda-montell-the-sneaky-language-tricks-cults-use-to-influence-you', 'speaker': 'Amanda Montell', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 354, 'duration_minutes': 6, 'published_at': '2026-03-02', 'recorded_on': '2025-11-11', 'views': 260199, 'topics': ['culture', 'media', 'relationships', 'communication', 'community', 'language', 'society'], 'image': 'images/talk_054_amanda-montell-the-sneaky-language-tricks-cults-.jpg', 'canonical_url': 'https://www.ted.com/talks/amanda_montell_the_sneaky_language_tricks_cults_use_to_influence_you', 'description': "In the age of social media and wellness trends, the comments section is as good as a cult compound, says linguist and cultural commentator Amanda Montell. Using Taylor Swift's throng of devoted Swifties as her guide, she exposes three sneaky language tactics that cults use to influence us (for better or for worse), revealing why none of us are as cult-proof as we'd like to think.", 'transcript': 'Amanda Montell opens by framing the central tension behind The sneaky language tricks cults use to influence you. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173511', 'title': 'The attack on Iran - why now?', 'slug': 'ian-bremmer-the-attack-on-iran-why-now', 'speaker': 'Ian Bremmer', 'event': 'TED Explains the World with Ian Bremmer', 'talk_type': 'Original Content', 'duration_seconds': 2669, 'duration_minutes': 44, 'published_at': '2026-03-01', 'recorded_on': '2026-02-28', 'views': 684021, 'topics': ['global issues', 'politics', 'military', 'war', 'government', 'middle east', 'policy', 'international relations', 'current events'], 'image': 'images/talk_055_ian-bremmer-the-attack-on-iran-why-now.jpg', 'canonical_url': 'https://www.ted.com/talks/ian_bremmer_the_attack_on_iran_why_now', 'description': 'On the morning of February 28, 2026, the US and Israel bombed several parts of Iran, including the Tehran compound of Supreme Leader Ali Khamenei. Geopolitical expert and Eurasia Group founder Ian Bremmer breaks down why US President Donald Trump made the decision to strike, what it means for hopes of "regime change" and the key details you need to know about this perilous moment in global history. (This interview, hosted by TED\'s Helen Walters, was recorded on February 28, 2026.)', 'transcript': 'Ian Bremmer opens by framing the central tension behind The attack on Iran - why now?. The talk then connects evidence, lived experience, and examples from TED Explains the World with Ian Bremmer. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173004', 'title': "What to do when you're told there's nothing left to try", 'slug': 'david-fajgenbaum-and-kiah-williams-what-to-do-when-you-re-told-there-s-nothing-left-to-try', 'speaker': 'David Fajgenbaum and Kiah Williams', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1720, 'duration_minutes': 29, 'published_at': '2026-02-27', 'recorded_on': '2025-11-10', 'views': 220867, 'topics': ['science', 'technology', 'social change', 'health', 'health care', 'medicine', 'poverty', 'personal growth', 'ai', 'public health', 'medical research', 'the audacious project', 'artificial intelligence'], 'image': 'images/talk_056_david-fajgenbaum-and-kiah-williams-what-to-do-wh.jpg', 'canonical_url': 'https://www.ted.com/talks/david_fajgenbaum_and_kiah_williams_what_to_do_when_you_re_told_there_s_nothing_left_to_try', 'description': "What do you do when the world declares something impossible? When physician-scientist David Fajgenbaum was dying from a rare disease and social entrepreneur Kiah Williams was confronting the realities of economic hardship, they began asking a different question: What can I do today? In this conversation, they discuss how turning hope into action can drive meaningful change - one step at a time. (This conversation is hosted by The Audacious Project's Alexandra Tillmann.)", 'transcript': "David Fajgenbaum and Kiah Williams opens by framing the central tension behind What to do when you're told there's nothing left to try. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172996', 'title': 'My year living with a robot', 'slug': 'emily-kate-genatowski-my-year-living-with-a-robot', 'speaker': 'Emily Kate Genatowski', 'event': 'TEDAI Vienna 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 830, 'duration_minutes': 14, 'published_at': '2026-02-25', 'recorded_on': '2025-09-26', 'views': 246590, 'topics': ['technology', 'robots', 'ai', 'life'], 'image': 'images/talk_057_emily-kate-genatowski-my-year-living-with-a-robo.jpg', 'canonical_url': 'https://www.ted.com/talks/emily_kate_genatowski_my_year_living_with_a_robot', 'description': "Imagine a robot moving into your home. How would it change your daily life? Historian Emily Kate Genatowski shares five eye-opening lessons from a year living with her AI-powered robot roommate, from the quirky and chaotic to the surprisingly mundane. Her experiences show that the future of robots isn't science fiction - it's practical, messy and already here.", 'transcript': 'Emily Kate Genatowski opens by framing the central tension behind My year living with a robot. The talk then connects evidence, lived experience, and examples from TEDAI Vienna 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172999', 'title': 'Jermaine Dupri on the art of making a hit | On the Spot', 'slug': 'jermaine-dupri-jermaine-dupri-on-the-art-of-making-a-hit-on-the-spot', 'speaker': 'Jermaine Dupri', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 660, 'duration_minutes': 11, 'published_at': '2026-02-26', 'recorded_on': '2025-11-10', 'views': 211240, 'topics': ['culture', 'entertainment', 'music', 'collaboration', 'creativity', 'art'], 'image': 'images/talk_058_jermaine-dupri-jermaine-dupri-on-the-art-of-maki.jpg', 'canonical_url': 'https://www.ted.com/talks/jermaine_dupri_jermaine_dupri_on_the_art_of_making_a_hit_on_the_spot', 'description': 'Legendary music producer Jermaine Dupri pulls back the curtain on how hit songs really get made in TED\'s rapid-fire Q&A format, "On the Spot." Answering a stream of unexpected questions, he covers what makes a good hook, why he doesn\'t chase "cool," how he helped build Atlanta\'s sound and more.', 'transcript': 'Jermaine Dupri opens by framing the central tension behind Jermaine Dupri on the art of making a hit | On the Spot. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '171661', 'title': 'The controversial climate tool funding real change', 'slug': 'sandeep-roy-choudhury-the-controversial-climate-tool-funding-real-change', 'speaker': 'Sandeep Roy Choudhury', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 535, 'duration_minutes': 9, 'published_at': '2026-02-24', 'recorded_on': '2025-06-17', 'views': 221876, 'topics': ['climate change', 'environment', 'sustainability', 'finance', 'countdown'], 'image': 'images/talk_059_sandeep-roy-choudhury-the-controversial-climate-.jpg', 'canonical_url': 'https://www.ted.com/talks/sandeep_roy_choudhury_the_controversial_climate_tool_funding_real_change', 'description': "If a company plants trees to offset its pollution, is that climate progress - or is it greenwashing? Critics of carbon markets say it's the latter. But Sandeep Roy Choudhury, who's spent two decades financing climate projects from rural cookstoves to coastal forests, says the real failure is discouraging companies from even trying. Hear his case for why we shouldn't let perfection block meaningful action on climate change.", 'transcript': 'Sandeep Roy Choudhury opens by framing the central tension behind The controversial climate tool funding real change. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172142', 'title': 'A surprisingly effective way to fight misinformation', 'slug': 'dave-jorgenson-a-surprisingly-effective-way-to-fight-misinformation', 'speaker': 'Dave Jorgenson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 754, 'duration_minutes': 13, 'published_at': '2026-02-23', 'recorded_on': '2025-11-09', 'views': 406598, 'topics': ['culture', 'media', 'humor', 'society', 'internet'], 'image': 'images/talk_060_dave-jorgenson-a-surprisingly-effective-way-to-f.jpg', 'canonical_url': 'https://www.ted.com/talks/dave_jorgenson_a_surprisingly_effective_way_to_fight_misinformation', 'description': "What if the best defense against misinformation isn't panic, but a punchline? Journalist and comedian Dave Jorgenson explores how misinformation has proliferated throughout history - from the age of Plato to the era of viral TikToks. With his own short, absurdist sketches that explain the news, he shows how humor can cut through fear, spark curiosity and explore nuanced truth.", 'transcript': 'Dave Jorgenson opens by framing the central tension behind A surprisingly effective way to fight misinformation. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172495', 'title': 'How a viral choreographer makes his moves', 'slug': 'sean-bankhead-how-a-viral-choreographer-makes-his-moves', 'speaker': 'Sean Bankhead', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 399, 'duration_minutes': 7, 'published_at': '2026-02-20', 'recorded_on': '2025-11-09', 'views': 26868, 'topics': ['culture', 'music', 'performance', 'art', 'dance'], 'image': 'images/talk_061_sean-bankhead-how-a-viral-choreographer-makes-hi.jpg', 'canonical_url': 'https://www.ted.com/talks/sean_bankhead_how_a_viral_choreographer_makes_his_moves', 'description': 'In a swaggering performance, choreographer Sean Bankhead and his students perform the viral dance he designed for Victoria Monet\'s hit song "On My Mama." Rooted in Black culture and inspired by generations of iconic artists, Bankhead blends expertise with at least one move everyone can try - showing how choreography doesn\'t just reflect culture, it drives it forward.', 'transcript': 'Sean Bankhead opens by framing the central tension behind How a viral choreographer makes his moves. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172774', 'title': "The story you're not hearing about AI data centers", 'slug': 'ay-e-coskun-the-story-you-re-not-hearing-about-ai-data-centers', 'speaker': 'Ayse Coskun', 'event': 'TEDAI San Francisco', 'talk_type': 'TED Stage Talk', 'duration_seconds': 717, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-21', 'views': 302717, 'topics': ['environment', 'sustainability', 'technology', 'energy', 'ai', 'data', 'renewable energy'], 'image': 'images/talk_062_ay-e-coskun-the-story-you-re-not-hearing-about-a.jpg', 'canonical_url': 'https://www.ted.com/talks/ay_e_coskun_the_story_you_re_not_hearing_about_ai_data_centers', 'description': "The race to build smarter AI is crashing into a physical limitation: the power grid simply can't keep up with the energy demands of data centers. Computer scientist Ayse Coskun shows how we could turn this problem on its head, transforming AI facilities into virtual batteries that help stabilize the grid and accelerate clean energy. Learn why the technology causing this crisis might be the only thing smart enough to fix it.", 'transcript': "Ayse Coskun opens by framing the central tension behind The story you're not hearing about AI data centers. The talk then connects evidence, lived experience, and examples from TEDAI San Francisco. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '170176', 'title': 'How to be a great listener', 'slug': 'maegan-stephens-nicole-lowenbraun-how-to-be-a-great-listener', 'speaker': 'Maegan Stephens, Nicole Lowenbraun', 'event': 'TED@BCG', 'talk_type': 'TED Stage Talk', 'duration_seconds': 706, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-23', 'views': 357273, 'topics': ['communication', 'leadership', 'work', 'trust', 'goals'], 'image': 'images/talk_063_maegan-stephens-nicole-lowenbraun-how-to-be-a-gr.jpg', 'canonical_url': 'https://www.ted.com/talks/maegan_stephens_nicole_lowenbraun_how_to_be_a_great_listener', 'description': 'Have you ever left a meeting thinking: everyone talked, but nothing was achieved? Chances are that people were listening to each other, just not in the same way. Listening experts Maegan Stephens and Nicole Lowenbraun unpack the four different ways to listen, sharing a practical framework that could change how you respond, build trust and get results - starting with just one simple question.', 'transcript': 'Maegan Stephens, Nicole Lowenbraun opens by framing the central tension behind How to be a great listener. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '170828', 'title': "What you know that AI doesn't", 'slug': 'priyanka-vergadia-what-you-know-that-ai-doesn-t', 'speaker': 'Priyanka Vergadia', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 559, 'duration_minutes': 9, 'published_at': '2026-02-18', 'recorded_on': '2025-11-10', 'views': 278682, 'topics': ['technology', 'collaboration', 'work', 'ai', 'career'], 'image': 'images/talk_064_priyanka-vergadia-what-you-know-that-ai-doesn-t.jpg', 'canonical_url': 'https://www.ted.com/talks/priyanka_vergadia_what_you_know_that_ai_doesn_t', 'description': "AI is good at seeing patterns, but it's humans who figure out what to do next, says technologist Priyanka Vergadia. She shares three stories of human excellence sparked by AI insights and offers a pathway to identify and cultivate your irreplaceable qualities, turning the AI revolution from a threat into an opportunity.", 'transcript': "Priyanka Vergadia opens by framing the central tension behind What you know that AI doesn't. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}] PLAYLISTS = [{'slug': 'ai-and-society', 'title': 'AI, Society, and the Future', 'description': 'Talks about artificial intelligence, prediction, work, law, and public life.', 'topic': 'AI|artificial intelligence|future|technology|law'}, {'slug': 'design-and-creativity', 'title': 'Design, Creativity, and Art', 'description': 'A set of design and creativity talks for teams planning a workshop.', 'topic': 'design|creativity|art|architecture|innovation'}, {'slug': 'climate-nature-conservation', 'title': 'Climate, Nature, and Conservation', 'description': 'Talks about conservation, clean energy, oceans, animals, and climate action.', 'topic': 'nature|climate change|renewable energy|conservation|ocean|animals|wildlife'}, {'slug': 'health-science-body', 'title': 'Health, Science, and the Body', 'description': 'Science and medicine talks with practical questions for public health.', 'topic': 'health|health care|medicine|disease|biology|science'}, {'slug': 'culture-democracy-stories', 'title': 'Culture, Democracy, and Stories', 'description': 'Talks about culture, rights, media, storytelling, and civic life.', 'topic': 'culture|democracy|government|media|storytelling|society|social change'}, {'slug': 'work-business-leadership', 'title': 'Work, Business, and Leadership', 'description': 'Talks about leadership, organizations, money, careers, and decision-making.', 'topic': 'business|work|leadership|money|finance|economics'}, {'slug': 'music-performance-art', 'title': 'Music, Performance, and Art', 'description': 'Performances and creative talks for audiences comparing style, culture, and sound.', 'topic': 'music|performance|dance|sound|art'}] -EVENTS = [{'slug': 'ted-countdown-summit-2025', 'name': 'TED Countdown Summit 2025', 'city': 'Nairobi', 'month': 'June 2025', 'track': 'Community', 'capacity': 500}, {'slug': 'ted-explains-the-world-with-ian-bremmer', 'name': 'TED Explains the World with Ian Bremmer', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 570}, {'slug': 'ted-membership', 'name': 'TED Membership', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 640}, {'slug': 'ted-originals', 'name': 'TED Originals', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 710}, {'slug': 'ted-talks-daily-book-club', 'name': 'TED Talks Daily Book Club', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 780}, {'slug': 'ted2026', 'name': 'TED2026', 'city': 'Vancouver', 'month': 'April 2026', 'track': 'Flagship', 'capacity': 850}, {'slug': 'ted-bcg', 'name': 'TED@BCG', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 920}, {'slug': 'tedai-san-francisco', 'name': 'TEDAI San Francisco', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 990}, {'slug': 'tedai-vienna-2025', 'name': 'TEDAI Vienna 2025', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 1060}, {'slug': 'tedcountdown-bloomberggreenfestival', 'name': 'TEDCountdown@BloombergGreenFestival', 'city': 'Nairobi', 'month': 'June 2025', 'track': 'Community', 'capacity': 1130}, {'slug': 'tednext-2025', 'name': 'TEDNext 2025', 'city': 'Atlanta', 'month': 'November 2025', 'track': 'Community', 'capacity': 1200}, {'slug': 'tedxesmtberlin', 'name': 'TEDxESMTBerlin', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1270}, {'slug': 'tedxmanchester', 'name': 'TEDxManchester', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1340}, {'slug': 'tedxmidatlantic', 'name': 'TEDxMidAtlantic', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1410}, {'slug': 'tedxmilehigh', 'name': 'TEDxMileHigh', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1480}, {'slug': 'tedxnova', 'name': 'TEDxNoVA', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1550}, {'slug': 'tedxrva-youth', 'name': 'TEDxRVA Youth', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1620}] +EVENTS = [{'slug': 'ted-countdown-summit-2025', 'name': 'TED Countdown Summit 2025', 'city': 'Nairobi', 'month': 'June 2025', 'track': 'Community', 'capacity': 500}, {'slug': 'ted-explains-the-world-with-ian-bremmer', 'name': 'TED Explains the World with Ian Bremmer', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 570}, {'slug': 'ted-membership', 'name': 'TED Membership', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 640}, {'slug': 'ted-originals', 'name': 'TED Originals', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 710}, {'slug': 'ted-talks-daily-book-club', 'name': 'TED Talks Daily Book Club', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 780}, {'slug': 'ted2026', 'name': 'TED2026', 'city': 'Vancouver', 'month': 'April 2026', 'track': 'Flagship', 'capacity': 850}, {'slug': 'ted-bcg', 'name': 'TED@BCG', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 920}, {'slug': 'tedai-san-francisco', 'name': 'TEDAI San Francisco', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 990}, {'slug': 'tedai-vienna-2025', 'name': 'TEDAI Vienna 2025', 'city': 'Global', 'month': 'May 2026', 'track': 'Community', 'capacity': 1060}, {'slug': 'tedcountdown-bloomberggreenfestival', 'name': 'TEDCountdown@BloombergGreenFestival', 'city': 'Nairobi', 'month': 'June 2025', 'track': 'Community', 'capacity': 1130}, {'slug': 'tednext-2025', 'name': 'TEDNext 2025', 'city': 'Atlanta', 'month': 'November 2025', 'track': 'Community', 'capacity': 1200}, {'slug': 'tedxesmtberlin', 'name': 'TEDxESMTBerlin', 'city': 'Berlin, Germany', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1270}, {'slug': 'tedxmanchester', 'name': 'TEDxManchester', 'city': 'Manchester, UK', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1340}, {'slug': 'tedxmidatlantic', 'name': 'TEDxMidAtlantic', 'city': 'Washington, DC', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1410}, {'slug': 'tedxmilehigh', 'name': 'TEDxMileHigh', 'city': 'Denver, CO', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1480}, {'slug': 'tedxnova', 'name': 'TEDxNoVA', 'city': 'Northern Virginia, VA', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1550}, {'slug': 'tedxrva-youth', 'name': 'TEDxRVA Youth', 'city': 'Richmond, VA', 'month': 'May 2026', 'track': 'TEDx', 'capacity': 1620}] diff --git a/sites/ted/tasks.jsonl b/sites/ted/tasks.jsonl index 58c7f55a..b6f66000 100644 --- a/sites/ted/tasks.jsonl +++ b/sites/ted/tasks.jsonl @@ -1,18 +1,18 @@ {"web_name": "TED", "id": "TED--0", "ques": "Search for talks about AI and open the Anil Seth talk. What is the talk duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--1", "ques": "Find a TED2026 talk about driverless cars and save it to Alice Johnson's account with the note 'mobility planning'.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--2", "ques": "Browse the design topic and identify a talk from TEDNext 2025 that is shorter than 10 minutes.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--2", "ques": "Browse the design topic and open Debbie Millman's TEDNext 2025 talk that is shorter than 10 minutes. What is its duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--3", "ques": "Open the climate and nature playlist and name one talk recorded at the TED Countdown Summit 2025.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--4", "ques": "Log in as alice.j@test.com and change the newsletter topic to conservation.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--5", "ques": "Find the talk by Malala Yousafzai and list two topics attached to it.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--6", "ques": "Search for 'clean energy' and open the result by Kimiko Hirata. What event is it from?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--7", "ques": "Register interest in the TED Countdown Summit 2025 event while logged in as Alice Johnson.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--8", "ques": "Compare the talks by Alexi Pappas and Debbie Millman. Which one is shorter?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--8", "ques": "Compare Alexi Pappas's \"Why I love my bad days\" with Debbie Millman's \"You got what you wanted. Now what?\" Which one is shorter?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--9", "ques": "Find a talk about Parkinson's and save it to the current account with a note for public health review.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--10", "ques": "Open the AI, Society, and the Future playlist. Which included talk discusses a Supreme Court case?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--11", "ques": "Use filters to find TED2026 talks under 10 minutes and open the talk by Maya Higa.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--12", "ques": "Log in as alice.j@test.com and remove one saved talk that is not about AI from the account page.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--13", "ques": "Find the topic page for science and identify a TEDx talk about wine tasting.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--14", "ques": "Search for 'architecture 3D printing' and open the matching talk. Who is the speaker?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--15", "ques": "Find two talks in the music topic and determine which has more views.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--13", "ques": "Find the science topic page and identify the TEDx talk specifically about wine tasting.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--14", "ques": "Search for 'architecture 3D printing' and open the talk about traditional architecture. Who is the speaker?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--15", "ques": "Find the music topic talks by Akoth Jumadi and Mr. Lu and by Turkana Sessions. Which one has more views?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--16", "ques": "Create a new account, save the Peter Steinberger AI agent talk, then confirm it appears under saved talks.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} {"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the city for the TEDNext 2025 event.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} diff --git a/sites/ted/templates/_talk_card.html b/sites/ted/templates/_talk_card.html index dd8e09ab..192494f5 100644 --- a/sites/ted/templates/_talk_card.html +++ b/sites/ted/templates/_talk_card.html @@ -2,12 +2,9 @@ {% if talk.image %}{% endif %}
-

{{ talk.event }}

-

{{ talk.title }}

-

{{ talk.speaker }}

-
- {% for topic in talk.topics[:3] %}{{ topic }}{% endfor %} -
+

{{ talk.talk_type }}

+

Talk details

+

{{ talk.published_at|date_label }}

diff --git a/sites/ted/templates/base.html b/sites/ted/templates/base.html index 4b1e669a..17822b5f 100644 --- a/sites/ted/templates/base.html +++ b/sites/ted/templates/base.html @@ -48,9 +48,10 @@

A local WebHarbor mirror for talks, topics, playlists, and event workflows.

- {% for topic in nav_topics %} - {{ topic }} - {% endfor %} + Watch talks + Topic directory + Curated playlists + Attend events
diff --git a/sites/ted/templates/index.html b/sites/ted/templates/index.html index 3d71dcce..dc6a1a83 100644 --- a/sites/ted/templates/index.html +++ b/sites/ted/templates/index.html @@ -13,9 +13,9 @@

Ideas change everything

{% set lead = featured[0] %} - {{ lead.event }} -

{{ lead.title }}

-

{{ lead.speaker }}

+ {{ lead.talk_type }} +

Newest talk

+

{{ lead.published_at|date_label }}

From 9e6a1619186bcf1cdcec212c47f8f974246ac39a Mon Sep 17 00:00:00 2001 From: shanjiaming Date: Thu, 2 Jul 2026 13:54:22 +0800 Subject: [PATCH 04/15] fix(ted): improve card review fixes --- sites/ted/static/css/main.css | 9 +++++---- sites/ted/templates/_talk_card.html | 2 +- sites/ted/templates/index.html | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/sites/ted/static/css/main.css b/sites/ted/static/css/main.css index eb91f6a8..f4a9f66b 100644 --- a/sites/ted/static/css/main.css +++ b/sites/ted/static/css/main.css @@ -33,7 +33,7 @@ main { min-height: 68vh; } .hero-actions { display: flex; gap: 12px; margin-top: 26px; } .button { display: inline-flex; align-items: center; background: #111; } .button.primary { background: var(--red); } -.lead-card { border-bottom: 4px solid var(--red); background: var(--soft); } +.lead-card { min-width: 0; border-bottom: 4px solid var(--red); background: var(--soft); } .lead-card img { aspect-ratio: 16 / 9; } .lead-card span, .lead-card h2, .lead-card p { display: block; margin-left: 20px; margin-right: 20px; } .lead-card span { margin-top: 18px; color: var(--red); font-size: 13px; font-weight: 800; text-transform: uppercase; } @@ -45,7 +45,7 @@ main { min-height: 68vh; } .section-head h2, article h2, aside h2, .panel h2 { margin: 0; font-size: 24px; } .section-head a { color: var(--red); font-weight: 700; } .grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 22px; } -.talk-card { border-top: 1px solid var(--line); background: #fff; } +.talk-card { min-width: 0; border-top: 1px solid var(--line); background: #fff; } .talk-card img { aspect-ratio: 16 / 9; background: #ddd; } .card-body { padding: 14px 0; } .meta { color: var(--red); font-size: 12px; font-weight: 800; text-transform: uppercase; } @@ -56,7 +56,7 @@ main { min-height: 68vh; } .split { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; } .list { display: grid; gap: 8px; } -.row-link { display: grid; gap: 4px; padding: 14px 0; border-bottom: 1px solid var(--line); } +.row-link { display: grid; gap: 4px; min-width: 0; padding: 14px 0; border-bottom: 1px solid var(--line); } .row-link span { color: var(--muted); line-height: 1.35; } .page-head { display: grid; gap: 14px; border-bottom: 1px solid var(--line); } .page-head p { max-width: 720px; color: var(--muted); } @@ -73,8 +73,9 @@ main { min-height: 68vh; } .save-form { display: grid; grid-template-columns: 1fr auto; gap: 10px; } .topic-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; } -.topic-grid a, .topic-grid article { display: grid; gap: 8px; min-height: 130px; padding: 20px; background: var(--soft); border-top: 3px solid var(--red); } +.topic-grid a, .topic-grid article { display: grid; gap: 8px; min-width: 0; min-height: 130px; padding: 20px; background: var(--soft); border-top: 3px solid var(--red); } .topic-grid strong { font-size: 22px; } +.lead-card h2, .talk-card h3, .row-link strong, .topic-grid strong { overflow-wrap: anywhere; } .topic-grid span, .topic-grid p { color: var(--muted); margin: 0; } .panel { display: grid; gap: 14px; padding: 24px; background: var(--soft); } .panel label { display: grid; gap: 6px; font-weight: 700; } diff --git a/sites/ted/templates/_talk_card.html b/sites/ted/templates/_talk_card.html index 192494f5..c85ac151 100644 --- a/sites/ted/templates/_talk_card.html +++ b/sites/ted/templates/_talk_card.html @@ -3,7 +3,7 @@ {% if talk.image %}{% endif %}

{{ talk.talk_type }}

-

Talk details

+

{{ talk.speaker }}

{{ talk.published_at|date_label }}

diff --git a/sites/ted/templates/index.html b/sites/ted/templates/index.html index dc6a1a83..b8f68679 100644 --- a/sites/ted/templates/index.html +++ b/sites/ted/templates/index.html @@ -14,7 +14,7 @@

Ideas change everything

{{ lead.talk_type }} -

Newest talk

+

{{ lead.speaker }}

{{ lead.published_at|date_label }}

From e054cea4268c4f04725319a8335fa86cdbf0a280 Mon Sep 17 00:00:00 2001 From: shanjiaming Date: Thu, 2 Jul 2026 14:14:04 +0800 Subject: [PATCH 05/15] fix(ted): tighten wine task data --- .assets-revision | 2 +- .gitignore | 2 +- sites/ted/seed_data.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.assets-revision b/.assets-revision index 6f9abfe6..19088e12 100644 --- a/.assets-revision +++ b/.assets-revision @@ -5,4 +5,4 @@ # is a git revision (branch name like `main`, a tag, or a specific commit # sha). Override at runtime with the ASSETS_REVISION env var. repo: ChilleD/WebHarbor -revision: 0126c722e74be5fb26b82471007feea3b439073d +revision: 597623a2f32898afa12e3bbeda15520f559aa7c7 diff --git a/.gitignore b/.gitignore index e7899232..24ce1529 100644 --- a/.gitignore +++ b/.gitignore @@ -94,4 +94,4 @@ secrets.json # ============================================================ # Agent demo results # ============================================================= -agent_demo/runs/ +agent_demo/runs/ \ No newline at end of file diff --git a/sites/ted/seed_data.py b/sites/ted/seed_data.py index 9df5ee9e..1c944dcb 100644 --- a/sites/ted/seed_data.py +++ b/sites/ted/seed_data.py @@ -1,6 +1,6 @@ """Seed data for the TED WebHarbor mirror.""" -TALKS = [{'source_id': '178768', 'title': 'The wildlife sanctuary you can visit from anywhere', 'slug': 'maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere', 'speaker': 'Maya Higa', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 568, 'duration_minutes': 9, 'published_at': '2026-05-12', 'recorded_on': '2026-04-14', 'views': 150000, 'topics': ['media', 'social change', 'animals', 'nature', 'social media', 'internet', 'conservation', 'wildlife'], 'image': 'images/talk_001_maya-higa-the-wildlife-sanctuary-you-can-visit-f.jpg', 'canonical_url': 'https://www.ted.com/talks/maya_higa_the_wildlife_sanctuary_you_can_visit_from_anywhere', 'description': 'Creator Maya Higa is on a mission to use the internet to build the next generation of conservationists. Her virtual education center, Alveus Sanctuary, is one of the most-watched sanctuaries on Earth, with dozens of rescued animals and cameras livestreaming to a community of millions inspired to help protect the wildlife. Visit with Bean the Hawk, Winnie the Moo and more - and see what the future of conservation looks like.', 'transcript': 'Maya Higa opens by framing the central tension behind The wildlife sanctuary you can visit from anywhere. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178681', 'title': "Waymo's case for a driverless future", 'slug': 'tekedra-mawakana-sal-khan-waymo-s-case-for-a-driverless-future', 'speaker': 'Tekedra Mawakana, Sal Khan', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1154, 'duration_minutes': 19, 'published_at': '2026-05-11', 'recorded_on': '2026-04-15', 'views': 157919, 'topics': ['technology', 'future', 'society', 'driverless cars'], 'image': 'images/talk_002_tekedra-mawakana-sal-khan-waymo-s-case-for-a-dri.jpg', 'canonical_url': 'https://www.ted.com/talks/tekedra_mawakana_sal_khan_waymo_s_case_for_a_driverless_future', 'description': "What if we could solve the problem of fatal car accidents? Waymo co-CEO Tekedra Mawakana joins TED's Sal Khan to explore why fully autonomous vehicles (where you never have to touch the wheel) could end the dangerous status quo of traffic deaths. She makes the case for why self-driving cars are more than a tech novelty - they're an urgently needed upgrade that could make the world safer for everyone.", 'transcript': "Tekedra Mawakana, Sal Khan opens by framing the central tension behind Waymo's case for a driverless future. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177895', 'title': 'Why I love my bad days', 'slug': 'alexi-pappas-why-i-love-my-bad-days', 'speaker': 'Alexi Pappas', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 310, 'duration_minutes': 5, 'published_at': '2026-05-08', 'recorded_on': '2025-11-11', 'views': 6052, 'topics': ['psychology', 'philosophy', 'happiness', 'sports', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_003_alexi-pappas-why-i-love-my-bad-days.jpg', 'canonical_url': 'https://www.ted.com/talks/alexi_pappas_why_i_love_my_bad_days', 'description': "One month before the Rio Olympics, runner Alexi Pappas couldn't hit her splits in practice. She was begging her watch to change its mind. Then her coach told her to take it off - and shared the best advice she's ever received. That single piece of wisdom led her to break a national record and changed how she chases her goals, carrying her through ultramarathons, a memoir and three films. Bad days aren't a detour, she says - they mean you're right on track.", 'transcript': 'Alexi Pappas opens by framing the central tension behind Why I love my bad days. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178367', 'title': 'What really won the trillion-dollar Supreme Court case', 'slug': 'neal-kumar-katyal-what-really-won-the-trillion-dollar-supreme-court-case', 'speaker': 'Neal Kumar Katyal', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1091, 'duration_minutes': 18, 'published_at': '2026-05-07', 'recorded_on': '2026-04-17', 'views': 154312, 'topics': ['culture', 'ai', 'law', 'society', 'policy'], 'image': 'images/talk_004_neal-kumar-katyal-what-really-won-the-trillion-d.jpg', 'canonical_url': 'https://www.ted.com/talks/neal_kumar_katyal_what_really_won_the_trillion_dollar_supreme_court_case', 'description': "In November 2025, Neal Kumar Katyal was asked to do what no US Supreme Court litigator had ever done: convince the justices to strike down a sitting president's signature initiative. After enlisting the help of four unlikely coaches - and one secret weapon he hasn't told anyone about until now - he walked into the courtroom ready for anything. What he discovered about winning and connecting might just change how you think about performing under pressure.", 'transcript': 'Neal Kumar Katyal opens by framing the central tension behind What really won the trillion-dollar Supreme Court case. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '178175', 'title': 'The rising cost of dissent in America', 'slug': 'miles-taylor-the-rising-cost-of-dissent-in-america-may-2026', 'speaker': 'Miles Taylor', 'event': 'TEDxMidAtlantic', 'talk_type': 'TEDx Talk', 'duration_seconds': 1166, 'duration_minutes': 19, 'published_at': '2026-05-04', 'recorded_on': '2025-11-01', 'views': 154789, 'topics': ['politics', 'media', 'social change', 'united states', 'democracy', 'government'], 'image': 'images/talk_005_miles-taylor-the-rising-cost-of-dissent-in-ameri.jpg', 'canonical_url': 'https://www.ted.com/talks/miles_taylor_the_rising_cost_of_dissent_in_america_may_2026', 'description': "Former senior US national security official Miles Taylor shares a personal account that raises a broader civic concern: the growing cost of dissent in American public life. Drawing on his experience inside government and living the consequences of speaking openly, he says that the real threat to US democracy isn't the politicians or hard-liners - it's the two-thirds of Americans who don't speak up. (This talk contains mature language.)", 'transcript': 'Miles Taylor opens by framing the central tension behind The rising cost of dissent in America. The talk then connects evidence, lived experience, and examples from TEDxMidAtlantic. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178086', 'title': 'Why AI is unlikely to become conscious', 'slug': 'anil-seth-why-ai-is-unlikely-to-become-conscious', 'speaker': 'Anil Seth', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 897, 'duration_minutes': 15, 'published_at': '2026-05-01', 'recorded_on': '2026-04-16', 'views': 191682, 'topics': ['technology', 'future', 'brain', 'consciousness', 'ai'], 'image': 'images/talk_006_anil-seth-why-ai-is-unlikely-to-become-conscious.jpg', 'canonical_url': 'https://www.ted.com/talks/anil_seth_why_ai_is_unlikely_to_become_conscious', 'description': 'We see consciousness in AI the same way we see faces in clouds, says neuroscientist Anil Seth. He explores the all-too-human tendency to project inner life onto machines that are brilliant mimics, not sentient beings, and gives a definitive answer to the urgent question: Will AI ever gain consciousness?', 'transcript': 'Anil Seth opens by framing the central tension behind Why AI is unlikely to become conscious. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175757', 'title': 'Reimagining traditional architecture for modern needs', 'slug': 'riyad-joucka-reimagining-traditional-architecture-for-modern-needs', 'speaker': 'Riyad Joucka', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 492, 'duration_minutes': 8, 'published_at': '2026-04-30', 'recorded_on': '2025-10-23', 'views': 153822, 'topics': ['technology', 'design', 'architecture', 'urban planning', 'innovation', '3d printing'], 'image': 'images/talk_007_riyad-joucka-reimagining-traditional-architectur.jpg', 'canonical_url': 'https://www.ted.com/talks/riyad_joucka_reimagining_traditional_architecture_for_modern_needs', 'description': "Architect Riyad Joucka believes your home should be a mirror of who you are. Using 3D printing and ancient architectural wisdom, he's designing efficient, personal homes that respond to context, climate and culture without sacrificing character. He makes the case that we should start designing for people, not the market.", 'transcript': 'Riyad Joucka opens by framing the central tension behind Reimagining traditional architecture for modern needs. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176563', 'title': 'How to invite creativity into your life', 'slug': 'rose-b-simpson-debbie-millman-how-to-invite-creativity-into-your-life', 'speaker': 'Rose B. Simpson, Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1065, 'duration_minutes': 18, 'published_at': '2026-04-29', 'recorded_on': '2025-11-10', 'views': 170066, 'topics': ['culture', 'nature', 'creativity', 'art', 'storytelling', 'mindfulness'], 'image': 'images/talk_008_rose-b-simpson-debbie-millman-how-to-invite-crea.jpg', 'canonical_url': 'https://www.ted.com/talks/rose_b_simpson_debbie_millman_how_to_invite_creativity_into_your_life', 'description': 'What do you hear when you sit in silence? For artist Rose B. Simpson, that question is the beginning of all art. She comes from a line of ceramic artists stretching back generations and, as part of her multidisciplinary work, she also builds custom lowrider cars. (If that sounds like a contradiction, that\'s kind of the point.) In conversation with "Design Matters" podcast host Debbie Millman, Simpson invites you to find your own aesthetic - not by searching, but by listening.', 'transcript': 'Rose B. Simpson, Debbie Millman opens by framing the central tension behind How to invite creativity into your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175453', 'title': 'You got what you wanted. Now what?', 'slug': 'debbie-millman-you-got-what-you-wanted-now-what', 'speaker': 'Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 473, 'duration_minutes': 8, 'published_at': '2026-04-27', 'recorded_on': '2025-11-09', 'views': 190209, 'topics': ['design', 'creativity', 'personal growth'], 'image': 'images/talk_009_debbie-millman-you-got-what-you-wanted-now-what.jpg', 'canonical_url': 'https://www.ted.com/talks/debbie_millman_you_got_what_you_wanted_now_what', 'description': 'Over two decades of interviewing countless creative people, Debbie Millman (host of the iconic "Design Matters" podcast) had a realization: the pride and joy of accomplishing something often evaporates almost instantly. She explains how to stop chasing external validation for your achievements and instead live for the act of creation itself.', 'transcript': 'Debbie Millman opens by framing the central tension behind You got what you wanted. Now what?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177490', 'title': 'What Kosovo can teach the world about freedom', 'slug': 'vjosa-osmani-sadriu-what-kosovo-can-teach-the-world-about-freedom', 'speaker': 'Vjosa Osmani Sadriu', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1047, 'duration_minutes': 17, 'published_at': '2026-04-24', 'recorded_on': '2026-04-14', 'views': 176972, 'topics': ['politics', 'social change', 'leadership', 'democracy', 'government'], 'image': 'images/talk_010_vjosa-osmani-sadriu-what-kosovo-can-teach-the-wo.jpg', 'canonical_url': 'https://www.ted.com/talks/vjosa_osmani_sadriu_what_kosovo_can_teach_the_world_about_freedom', 'description': '"Truth is the real oxygen for democracy," says Vjosa Osmani Sadriu, the 6th President of the Republic of Kosovo. As a child of war, she once longed for someone to save her people. Now she\'s been in the rooms where decisions are made - and she\'s never forgotten what brought her there. In conversation with solutions journalist Angus Hervey, she reflects on what it takes to defend democracy in a world where truth itself is under threat. (Recorded on April 14, 2026)', 'transcript': 'Vjosa Osmani Sadriu opens by framing the central tension behind What Kosovo can teach the world about freedom. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177489', 'title': 'Beware the power of prediction', 'slug': 'carissa-veliz-beware-the-power-of-prediction', 'speaker': 'Carissa Veliz', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 728, 'duration_minutes': 12, 'published_at': '2026-04-23', 'recorded_on': '2026-04-14', 'views': 267371, 'topics': ['technology', 'future', 'ai', 'ethics'], 'image': 'images/talk_011_carissa-veliz-beware-the-power-of-prediction.jpg', 'canonical_url': 'https://www.ted.com/talks/carissa_veliz_beware_the_power_of_prediction', 'description': "What do the story of Oedipus and your insurance premiums have in common? They are both driven by self-fulfilling prophecies. Philosopher and TED Fellow Carissa Veliz traces the hidden power of prediction, from Roman emperors who banned prophets to the AI algorithms quietly making decisions about your life right now. We tend to associate predictions with knowledge, she says, but they're actually attempts to grab power. So the next time someone tells you a specific outcome is inevitable, remember: they aren't describing the future - they're selling it.", 'transcript': 'Carissa Veliz opens by framing the central tension behind Beware the power of prediction. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177096', 'title': 'The problem with billionaires - and the debut of True Net Worth', 'slug': 'randall-lane-the-problem-with-billionaires-and-the-debut-of-true-net-worth', 'speaker': 'Randall Lane', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 499, 'duration_minutes': 8, 'published_at': '2026-04-20', 'recorded_on': '2026-04-16', 'views': 221434, 'topics': ['culture', 'economics', 'philanthropy', 'society', 'money', 'finance'], 'image': 'images/talk_012_randall-lane-the-problem-with-billionaires-and-t.jpg', 'canonical_url': 'https://www.ted.com/talks/randall_lane_the_problem_with_billionaires_and_the_debut_of_true_net_worth', 'description': "As chief content officer of Forbes, Randall Lane oversees the magazine's signature list of billionaires, tracking the richest people on Earth. But he has noticed that this prompts the ultra-wealthy to stockpile their money instead of spending it on the public good. He debuts a new ranking - True Net Worth - that applauds billionaires for their philanthropy and rewards generosity. Guess who's in the top five?", 'transcript': 'Randall Lane opens by framing the central tension behind The problem with billionaires - and the debut of True Net Worth. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175050', 'title': 'A cheat sheet for accelerating clean energy', 'slug': 'kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy', 'speaker': 'Kimiko Hirata', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 586, 'duration_minutes': 10, 'published_at': '2026-04-20', 'recorded_on': '2025-06-18', 'views': 191819, 'topics': ['climate change', 'policy', 'countdown', 'renewable energy', 'fossil fuels'], 'image': 'images/talk_013_kimiko-hirata-a-cheat-sheet-for-accelerating-cle.jpg', 'canonical_url': 'https://www.ted.com/talks/kimiko_hirata_a_cheat_sheet_for_accelerating_clean_energy', 'description': 'After the Fukushima disaster shut down Japan\'s nuclear reactors, the coal industry rushed in to fill the energy gap. As climate advocate Kimiko Hirata watched dozens of new coal plant proposals quietly surface across the country - each one locking in decades of future emissions - she resolved to make them impossible to ignore. She shares how a small, scrappy civil society movement took on a fossil-fuel-dependent economy and got people to say "yes" to a renewable future.', 'transcript': 'Kimiko Hirata opens by framing the central tension behind A cheat sheet for accelerating clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176964', 'title': 'How I created OpenClaw, the breakthrough AI agent', 'slug': 'peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent', 'speaker': 'Peter Steinberger', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1055, 'duration_minutes': 18, 'published_at': '2026-04-17', 'recorded_on': '2026-04-16', 'views': 551544, 'topics': ['technology', 'computers', 'ai', 'internet', 'machine learning', 'artificial intelligence'], 'image': 'images/talk_014_peter-steinberger-how-i-created-openclaw-the-bre.jpg', 'canonical_url': 'https://www.ted.com/talks/peter_steinberger_how_i_created_openclaw_the_breakthrough_ai_agent', 'description': 'OpenClaw creator Peter Steinberger takes us back to the transformative moment he let his AI agent loose on the internet, igniting one of the world\'s fastest-growing open-source projects. He makes a fascinating (and slightly unnerving) case that agents are a real shift, not just better versions of chatbots, and explores how they might reshape your ability to work, build and create. "The lobster is loose, and it\'s not going back into the tank," he says. (Followed by a brief Q&A with TED Chairman Chris Anderson)', 'transcript': 'Peter Steinberger opens by framing the central tension behind How I created OpenClaw, the breakthrough AI agent. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176887', 'title': 'A plan to stop AI from automating our decline', 'slug': 'gina-raimondo-a-plan-to-stop-ai-from-automating-our-decline', 'speaker': 'Gina Raimondo', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 951, 'duration_minutes': 16, 'published_at': '2026-04-16', 'recorded_on': '2026-04-14', 'views': 229795, 'topics': ['politics', 'technology', 'business', 'social change', 'work', 'ai'], 'image': 'images/talk_015_gina-raimondo-a-plan-to-stop-ai-from-automating-.jpg', 'canonical_url': 'https://www.ted.com/talks/gina_raimondo_a_plan_to_stop_ai_from_automating_our_decline', 'description': 'The United States is on track to win the AI race - and hollow itself out in the process, says Gina Raimondo, former Governor of Rhode Island and US Secretary of Commerce. In this unflinching look at the threat of AI-induced economic disruption and social unrest, she offers a concrete blueprint to prepare workers for what\'s coming next. "AI is a 100-year technology and needs a 100-year response," she says. Is America up to the challenge?', 'transcript': 'Gina Raimondo opens by framing the central tension behind A plan to stop AI from automating our decline. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175041', 'title': 'East African sound meets cosmic trap', 'slug': 'akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap', 'speaker': 'Akoth Jumadi and Mr. Lu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 483, 'duration_minutes': 8, 'published_at': '2026-04-15', 'recorded_on': '2025-06-18', 'views': 2781, 'topics': ['music', 'performance', 'africa', 'art', 'sound'], 'image': 'images/talk_016_akoth-jumadi-and-mr-lu-east-african-sound-meets-.jpg', 'canonical_url': 'https://www.ted.com/talks/akoth_jumadi_and_mr_lu_east_african_sound_meets_cosmic_trap', 'description': 'Kenyan music duo Akoth Jumadi and MR. LU* fuse tribal roots with cosmic trap and celestial R&B, creating a hypnotic sound where ancient rhythms meet the future.', 'transcript': 'Akoth Jumadi and Mr. Lu opens by framing the central tension behind East African sound meets cosmic trap. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176566', 'title': 'What I got wrong about changing the world', 'slug': 'malala-yousafzai-what-i-got-wrong-about-changing-the-world', 'speaker': 'Malala Yousafzai', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 703, 'duration_minutes': 12, 'published_at': '2026-04-14', 'recorded_on': '2026-04-14', 'views': 349363, 'topics': ['education', 'social change', 'activism', 'middle east', 'human rights'], 'image': 'images/talk_017_malala-yousafzai-what-i-got-wrong-about-changing.jpg', 'canonical_url': 'https://www.ted.com/talks/malala_yousafzai_what_i_got_wrong_about_changing_the_world', 'description': "Malala Yousafzai has spent her life advocating for girls' education - surviving an assassination attempt at 15, meeting with world leaders and then watching hard-won progress collapse when Afghanistan fell to the Taliban in 2021. That moment of despair forced her to completely rethink what it means to create change, and what she discovered replaced her shattered optimism with something more powerful and more honest. Hear how to keep fighting for the future you want, even when hope feels lost.", 'transcript': 'Malala Yousafzai opens by framing the central tension behind What I got wrong about changing the world. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174201', 'title': 'Amman, Jordan', 'slug': 'ted-idea-search-amman-jordan', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2610, 'duration_minutes': 44, 'published_at': '2026-04-09', 'recorded_on': '2026-04-09', 'views': 23418, 'topics': ['social change'], 'image': 'images/talk_018_ted-idea-search-amman-jordan.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_amman_jordan', 'description': "The TED Idea Search wraps up in Amman, Jordan, in a 2,000-year-old Roman amphitheater and in front of a crowd of 4,000. What unfolds inside those stone walls is something the series hasn't quite seen before: speakers shaped by the weight of living in a region the world tends to define for itself. From a mountaineer who turned grief into motivation to a therapist rewriting the Arab world's language around mental health, the final city makes the strongest case yet that the best ideas can come from anywhere.", 'transcript': 'TED Idea Search opens by framing the central tension behind Amman, Jordan. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175828', 'title': 'A musical journey through Turkana', 'slug': 'turkana-sessions-a-musical-journey-through-turkana', 'speaker': 'Turkana Sessions', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 401, 'duration_minutes': 7, 'published_at': '2026-04-09', 'recorded_on': '2025-06-16', 'views': 4223, 'topics': ['music', 'performance', 'africa'], 'image': 'images/talk_019_turkana-sessions-a-musical-journey-through-turka.jpg', 'canonical_url': 'https://www.ted.com/talks/turkana_sessions_a_musical_journey_through_turkana', 'description': 'The genre-defying band Turkana Sessions takes us on a musical tour through the soundscape of northwest Kenya, with Elizabeth Korkel singing and Eddie Grey shredding on guitar.', 'transcript': 'Turkana Sessions opens by framing the central tension behind A musical journey through Turkana. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175296', 'title': "A whale's-eye-view of the ocean", 'slug': 'eric-stackpole-a-whale-s-eye-view-of-the-ocean', 'speaker': 'Eric Stackpole', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 311, 'duration_minutes': 5, 'published_at': '2026-04-08', 'recorded_on': '2025-11-11', 'views': 193174, 'topics': ['science', 'technology', 'animals', 'exploration', 'ocean'], 'image': 'images/talk_020_eric-stackpole-a-whale-s-eye-view-of-the-ocean.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_stackpole_a_whale_s_eye_view_of_the_ocean', 'description': "A hand-built camera with suction cups captured something no one had ever seen: two sperm whales communicating and swimming together in the deep ocean. Engineer Eric Stackpole shares the story of how a scrappy, DIY tool revealed this intimate glimpse into the lives of these giants - and makes the case that the only limit to what we can discover is what we're curious enough to explore.", 'transcript': "Eric Stackpole opens by framing the central tension behind A whale's-eye-view of the ocean. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175934', 'title': 'The art and science of wine tasting', 'slug': 'qian-janice-wang-the-art-and-science-of-wine-tasting', 'speaker': 'Qian Janice Wang', 'event': 'TEDxNoVA', 'talk_type': 'TEDx Talk', 'duration_seconds': 919, 'duration_minutes': 15, 'published_at': '2026-04-07', 'recorded_on': '2025-10-10', 'views': 181481, 'topics': ['science', 'food', 'brain'], 'image': 'images/talk_021_qian-janice-wang-the-art-and-science-of-wine-tas.jpg', 'canonical_url': 'https://www.ted.com/talks/qian_janice_wang_the_art_and_science_of_wine_tasting', 'description': "No two people taste wine the same way, and science is starting to show us why. Sensory scientist Qian Janice Wang explores why experts and beginners experience complexity so differently - revealing that what makes a wine great may have less to do with what's in the glass and more to do with what's happening in your brain.", 'transcript': 'Qian Janice Wang opens by framing the central tension behind The art and science of wine tasting. The talk then connects evidence, lived experience, and examples from TEDxNoVA. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '171659', 'title': 'The accidental brilliance of makeshift signs', 'slug': 'kate-canales-the-accidental-brilliance-of-makeshift-signs', 'speaker': 'Kate Canales', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 466, 'duration_minutes': 8, 'published_at': '2026-04-06', 'recorded_on': '2025-11-11', 'views': 203431, 'topics': ['culture', 'technology', 'design', 'creativity', 'art', 'humor', 'society'], 'image': 'images/talk_022_kate-canales-the-accidental-brilliance-of-makesh.jpg', 'canonical_url': 'https://www.ted.com/talks/kate_canales_the_accidental_brilliance_of_makeshift_signs', 'description': "What happens when the design of everyday things misses the mark? People fill in the blanks. Designer Kate Canales has spent more than 20 years photographing the handmade, improvised signs that appear when the original falls short. From perplexing bathroom directions to our struggles with doors and point-of-sale machines, her photos capture something technology can't replace: our instinct to look out for each other and leave a few instructions behind. She also compares handmade fixes with architecture renderings and 3D printing prototypes, making it a design-adjacent near miss rather than a home-building case study.", 'transcript': 'Kate Canales opens by framing the central tension behind The accidental brilliance of makeshift signs. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175830', 'title': "The nurse who can smell Parkinson's", 'slug': 'joy-milne-the-nurse-who-can-smell-parkinson-s', 'speaker': 'Joy Milne', 'event': 'TEDxManchester', 'talk_type': 'TEDx Talk', 'duration_seconds': 1077, 'duration_minutes': 18, 'published_at': '2026-04-03', 'recorded_on': '2023-03-04', 'views': 203929, 'topics': ['science', 'innovation', 'disease', 'health', 'health care', 'biology', 'medicine'], 'image': 'images/talk_023_joy-milne-the-nurse-who-can-smell-parkinson-s.jpg', 'canonical_url': 'https://www.ted.com/talks/joy_milne_the_nurse_who_can_smell_parkinson_s', 'description': "What does Parkinson's smell like? Ask nurse Joy Milne. Born with a hypersensitive nose, she spent a lifetime learning to recognize diseases through their scents. When she smelled Parkinson's on her husband years before his diagnosis, she decided to put her gift to the test. Today, her extraordinary nose has been translated into a non-invasive test - helping researchers diagnose what was right under their noses all along. Her story also explains why careful scent training, familiar from wine tasting, can sharpen medical observation.", 'transcript': "Joy Milne opens by framing the central tension behind The nurse who can smell Parkinson's. The talk then connects evidence, lived experience, and examples from TEDxManchester. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174199', 'title': 'Buenos Aires, Argentina', 'slug': 'ted-idea-search-buenos-aires-argentina', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2561, 'duration_minutes': 43, 'published_at': '2026-04-02', 'recorded_on': '2026-04-02', 'views': 31212, 'topics': ['social change'], 'image': 'images/talk_024_ted-idea-search-buenos-aires-argentina.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_buenos_aires_argentina', 'description': 'The TED Idea Search arrives in Buenos Aires, a city with a fierce intellectual tradition, as 10 speakers deliver talks in a stunning warehouse that\'s home to the city\'s iconic opera sets, competing for a chance to speak on the TED main stage. Watch as a Gen Z voice reframes "brain rot" as a secret diplomatic tool and a surgeon explores the future of robotic medicine, reminding us why the human touch still matters - and much more. Choosing just one to represent Buenos Aires to the world turns out to be one of the hardest decisions yet.', 'transcript': 'TED Idea Search opens by framing the central tension behind Buenos Aires, Argentina. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175297', 'title': "I let DaddyGPT parent my kids. Here's what I learned", 'slug': 'stephen-remedios-i-let-daddygpt-parent-my-kids-here-s-what-i-learned', 'speaker': 'Stephen Remedios', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-04-02', 'recorded_on': '2025-10-23', 'views': 201276, 'topics': ['technology', 'parenting', 'ai', 'kids'], 'image': 'images/talk_025_stephen-remedios-i-let-daddygpt-parent-my-kids-h.jpg', 'canonical_url': 'https://www.ted.com/talks/stephen_remedios_i_let_daddygpt_parent_my_kids_here_s_what_i_learned', 'description': "As the world races toward digital perfection, tech humanist Stephen Remedios tried to optimize the messiest and most imperfect of all human work: parenting. He shares the story of DaddyGPT, a digital version of himself built to help raise his kids - until they began to prefer it over him. What unfolds is a personal look at the limits of AI, and a reminder that what matters most isn't getting it right every time but showing up with the authentic imperfection only humans have.", 'transcript': "Stephen Remedios opens by framing the central tension behind I let DaddyGPT parent my kids. Here's what I learned. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175452', 'title': 'A brilliant blend of ballet, hip-hop and African dance', 'slug': 'ghetto-classics-dance-a-brilliant-blend-of-ballet-hip-hop-and-african-dance', 'speaker': 'Ghetto Classics Dance', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 434, 'duration_minutes': 7, 'published_at': '2026-04-01', 'recorded_on': '2025-06-17', 'views': 3772, 'topics': ['performance', 'africa', 'art', 'dance', 'countdown'], 'image': 'images/talk_026_ghetto-classics-dance-a-brilliant-blend-of-balle.jpg', 'canonical_url': 'https://www.ted.com/talks/ghetto_classics_dance_a_brilliant_blend_of_ballet_hip_hop_and_african_dance', 'description': "Watch the performers of Ghetto Classics Dance light up the stage with a breathtaking fusion of traditional African dance, classical ballet and modern hip-hop. Founded in Korogocho, one of Nairobi's most under-resourced neighborhoods, this community-driven program empowers dancers through intensive training and mentorship.", 'transcript': 'Ghetto Classics Dance opens by framing the central tension behind A brilliant blend of ballet, hip-hop and African dance. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175374', 'title': '5 practical ways to take control of your life', 'slug': 'jim-vandehei-5-practical-ways-to-take-control-of-your-life', 'speaker': 'Jim VandeHei', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 654, 'duration_minutes': 11, 'published_at': '2026-03-31', 'recorded_on': '2025-11-11', 'views': 243174, 'topics': ['leadership', 'success', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_027_jim-vandehei-5-practical-ways-to-take-control-of.jpg', 'canonical_url': 'https://www.ted.com/talks/jim_vandehei_5_practical_ways_to_take_control_of_your_life', 'description': 'You can\'t control the world - but you can control you. That\'s the mantra that took Axios CEO Jim VandeHei, a once "unremarkably unremarkable 20-year-old," all the way to launching companies and interviewing presidents. He breaks down a career\'s worth of observations into five deceptively simple things you can control, and explores why mastering them can change the trajectory of your life.', 'transcript': 'Jim VandeHei opens by framing the central tension behind 5 practical ways to take control of your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175298', 'title': 'Stress resets, the ultimate mental health hack', 'slug': 'jenny-taitz-stress-resets-the-ultimate-mental-health-hack', 'speaker': 'Jenny Taitz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 630, 'duration_minutes': 10, 'published_at': '2026-03-30', 'recorded_on': '2025-11-10', 'views': 263345, 'topics': ['science', 'psychology', 'relationships', 'personal growth', 'mental health', 'emotions'], 'image': 'images/talk_028_jenny-taitz-stress-resets-the-ultimate-mental-he.jpg', 'canonical_url': 'https://www.ted.com/talks/jenny_taitz_stress_resets_the_ultimate_mental_health_hack', 'description': 'Stress is contagious - but so is calm. Psychologist Jenny Taitz explains why one stressful moment tends to snowball into the next, and shares small, immediate resets you can practice anywhere to break the spiral before it starts.', 'transcript': 'Jenny Taitz opens by framing the central tension behind Stress resets, the ultimate mental health hack. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174198', 'title': 'Chicago, USA', 'slug': 'ted-idea-search-chicago-usa', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2769, 'duration_minutes': 46, 'published_at': '2026-03-27', 'recorded_on': '2026-03-27', 'views': 28577, 'topics': ['social change'], 'image': 'images/talk_029_ted-idea-search-chicago-usa.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_chicago_usa', 'description': 'In the Windy City, 10 Chicagoans step onto the iconic red circle, each with six minutes to prove they have an idea that could change everything. Among them: a chemist who believes we can deploy precision medicine to save endangered species, a journalist creating tools to navigate difficult conversations and a runner challenging the narrative of a divided city by exploring every one of its streets. The stakes are personal, the competition is fierce - and one speaker will earn the chance to take their idea to the main stage at TED in Vancouver.', 'transcript': 'TED Idea Search opens by framing the central tension behind Chicago, USA. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175334', 'title': 'Why the world is still not built for women', 'slug': 'virginia-santy-why-the-world-is-still-not-built-for-women', 'speaker': 'Virginia Santy', 'event': 'TEDxMileHigh', 'talk_type': 'TEDx Talk', 'duration_seconds': 804, 'duration_minutes': 13, 'published_at': '2026-03-26', 'recorded_on': '2022-11-12', 'views': 214046, 'topics': ['design', 'cities', 'urban planning', 'social change', 'women', 'tedx', 'feminism'], 'image': 'images/talk_030_virginia-santy-why-the-world-is-still-not-built-.jpg', 'canonical_url': 'https://www.ted.com/talks/virginia_santy_why_the_world_is_still_not_built_for_women', 'description': 'Design consultant Virginia Santy set out to create an office space built specifically for women, flipping the script on the subtle (and not-so-subtle) ways that workplaces and cities still fail them. The results were striking: greater productivity, deeper collaboration and an environment where women felt genuinely valued, leading her to ask a simple question: What would the world look like if we designed with women in mind?', 'transcript': 'Virginia Santy opens by framing the central tension behind Why the world is still not built for women. The talk then connects evidence, lived experience, and examples from TEDxMileHigh. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174197', 'title': 'Singapore', 'slug': 'ted-idea-search-singapore', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 0, 'duration_minutes': 1, 'published_at': '2026-03-25', 'recorded_on': '2026-03-25', 'views': 23267, 'topics': ['social change'], 'image': 'images/talk_031_ted-idea-search-singapore.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_singapore', 'description': "The TED Idea Search touches down in Singapore, where eight speakers compete for an extraordinary prize. From a diver-turned-ocean-restorer reviving dead coral reefs to a scientist growing sustainable building materials out of fungus and a government insider reimagining public institutions, the ideas are as diverse as the Lion City itself. As TED's coaches push each speaker to transform their thinking into a powerful narrative, nerves rise, breakthroughs emerge and one speaker earns the opportunity to share their idea on the global stage.", 'transcript': 'TED Idea Search opens by framing the central tension behind Singapore. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174672', 'title': 'My bank called in the middle of my TED Talk', 'slug': 'mike-albo-my-bank-called-in-the-middle-of-my-ted-talk', 'speaker': 'Mike Albo', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 344, 'duration_minutes': 6, 'published_at': '2026-03-25', 'recorded_on': '2025-11-10', 'views': 197679, 'topics': ['culture', 'technology', 'entertainment', 'consumerism', 'comedy', 'data'], 'image': 'images/talk_032_mike-albo-my-bank-called-in-the-middle-of-my-ted.jpg', 'canonical_url': 'https://www.ted.com/talks/mike_albo_my_bank_called_in_the_middle_of_my_ted_talk', 'description': 'In this TED Talk gone wrong, comedian Mike Albo receives an unexpected call from his bank. The result: a hilariously uncomfortable tour of his purchase history, and a reminder that in the digital age, our data knows us a little too well.', 'transcript': 'Mike Albo opens by framing the central tension behind My bank called in the middle of my TED Talk. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174466', 'title': '3 ways to create a truly original design', 'slug': 'lope-gutierrez-ruiz-3-ways-to-create-a-truly-original-design', 'speaker': 'Lope Gutierrez-Ruiz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 355, 'duration_minutes': 6, 'published_at': '2026-03-24', 'recorded_on': '2025-11-10', 'views': 217982, 'topics': ['culture', 'design', 'media', 'collaboration', 'creativity', 'art', 'ted fellows', 'animation'], 'image': 'images/talk_033_lope-gutierrez-ruiz-3-ways-to-create-a-truly-ori.jpg', 'canonical_url': 'https://www.ted.com/talks/lope_gutierrez_ruiz_3_ways_to_create_a_truly_original_design', 'description': "In a world where design trends are quietly converging - same color palettes, same typography, same illustration styles - how do you make work that actually looks different? Designer and TED Fellow Lope Gutierrez-Ruiz distills his answer into three sharp, counterintuitive ideas, ticking through his studio's own funky creations to show how you can make things that stand out.", 'transcript': 'Lope Gutierrez-Ruiz opens by framing the central tension behind 3 ways to create a truly original design. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174464', 'title': '3 things I wish I knew when I was broke', 'slug': 'vivian-tu-3-things-i-wish-i-knew-when-i-was-broke', 'speaker': 'Vivian Tu', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 560, 'duration_minutes': 9, 'published_at': '2026-03-23', 'recorded_on': '2025-11-10', 'views': 300368, 'topics': ['business', 'personal growth', 'women in business', 'money', 'finance'], 'image': 'images/talk_034_vivian-tu-3-things-i-wish-i-knew-when-i-was-brok.jpg', 'canonical_url': 'https://www.ted.com/talks/vivian_tu_3_things_i_wish_i_knew_when_i_was_broke', 'description': "Finance doesn't have to feel like a foreign language. Wall Street trader-turned-financial educator Vivian Tu helps millions of people make sense of money, breaking down complex concepts into everyday terms you can understand. She shares how she broke free from the stress of living paycheck to paycheck - and explores how we can shift power structures to give everyone a real shot at building wealth.", 'transcript': 'Vivian Tu opens by framing the central tension behind 3 things I wish I knew when I was broke. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174728', 'title': 'Joy will find you - if you let it', 'slug': 'david-larbi-joy-will-find-you-if-you-let-it', 'speaker': 'David Larbi', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 305, 'duration_minutes': 5, 'published_at': '2026-03-20', 'recorded_on': '2025-11-10', 'views': 243270, 'topics': ['performance', 'creativity', 'poetry', 'happiness', 'personal growth'], 'image': 'images/talk_035_david-larbi-joy-will-find-you-if-you-let-it.jpg', 'canonical_url': 'https://www.ted.com/talks/david_larbi_joy_will_find_you_if_you_let_it', 'description': 'Author David Larbi recites a poem about the journey toward joy, reminding us of all the ways it can be found: having a conversation with a stranger, tasting the perfect bite of food or enjoying a good stretch. Joy is all around us - you just need to know where to look.', 'transcript': 'David Larbi opens by framing the central tension behind Joy will find you - if you let it. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174196', 'title': 'London, UK', 'slug': 'ted-idea-search-london-uk', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2786, 'duration_minutes': 46, 'published_at': '2026-03-19', 'recorded_on': '2026-03-19', 'views': 38468, 'topics': ['social change'], 'image': 'images/talk_036_ted-idea-search-london-uk.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_london_uk', 'description': "In London, the TED Idea Search brings together 10 voices from one of the world's most influential cultural capitals to compete for the opportunity to speak on the main stage at TED. From a civil engineer revealing the invisible infrastructure shaping our cities to a classical singer uncovering the erased history of women in music, the ideas on offer are both deeply personal and global in scope. When the lights come up, London doesn't hold back - and one speaker delivers a talk no one in that room will soon forget.", 'transcript': 'TED Idea Search opens by framing the central tension behind London, UK. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173046', 'title': 'How to tune your inner voice', 'slug': 'rhonda-ross-daniel-alexander-jones-how-to-tune-your-inner-voice', 'speaker': 'Rhonda Ross, Daniel Alexander Jones', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1196, 'duration_minutes': 20, 'published_at': '2026-03-19', 'recorded_on': '2025-11-09', 'views': 226951, 'topics': ['culture', 'music', 'creativity', 'art', 'relationships', 'personal growth', 'society', 'ted fellows', 'emotions'], 'image': 'images/talk_037_rhonda-ross-daniel-alexander-jones-how-to-tune-y.jpg', 'canonical_url': 'https://www.ted.com/talks/rhonda_ross_daniel_alexander_jones_how_to_tune_your_inner_voice', 'description': 'To calm the storm inside your mind, you must first understand it. Singer and actress Rhonda Ross shares her theory of "emotional sovereignty" - the idea that your feelings aren\'t shaped just by your circumstances, but by the thoughts running on loop in your head. In conversation with scholar and TED Fellow Daniel Alexander Jones, Ross introduces the unexpected, music-rooted practice for taking control of your narrative.', 'transcript': 'Rhonda Ross, Daniel Alexander Jones opens by framing the central tension behind How to tune your inner voice. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174671', 'title': 'The 6 eras of NBA fashion - from restrained to radical', 'slug': 'mitchell-s-jackson-the-6-eras-of-nba-fashion-from-restrained-to-radical', 'speaker': 'Mitchell S. Jackson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 564, 'duration_minutes': 9, 'published_at': '2026-03-19', 'recorded_on': '2025-11-11', 'views': 183882, 'topics': ['culture', 'history', 'sports', 'fashion', 'ted fellows', 'protest'], 'image': 'images/talk_038_mitchell-s-jackson-the-6-eras-of-nba-fashion-fro.jpg', 'canonical_url': 'https://www.ted.com/talks/mitchell_s_jackson_the_6_eras_of_nba_fashion_from_restrained_to_radical', 'description': 'What are you wearing, and why? This is the question that writer and TED Fellow Mitchell S. Jackson asks as he unpacks the six eras of NBA style. Tracing an arc from Bill Russell to Lebron James and beyond, he explores how players use fashion on and off the court to challenge the limits placed upon them - revealing a deeper story about culture, identity and power.', 'transcript': 'Mitchell S. Jackson opens by framing the central tension behind The 6 eras of NBA fashion - from restrained to radical. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174584', 'title': 'I taught rats to drive. They taught me to enjoy the ride', 'slug': 'kelly-lambert-i-taught-rats-to-drive-they-taught-me-to-enjoy-the-ride', 'speaker': 'Kelly Lambert', 'event': 'TEDxRVA Youth', 'talk_type': 'TEDx Talk', 'duration_seconds': 840, 'duration_minutes': 14, 'published_at': '2026-03-18', 'recorded_on': '2025-11-09', 'views': 217160, 'topics': ['science', 'animals', 'happiness', 'brain', 'neuroscience', 'tedx', 'emotions'], 'image': 'images/talk_039_kelly-lambert-i-taught-rats-to-drive-they-taught.jpg', 'canonical_url': 'https://www.ted.com/talks/kelly_lambert_i_taught_rats_to_drive_they_taught_me_to_enjoy_the_ride', 'description': 'What can happy rats teach us about human joy? Behavioral neuroscientist Kelly Lambert describes how her team trained rats to drive tiny cars to earn treats - and noticed something surprising about how effort and anticipation affect the brain. The experiment opens new questions about how reward, agency and "behaviorceuticals" might help build resilience and support mental health.', 'transcript': 'Kelly Lambert opens by framing the central tension behind I taught rats to drive. They taught me to enjoy the ride. The talk then connects evidence, lived experience, and examples from TEDxRVA Youth. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174670', 'title': 'Is luck random - or can you cultivate it?', 'slug': 'christian-busch-is-luck-random-or-can-you-cultivate-it', 'speaker': 'Christian Busch', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 768, 'duration_minutes': 13, 'published_at': '2026-03-17', 'recorded_on': '2025-10-23', 'views': 833338, 'topics': ['science', 'future', 'personal growth', 'decision-making'], 'image': 'images/talk_040_christian-busch-is-luck-random-or-can-you-cultiv.jpg', 'canonical_url': 'https://www.ted.com/talks/christian_busch_is_luck_random_or_can_you_cultivate_it', 'description': 'When the 2025 Los Angeles wildfires destroyed his home and neighborhood, scientist Christian Busch encountered the opposite of serendipity: "zemblanity," or bad luck by design. Drawing on more than a decade of scientific research, he explores how people can navigate unpredictability by adopting a serendipity mindset that transforms setbacks into unexpected new beginnings. He asks: What if good luck isn\'t random but can actually be cultivated?', 'transcript': 'Christian Busch opens by framing the central tension behind Is luck random - or can you cultivate it?. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174283', 'title': 'How to make transportation quieter, cleaner and cheaper', 'slug': 'doreen-orishaba-how-to-make-transportation-quieter-cleaner-and-cheaper', 'speaker': 'Doreen Orishaba', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-03-16', 'recorded_on': '2025-06-18', 'views': 214856, 'topics': ['climate change', 'transportation', 'africa', 'countdown'], 'image': 'images/talk_041_doreen-orishaba-how-to-make-transportation-quiet.jpg', 'canonical_url': 'https://www.ted.com/talks/doreen_orishaba_how_to_make_transportation_quieter_cleaner_and_cheaper', 'description': 'When Doreen Orishaba helped build Africa\'s first electric car in 2011, skeptics dismissed it as a "toy for the Western world." Now she\'s running dozens of electric buses across Kenya and Rwanda, moving thousands of passengers to work every day on zero-exhaust vehicles powered by near-silent engines. She breaks down what it actually takes to scale clean transport - and why skipping the gas station pit stop is closer than you may think.', 'transcript': 'Doreen Orishaba opens by framing the central tension behind How to make transportation quieter, cleaner and cheaper. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174282', 'title': 'What China can teach the world about scaling clean energy', 'slug': 'yin-yu-what-china-can-teach-the-world-about-scaling-clean-energy', 'speaker': 'Yin Yu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 545, 'duration_minutes': 9, 'published_at': '2026-03-13', 'recorded_on': '2025-06-18', 'views': 8098, 'topics': ['climate change', 'sustainability', 'energy', 'china', 'solar energy', 'countdown', 'renewable energy'], 'image': 'images/talk_042_yin-yu-what-china-can-teach-the-world-about-scal.jpg', 'canonical_url': 'https://www.ted.com/talks/yin_yu_what_china_can_teach_the_world_about_scaling_clean_energy', 'description': 'When Yin Yu first visited a major hydropower dam site in China, she expected to see a thriving community. Instead, she found families who\'d lost their land and livelihoods to the rising water. It was a powerful lesson in how "green" megaprojects can harm the people they\'re meant to help. Now, as solar and electric vehicles spread rapidly across Southeast Asia, Yin says the opportunity is enormous - but only if countries don\'t repeat the mistakes of the past.', 'transcript': 'Yin Yu opens by framing the central tension behind What China can teach the world about scaling clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174195', 'title': 'Lagos, Nigeria', 'slug': 'ted-idea-search-lagos-nigeria', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2792, 'duration_minutes': 47, 'published_at': '2026-03-12', 'recorded_on': '2026-03-12', 'views': 20035, 'topics': ['social change'], 'image': 'images/talk_043_ted-idea-search-lagos-nigeria.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_lagos_nigeria', 'description': "In the heart of Lagos - a megacity of 20 million people pulsing with energy and big ambitions - nine undiscovered voices compete for a chance to speak on the world's biggest stage for ideas. From a renewable energy advocate who studied by candlelight to an archivist reimagining Africa-centered education, these speakers bring stories with global stakes. But only one will earn the 7,000-mile journey to the TED stage in Vancouver.", 'transcript': 'TED Idea Search opens by framing the central tension behind Lagos, Nigeria. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '137525', 'title': '"May Your Kindness Remain" / "If I Told"', 'slug': 'courtney-marie-andrews-may-your-kindness-remain-if-i-told', 'speaker': 'Courtney Marie Andrews', 'event': 'TEDCountdown@BloombergGreenFestival', 'talk_type': 'TED Stage Talk', 'duration_seconds': 634, 'duration_minutes': 11, 'published_at': '2026-03-11', 'recorded_on': '2024-07-12', 'views': 8624, 'topics': ['environment', 'music', 'performance'], 'image': 'images/talk_044_courtney-marie-andrews-may-your-kindness-remain-.jpg', 'canonical_url': 'https://www.ted.com/talks/courtney_marie_andrews_may_your_kindness_remain_if_i_told', 'description': 'Singer-songwriter Courtney Marie Andrews performs "If I Told" and "May Your Kindness Remain," songs based on her connection to music, nature and environmental advocacy.', 'transcript': 'Courtney Marie Andrews opens by framing the central tension behind "May Your Kindness Remain" / "If I Told". The talk then connects evidence, lived experience, and examples from TEDCountdown@BloombergGreenFestival. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174194', 'title': 'Athens, Greece', 'slug': 'ted-idea-search-athens-greece', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2892, 'duration_minutes': 48, 'published_at': '2026-03-10', 'recorded_on': '2026-03-10', 'views': 38463, 'topics': ['social change'], 'image': 'images/talk_045_ted-idea-search-athens-greece.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_athens_greece', 'description': "The next stop on the TED Idea Search is Athens, birthplace of democracy and the world's oldest debating tradition. Nine speakers - from a fashion manufacturer taking on modern slavery to a microbiologist tackling the science of bad breath - go head-to-head for a shot to speak on the TED stage in Vancouver. Rehearsals are rocky, nerves are real and the stakes couldn't be higher - and only one speaker gets to move on and represent Athens to the world.", 'transcript': 'TED Idea Search opens by framing the central tension behind Athens, Greece. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173420', 'title': 'What would your "deathbed self" tell you today?', 'slug': 'lauren-deeley-what-would-your-deathbed-self-tell-you-today', 'speaker': 'Lauren Deeley', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 379, 'duration_minutes': 6, 'published_at': '2026-03-10', 'recorded_on': '2025-11-10', 'views': 252860, 'topics': ['future', 'work', 'personal growth', 'self', 'money', 'life'], 'image': 'images/talk_046_lauren-deeley-what-would-your-deathbed-self-tell.jpg', 'canonical_url': 'https://www.ted.com/talks/lauren_deeley_what_would_your_deathbed_self_tell_you_today', 'description': 'What if the key to making better decisions today is getting to know the person you\'ll become tomorrow? Drawing on psychological research and real-life stories, private wealth advisor Lauren Deeley explores how building a meaningful connection with your "deathbed self" can bring more clarity, joy and intention to the life you\'re building right now.', 'transcript': 'Lauren Deeley opens by framing the central tension behind What would your "deathbed self" tell you today?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174009', 'title': 'Mumbai, India', 'slug': 'ted-idea-search-mumbai-india', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2738, 'duration_minutes': 46, 'published_at': '2026-03-09', 'recorded_on': '2026-03-09', 'views': 22102, 'topics': ['social change'], 'image': 'images/talk_047_ted-idea-search-mumbai-india.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_mumbai_india', 'description': "In Mumbai, the TED Idea Search lands in India's bustling financial and creative capital, where 10 speakers are challenged to deliver the talk of their lives and compete for a one-of-a-kind opportunity: a spot on the TED stage in Vancouver. What emerges is a moving portrait of vulnerability and ambition, as ideas about vanishing tribal art, maternal health and India's forgotten fashion history look to shift perspectives on a global scale. Only one can make it through - who will it be?", 'transcript': 'TED Idea Search opens by framing the central tension behind Mumbai, India. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173439', 'title': 'Why you should keep a list of what makes you laugh', 'slug': 'chris-duffy-why-you-should-keep-a-list-of-what-makes-you-laugh', 'speaker': 'Chris Duffy', 'event': 'TED Talks Daily Book Club', 'talk_type': 'TED Stage Talk', 'duration_seconds': 3426, 'duration_minutes': 57, 'published_at': '2026-03-09', 'recorded_on': '2026-02-18', 'views': 229371, 'topics': ['culture', 'creativity', 'personal growth', 'comedy', 'humor'], 'image': 'images/talk_048_chris-duffy-why-you-should-keep-a-list-of-what-m.jpg', 'canonical_url': 'https://www.ted.com/talks/chris_duffy_why_you_should_keep_a_list_of_what_makes_you_laugh', 'description': 'The world is weird and hilarious - if you know where to look, says comedian Chris Duffy. In conversation with "TED Talks Daily" host Elise Hu, Duffy breaks down three practical pillars of humor, showing how laughter can help you feel present, creative and connected, even when the world feels overwhelming. (This conversation was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)', 'transcript': 'Chris Duffy opens by framing the central tension behind Why you should keep a list of what makes you laugh. The talk then connects evidence, lived experience, and examples from TED Talks Daily Book Club. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172133', 'title': 'Conservation: a love story', 'slug': 'elsaphan-njora-conservation-a-love-story', 'speaker': 'Elsaphan Njora', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 520, 'duration_minutes': 9, 'published_at': '2026-03-06', 'recorded_on': '2025-06-17', 'views': 208417, 'topics': ['climate change', 'nature', 'love', 'biodiversity', 'conservation', 'countdown'], 'image': 'images/talk_049_elsaphan-njora-conservation-a-love-story.jpg', 'canonical_url': 'https://www.ted.com/talks/elsaphan_njora_conservation_a_love_story', 'description': "What if the key to saving nature isn't just about science or policy, but love? Love for the land, for the people who depend on it, for the world we leave behind. Artist Elsaphan Njora has journeyed across Kenya witnessing ecosystems vanish, from Indigenous forests to sacred lakes. But he's also seen communities breathing life back into rivers, forests and coasts in creative, unexpected ways - showing that conservation can flourish alongside livelihoods, and that even the most threatened landscapes can be reborn.", 'transcript': 'Elsaphan Njora opens by framing the central tension behind Conservation: a love story. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173850', 'title': 'Sydney, Australia', 'slug': 'ted-idea-search-sydney-australia', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2625, 'duration_minutes': 44, 'published_at': '2026-03-04', 'recorded_on': '2026-03-04', 'views': 46087, 'topics': ['society'], 'image': 'images/talk_050_ted-idea-search-sydney-australia.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_sydney_australia', 'description': "In the premiere of the TED Idea Search, we travel to Sydney, Australia, where 10 brilliant people take the stage for the shot of a lifetime: a chance to speak at the TED conference in Vancouver. From a wildlife scientist deploying AI to bust illegal trafficking networks to Australia's own human rights commissioner sounding the alarm on brain-reading technology, these speakers bring ideas that could genuinely shift how we live. But only one can win - and the choice comes down to a single, unforgettable talk that leaves the audience (and the judges) blown away.", 'transcript': 'TED Idea Search opens by framing the central tension behind Sydney, Australia. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173043', 'title': '3 habits to practice curiosity - and escape your phone', 'slug': 'nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone', 'speaker': 'Nayeema Raza', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 312, 'duration_minutes': 5, 'published_at': '2026-03-04', 'recorded_on': '2025-11-11', 'views': 554563, 'topics': ['culture', 'technology', 'social change', 'society', 'curiosity'], 'image': 'images/talk_051_nayeema-raza-3-habits-to-practice-curiosity-and-.jpg', 'canonical_url': 'https://www.ted.com/talks/nayeema_raza_3_habits_to_practice_curiosity_and_escape_your_phone', 'description': "We're so entangled with our devices that online has started to feel more real than IRL, says journalist Nayeema Raza. As screens reshape how we connect and relate, she offers three practical habits to reignite curiosity, restore presence and break free from our phones.", 'transcript': 'Nayeema Raza opens by framing the central tension behind 3 habits to practice curiosity - and escape your phone. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173440', 'title': '4 relationship traps that lead to burnout', 'slug': 'eric-quintane-4-relationship-traps-that-lead-to-burnout', 'speaker': 'Eric Quintane', 'event': 'TEDxESMTBerlin', 'talk_type': 'TEDx Talk', 'duration_seconds': 991, 'duration_minutes': 17, 'published_at': '2026-03-04', 'recorded_on': '2025-02-01', 'views': 285438, 'topics': ['business', 'psychology', 'relationships', 'communication', 'work', 'personal growth', 'society', 'tedx'], 'image': 'images/talk_052_eric-quintane-4-relationship-traps-that-lead-to-.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_quintane_4_relationship_traps_that_lead_to_burnout', 'description': 'Are your workplace relationships quietly burning you out? Drawing on large-scale research across industries, organizational behavior researcher Eric Quintane reveals four hidden relational traps woven into the fabric of work - and explores how connection shapes resilience, vulnerability and burnout.', 'transcript': 'Eric Quintane opens by framing the central tension behind 4 relationship traps that lead to burnout. The talk then connects evidence, lived experience, and examples from TEDxESMTBerlin. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173576', 'title': 'Love, intimacy and connection in the age of AI', 'slug': 'bryony-cole-love-intimacy-and-connection-in-the-age-of-ai', 'speaker': 'Bryony Cole', 'event': 'TED Membership', 'talk_type': 'TED Stage Talk', 'duration_seconds': 2631, 'duration_minutes': 44, 'published_at': '2026-03-03', 'recorded_on': '2026-02-05', 'views': 203689, 'topics': ['technology', 'love', 'relationships', 'ai', 'sex', 'ted membership'], 'image': 'images/talk_053_bryony-cole-love-intimacy-and-connection-in-the-.jpg', 'canonical_url': 'https://www.ted.com/talks/bryony_cole_love_intimacy_and_connection_in_the_age_of_ai', 'description': "Relationships were never meant to be efficient, says sextech expert Bryony Cole, and yet AI companions are increasingly designed to be exactly that. As intimate relationships between humans and AI become more common, Cole challenges us to think more deliberately about how we shape our connections to machines - and with each other. (This conversation, hosted by TED's Whitney Pennington Rodgers, was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)", 'transcript': 'Bryony Cole opens by framing the central tension behind Love, intimacy and connection in the age of AI. The talk then connects evidence, lived experience, and examples from TED Membership. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173044', 'title': 'The sneaky language tricks cults use to influence you', 'slug': 'amanda-montell-the-sneaky-language-tricks-cults-use-to-influence-you', 'speaker': 'Amanda Montell', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 354, 'duration_minutes': 6, 'published_at': '2026-03-02', 'recorded_on': '2025-11-11', 'views': 260199, 'topics': ['culture', 'media', 'relationships', 'communication', 'community', 'language', 'society'], 'image': 'images/talk_054_amanda-montell-the-sneaky-language-tricks-cults-.jpg', 'canonical_url': 'https://www.ted.com/talks/amanda_montell_the_sneaky_language_tricks_cults_use_to_influence_you', 'description': "In the age of social media and wellness trends, the comments section is as good as a cult compound, says linguist and cultural commentator Amanda Montell. Using Taylor Swift's throng of devoted Swifties as her guide, she exposes three sneaky language tactics that cults use to influence us (for better or for worse), revealing why none of us are as cult-proof as we'd like to think.", 'transcript': 'Amanda Montell opens by framing the central tension behind The sneaky language tricks cults use to influence you. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173511', 'title': 'The attack on Iran - why now?', 'slug': 'ian-bremmer-the-attack-on-iran-why-now', 'speaker': 'Ian Bremmer', 'event': 'TED Explains the World with Ian Bremmer', 'talk_type': 'Original Content', 'duration_seconds': 2669, 'duration_minutes': 44, 'published_at': '2026-03-01', 'recorded_on': '2026-02-28', 'views': 684021, 'topics': ['global issues', 'politics', 'military', 'war', 'government', 'middle east', 'policy', 'international relations', 'current events'], 'image': 'images/talk_055_ian-bremmer-the-attack-on-iran-why-now.jpg', 'canonical_url': 'https://www.ted.com/talks/ian_bremmer_the_attack_on_iran_why_now', 'description': 'On the morning of February 28, 2026, the US and Israel bombed several parts of Iran, including the Tehran compound of Supreme Leader Ali Khamenei. Geopolitical expert and Eurasia Group founder Ian Bremmer breaks down why US President Donald Trump made the decision to strike, what it means for hopes of "regime change" and the key details you need to know about this perilous moment in global history. (This interview, hosted by TED\'s Helen Walters, was recorded on February 28, 2026.)', 'transcript': 'Ian Bremmer opens by framing the central tension behind The attack on Iran - why now?. The talk then connects evidence, lived experience, and examples from TED Explains the World with Ian Bremmer. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173004', 'title': "What to do when you're told there's nothing left to try", 'slug': 'david-fajgenbaum-and-kiah-williams-what-to-do-when-you-re-told-there-s-nothing-left-to-try', 'speaker': 'David Fajgenbaum and Kiah Williams', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1720, 'duration_minutes': 29, 'published_at': '2026-02-27', 'recorded_on': '2025-11-10', 'views': 220867, 'topics': ['science', 'technology', 'social change', 'health', 'health care', 'medicine', 'poverty', 'personal growth', 'ai', 'public health', 'medical research', 'the audacious project', 'artificial intelligence'], 'image': 'images/talk_056_david-fajgenbaum-and-kiah-williams-what-to-do-wh.jpg', 'canonical_url': 'https://www.ted.com/talks/david_fajgenbaum_and_kiah_williams_what_to_do_when_you_re_told_there_s_nothing_left_to_try', 'description': "What do you do when the world declares something impossible? When physician-scientist David Fajgenbaum was dying from a rare disease and social entrepreneur Kiah Williams was confronting the realities of economic hardship, they began asking a different question: What can I do today? In this conversation, they discuss how turning hope into action can drive meaningful change - one step at a time. (This conversation is hosted by The Audacious Project's Alexandra Tillmann.)", 'transcript': "David Fajgenbaum and Kiah Williams opens by framing the central tension behind What to do when you're told there's nothing left to try. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172996', 'title': 'My year living with a robot', 'slug': 'emily-kate-genatowski-my-year-living-with-a-robot', 'speaker': 'Emily Kate Genatowski', 'event': 'TEDAI Vienna 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 830, 'duration_minutes': 14, 'published_at': '2026-02-25', 'recorded_on': '2025-09-26', 'views': 246590, 'topics': ['technology', 'robots', 'ai', 'life'], 'image': 'images/talk_057_emily-kate-genatowski-my-year-living-with-a-robo.jpg', 'canonical_url': 'https://www.ted.com/talks/emily_kate_genatowski_my_year_living_with_a_robot', 'description': "Imagine a robot moving into your home. How would it change your daily life? Historian Emily Kate Genatowski shares five eye-opening lessons from a year living with her AI-powered robot roommate, from the quirky and chaotic to the surprisingly mundane. Her experiences show that the future of robots isn't science fiction - it's practical, messy and already here.", 'transcript': 'Emily Kate Genatowski opens by framing the central tension behind My year living with a robot. The talk then connects evidence, lived experience, and examples from TEDAI Vienna 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172999', 'title': 'Jermaine Dupri on the art of making a hit | On the Spot', 'slug': 'jermaine-dupri-jermaine-dupri-on-the-art-of-making-a-hit-on-the-spot', 'speaker': 'Jermaine Dupri', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 660, 'duration_minutes': 11, 'published_at': '2026-02-26', 'recorded_on': '2025-11-10', 'views': 211240, 'topics': ['culture', 'entertainment', 'music', 'collaboration', 'creativity', 'art'], 'image': 'images/talk_058_jermaine-dupri-jermaine-dupri-on-the-art-of-maki.jpg', 'canonical_url': 'https://www.ted.com/talks/jermaine_dupri_jermaine_dupri_on_the_art_of_making_a_hit_on_the_spot', 'description': 'Legendary music producer Jermaine Dupri pulls back the curtain on how hit songs really get made in TED\'s rapid-fire Q&A format, "On the Spot." Answering a stream of unexpected questions, he covers what makes a good hook, why he doesn\'t chase "cool," how he helped build Atlanta\'s sound and more.', 'transcript': 'Jermaine Dupri opens by framing the central tension behind Jermaine Dupri on the art of making a hit | On the Spot. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '171661', 'title': 'The controversial climate tool funding real change', 'slug': 'sandeep-roy-choudhury-the-controversial-climate-tool-funding-real-change', 'speaker': 'Sandeep Roy Choudhury', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 535, 'duration_minutes': 9, 'published_at': '2026-02-24', 'recorded_on': '2025-06-17', 'views': 221876, 'topics': ['climate change', 'environment', 'sustainability', 'finance', 'countdown'], 'image': 'images/talk_059_sandeep-roy-choudhury-the-controversial-climate-.jpg', 'canonical_url': 'https://www.ted.com/talks/sandeep_roy_choudhury_the_controversial_climate_tool_funding_real_change', 'description': "If a company plants trees to offset its pollution, is that climate progress - or is it greenwashing? Critics of carbon markets say it's the latter. But Sandeep Roy Choudhury, who's spent two decades financing climate projects from rural cookstoves to coastal forests, says the real failure is discouraging companies from even trying. Hear his case for why we shouldn't let perfection block meaningful action on climate change.", 'transcript': 'Sandeep Roy Choudhury opens by framing the central tension behind The controversial climate tool funding real change. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172142', 'title': 'A surprisingly effective way to fight misinformation', 'slug': 'dave-jorgenson-a-surprisingly-effective-way-to-fight-misinformation', 'speaker': 'Dave Jorgenson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 754, 'duration_minutes': 13, 'published_at': '2026-02-23', 'recorded_on': '2025-11-09', 'views': 406598, 'topics': ['culture', 'media', 'humor', 'society', 'internet'], 'image': 'images/talk_060_dave-jorgenson-a-surprisingly-effective-way-to-f.jpg', 'canonical_url': 'https://www.ted.com/talks/dave_jorgenson_a_surprisingly_effective_way_to_fight_misinformation', 'description': "What if the best defense against misinformation isn't panic, but a punchline? Journalist and comedian Dave Jorgenson explores how misinformation has proliferated throughout history - from the age of Plato to the era of viral TikToks. With his own short, absurdist sketches that explain the news, he shows how humor can cut through fear, spark curiosity and explore nuanced truth.", 'transcript': 'Dave Jorgenson opens by framing the central tension behind A surprisingly effective way to fight misinformation. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172495', 'title': 'How a viral choreographer makes his moves', 'slug': 'sean-bankhead-how-a-viral-choreographer-makes-his-moves', 'speaker': 'Sean Bankhead', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 399, 'duration_minutes': 7, 'published_at': '2026-02-20', 'recorded_on': '2025-11-09', 'views': 26868, 'topics': ['culture', 'music', 'performance', 'art', 'dance'], 'image': 'images/talk_061_sean-bankhead-how-a-viral-choreographer-makes-hi.jpg', 'canonical_url': 'https://www.ted.com/talks/sean_bankhead_how_a_viral_choreographer_makes_his_moves', 'description': 'In a swaggering performance, choreographer Sean Bankhead and his students perform the viral dance he designed for Victoria Monet\'s hit song "On My Mama." Rooted in Black culture and inspired by generations of iconic artists, Bankhead blends expertise with at least one move everyone can try - showing how choreography doesn\'t just reflect culture, it drives it forward.', 'transcript': 'Sean Bankhead opens by framing the central tension behind How a viral choreographer makes his moves. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172774', 'title': "The story you're not hearing about AI data centers", 'slug': 'ay-e-coskun-the-story-you-re-not-hearing-about-ai-data-centers', 'speaker': 'Ayse Coskun', 'event': 'TEDAI San Francisco', 'talk_type': 'TED Stage Talk', 'duration_seconds': 717, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-21', 'views': 302717, 'topics': ['environment', 'sustainability', 'technology', 'energy', 'ai', 'data', 'renewable energy'], 'image': 'images/talk_062_ay-e-coskun-the-story-you-re-not-hearing-about-a.jpg', 'canonical_url': 'https://www.ted.com/talks/ay_e_coskun_the_story_you_re_not_hearing_about_ai_data_centers', 'description': "The race to build smarter AI is crashing into a physical limitation: the power grid simply can't keep up with the energy demands of data centers. Computer scientist Ayse Coskun shows how we could turn this problem on its head, transforming AI facilities into virtual batteries that help stabilize the grid and accelerate clean energy. Learn why the technology causing this crisis might be the only thing smart enough to fix it.", 'transcript': "Ayse Coskun opens by framing the central tension behind The story you're not hearing about AI data centers. The talk then connects evidence, lived experience, and examples from TEDAI San Francisco. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '170176', 'title': 'How to be a great listener', 'slug': 'maegan-stephens-nicole-lowenbraun-how-to-be-a-great-listener', 'speaker': 'Maegan Stephens, Nicole Lowenbraun', 'event': 'TED@BCG', 'talk_type': 'TED Stage Talk', 'duration_seconds': 706, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-23', 'views': 357273, 'topics': ['communication', 'leadership', 'work', 'trust', 'goals'], 'image': 'images/talk_063_maegan-stephens-nicole-lowenbraun-how-to-be-a-gr.jpg', 'canonical_url': 'https://www.ted.com/talks/maegan_stephens_nicole_lowenbraun_how_to_be_a_great_listener', 'description': 'Have you ever left a meeting thinking: everyone talked, but nothing was achieved? Chances are that people were listening to each other, just not in the same way. Listening experts Maegan Stephens and Nicole Lowenbraun unpack the four different ways to listen, sharing a practical framework that could change how you respond, build trust and get results - starting with just one simple question.', 'transcript': 'Maegan Stephens, Nicole Lowenbraun opens by framing the central tension behind How to be a great listener. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '170828', 'title': "What you know that AI doesn't", 'slug': 'priyanka-vergadia-what-you-know-that-ai-doesn-t', 'speaker': 'Priyanka Vergadia', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 559, 'duration_minutes': 9, 'published_at': '2026-02-18', 'recorded_on': '2025-11-10', 'views': 278682, 'topics': ['technology', 'collaboration', 'work', 'ai', 'career'], 'image': 'images/talk_064_priyanka-vergadia-what-you-know-that-ai-doesn-t.jpg', 'canonical_url': 'https://www.ted.com/talks/priyanka_vergadia_what_you_know_that_ai_doesn_t', 'description': "AI is good at seeing patterns, but it's humans who figure out what to do next, says technologist Priyanka Vergadia. She shares three stories of human excellence sparked by AI insights and offers a pathway to identify and cultivate your irreplaceable qualities, turning the AI revolution from a threat into an opportunity.", 'transcript': "Priyanka Vergadia opens by framing the central tension behind What you know that AI doesn't. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}] +TALKS = [{'source_id': '178768', 'title': 'The wildlife sanctuary you can visit from anywhere', 'slug': 'maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere', 'speaker': 'Maya Higa', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 568, 'duration_minutes': 9, 'published_at': '2026-05-12', 'recorded_on': '2026-04-14', 'views': 150000, 'topics': ['media', 'social change', 'animals', 'nature', 'social media', 'internet', 'conservation', 'wildlife'], 'image': 'images/talk_001_maya-higa-the-wildlife-sanctuary-you-can-visit-f.jpg', 'canonical_url': 'https://www.ted.com/talks/maya_higa_the_wildlife_sanctuary_you_can_visit_from_anywhere', 'description': 'Creator Maya Higa is on a mission to use the internet to build the next generation of conservationists. Her virtual education center, Alveus Sanctuary, is one of the most-watched sanctuaries on Earth, with dozens of rescued animals and cameras livestreaming to a community of millions inspired to help protect the wildlife. Visit with Bean the Hawk, Winnie the Moo and more - and see what the future of conservation looks like.', 'transcript': 'Maya Higa opens by framing the central tension behind The wildlife sanctuary you can visit from anywhere. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178681', 'title': "Waymo's case for a driverless future", 'slug': 'tekedra-mawakana-sal-khan-waymo-s-case-for-a-driverless-future', 'speaker': 'Tekedra Mawakana, Sal Khan', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1154, 'duration_minutes': 19, 'published_at': '2026-05-11', 'recorded_on': '2026-04-15', 'views': 157919, 'topics': ['technology', 'future', 'society', 'driverless cars'], 'image': 'images/talk_002_tekedra-mawakana-sal-khan-waymo-s-case-for-a-dri.jpg', 'canonical_url': 'https://www.ted.com/talks/tekedra_mawakana_sal_khan_waymo_s_case_for_a_driverless_future', 'description': "What if we could solve the problem of fatal car accidents? Waymo co-CEO Tekedra Mawakana joins TED's Sal Khan to explore why fully autonomous vehicles (where you never have to touch the wheel) could end the dangerous status quo of traffic deaths. She makes the case for why self-driving cars are more than a tech novelty - they're an urgently needed upgrade that could make the world safer for everyone.", 'transcript': "Tekedra Mawakana, Sal Khan opens by framing the central tension behind Waymo's case for a driverless future. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177895', 'title': 'Why I love my bad days', 'slug': 'alexi-pappas-why-i-love-my-bad-days', 'speaker': 'Alexi Pappas', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 310, 'duration_minutes': 5, 'published_at': '2026-05-08', 'recorded_on': '2025-11-11', 'views': 6052, 'topics': ['psychology', 'philosophy', 'happiness', 'sports', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_003_alexi-pappas-why-i-love-my-bad-days.jpg', 'canonical_url': 'https://www.ted.com/talks/alexi_pappas_why_i_love_my_bad_days', 'description': "One month before the Rio Olympics, runner Alexi Pappas couldn't hit her splits in practice. She was begging her watch to change its mind. Then her coach told her to take it off - and shared the best advice she's ever received. That single piece of wisdom led her to break a national record and changed how she chases her goals, carrying her through ultramarathons, a memoir and three films. Bad days aren't a detour, she says - they mean you're right on track.", 'transcript': 'Alexi Pappas opens by framing the central tension behind Why I love my bad days. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178367', 'title': 'What really won the trillion-dollar Supreme Court case', 'slug': 'neal-kumar-katyal-what-really-won-the-trillion-dollar-supreme-court-case', 'speaker': 'Neal Kumar Katyal', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1091, 'duration_minutes': 18, 'published_at': '2026-05-07', 'recorded_on': '2026-04-17', 'views': 154312, 'topics': ['culture', 'ai', 'law', 'society', 'policy'], 'image': 'images/talk_004_neal-kumar-katyal-what-really-won-the-trillion-d.jpg', 'canonical_url': 'https://www.ted.com/talks/neal_kumar_katyal_what_really_won_the_trillion_dollar_supreme_court_case', 'description': "In November 2025, Neal Kumar Katyal was asked to do what no US Supreme Court litigator had ever done: convince the justices to strike down a sitting president's signature initiative. After enlisting the help of four unlikely coaches - and one secret weapon he hasn't told anyone about until now - he walked into the courtroom ready for anything. What he discovered about winning and connecting might just change how you think about performing under pressure.", 'transcript': 'Neal Kumar Katyal opens by framing the central tension behind What really won the trillion-dollar Supreme Court case. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '178175', 'title': 'The rising cost of dissent in America', 'slug': 'miles-taylor-the-rising-cost-of-dissent-in-america-may-2026', 'speaker': 'Miles Taylor', 'event': 'TEDxMidAtlantic', 'talk_type': 'TEDx Talk', 'duration_seconds': 1166, 'duration_minutes': 19, 'published_at': '2026-05-04', 'recorded_on': '2025-11-01', 'views': 154789, 'topics': ['politics', 'media', 'social change', 'united states', 'democracy', 'government'], 'image': 'images/talk_005_miles-taylor-the-rising-cost-of-dissent-in-ameri.jpg', 'canonical_url': 'https://www.ted.com/talks/miles_taylor_the_rising_cost_of_dissent_in_america_may_2026', 'description': "Former senior US national security official Miles Taylor shares a personal account that raises a broader civic concern: the growing cost of dissent in American public life. Drawing on his experience inside government and living the consequences of speaking openly, he says that the real threat to US democracy isn't the politicians or hard-liners - it's the two-thirds of Americans who don't speak up. (This talk contains mature language.)", 'transcript': 'Miles Taylor opens by framing the central tension behind The rising cost of dissent in America. The talk then connects evidence, lived experience, and examples from TEDxMidAtlantic. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '178086', 'title': 'Why AI is unlikely to become conscious', 'slug': 'anil-seth-why-ai-is-unlikely-to-become-conscious', 'speaker': 'Anil Seth', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 897, 'duration_minutes': 15, 'published_at': '2026-05-01', 'recorded_on': '2026-04-16', 'views': 191682, 'topics': ['technology', 'future', 'brain', 'consciousness', 'ai'], 'image': 'images/talk_006_anil-seth-why-ai-is-unlikely-to-become-conscious.jpg', 'canonical_url': 'https://www.ted.com/talks/anil_seth_why_ai_is_unlikely_to_become_conscious', 'description': 'We see consciousness in AI the same way we see faces in clouds, says neuroscientist Anil Seth. He explores the all-too-human tendency to project inner life onto machines that are brilliant mimics, not sentient beings, and gives a definitive answer to the urgent question: Will AI ever gain consciousness?', 'transcript': 'Anil Seth opens by framing the central tension behind Why AI is unlikely to become conscious. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175757', 'title': 'Reimagining traditional architecture for modern needs', 'slug': 'riyad-joucka-reimagining-traditional-architecture-for-modern-needs', 'speaker': 'Riyad Joucka', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 492, 'duration_minutes': 8, 'published_at': '2026-04-30', 'recorded_on': '2025-10-23', 'views': 153822, 'topics': ['technology', 'design', 'architecture', 'urban planning', 'innovation', '3d printing'], 'image': 'images/talk_007_riyad-joucka-reimagining-traditional-architectur.jpg', 'canonical_url': 'https://www.ted.com/talks/riyad_joucka_reimagining_traditional_architecture_for_modern_needs', 'description': "Architect Riyad Joucka believes your home should be a mirror of who you are. Using 3D printing and ancient architectural wisdom, he's designing efficient, personal homes that respond to context, climate and culture without sacrificing character. He makes the case that we should start designing for people, not the market.", 'transcript': 'Riyad Joucka opens by framing the central tension behind Reimagining traditional architecture for modern needs. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176563', 'title': 'How to invite creativity into your life', 'slug': 'rose-b-simpson-debbie-millman-how-to-invite-creativity-into-your-life', 'speaker': 'Rose B. Simpson, Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1065, 'duration_minutes': 18, 'published_at': '2026-04-29', 'recorded_on': '2025-11-10', 'views': 170066, 'topics': ['culture', 'nature', 'creativity', 'art', 'storytelling', 'mindfulness'], 'image': 'images/talk_008_rose-b-simpson-debbie-millman-how-to-invite-crea.jpg', 'canonical_url': 'https://www.ted.com/talks/rose_b_simpson_debbie_millman_how_to_invite_creativity_into_your_life', 'description': 'What do you hear when you sit in silence? For artist Rose B. Simpson, that question is the beginning of all art. She comes from a line of ceramic artists stretching back generations and, as part of her multidisciplinary work, she also builds custom lowrider cars. (If that sounds like a contradiction, that\'s kind of the point.) In conversation with "Design Matters" podcast host Debbie Millman, Simpson invites you to find your own aesthetic - not by searching, but by listening.', 'transcript': 'Rose B. Simpson, Debbie Millman opens by framing the central tension behind How to invite creativity into your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175453', 'title': 'You got what you wanted. Now what?', 'slug': 'debbie-millman-you-got-what-you-wanted-now-what', 'speaker': 'Debbie Millman', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 473, 'duration_minutes': 8, 'published_at': '2026-04-27', 'recorded_on': '2025-11-09', 'views': 190209, 'topics': ['design', 'creativity', 'personal growth'], 'image': 'images/talk_009_debbie-millman-you-got-what-you-wanted-now-what.jpg', 'canonical_url': 'https://www.ted.com/talks/debbie_millman_you_got_what_you_wanted_now_what', 'description': 'Over two decades of interviewing countless creative people, Debbie Millman (host of the iconic "Design Matters" podcast) had a realization: the pride and joy of accomplishing something often evaporates almost instantly. She explains how to stop chasing external validation for your achievements and instead live for the act of creation itself.', 'transcript': 'Debbie Millman opens by framing the central tension behind You got what you wanted. Now what?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177490', 'title': 'What Kosovo can teach the world about freedom', 'slug': 'vjosa-osmani-sadriu-what-kosovo-can-teach-the-world-about-freedom', 'speaker': 'Vjosa Osmani Sadriu', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1047, 'duration_minutes': 17, 'published_at': '2026-04-24', 'recorded_on': '2026-04-14', 'views': 176972, 'topics': ['politics', 'social change', 'leadership', 'democracy', 'government'], 'image': 'images/talk_010_vjosa-osmani-sadriu-what-kosovo-can-teach-the-wo.jpg', 'canonical_url': 'https://www.ted.com/talks/vjosa_osmani_sadriu_what_kosovo_can_teach_the_world_about_freedom', 'description': '"Truth is the real oxygen for democracy," says Vjosa Osmani Sadriu, the 6th President of the Republic of Kosovo. As a child of war, she once longed for someone to save her people. Now she\'s been in the rooms where decisions are made - and she\'s never forgotten what brought her there. In conversation with solutions journalist Angus Hervey, she reflects on what it takes to defend democracy in a world where truth itself is under threat. (Recorded on April 14, 2026)', 'transcript': 'Vjosa Osmani Sadriu opens by framing the central tension behind What Kosovo can teach the world about freedom. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '177489', 'title': 'Beware the power of prediction', 'slug': 'carissa-veliz-beware-the-power-of-prediction', 'speaker': 'Carissa Veliz', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 728, 'duration_minutes': 12, 'published_at': '2026-04-23', 'recorded_on': '2026-04-14', 'views': 267371, 'topics': ['technology', 'future', 'ai', 'ethics'], 'image': 'images/talk_011_carissa-veliz-beware-the-power-of-prediction.jpg', 'canonical_url': 'https://www.ted.com/talks/carissa_veliz_beware_the_power_of_prediction', 'description': "What do the story of Oedipus and your insurance premiums have in common? They are both driven by self-fulfilling prophecies. Philosopher and TED Fellow Carissa Veliz traces the hidden power of prediction, from Roman emperors who banned prophets to the AI algorithms quietly making decisions about your life right now. We tend to associate predictions with knowledge, she says, but they're actually attempts to grab power. So the next time someone tells you a specific outcome is inevitable, remember: they aren't describing the future - they're selling it.", 'transcript': 'Carissa Veliz opens by framing the central tension behind Beware the power of prediction. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '177096', 'title': 'The problem with billionaires - and the debut of True Net Worth', 'slug': 'randall-lane-the-problem-with-billionaires-and-the-debut-of-true-net-worth', 'speaker': 'Randall Lane', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 499, 'duration_minutes': 8, 'published_at': '2026-04-20', 'recorded_on': '2026-04-16', 'views': 221434, 'topics': ['culture', 'economics', 'philanthropy', 'society', 'money', 'finance'], 'image': 'images/talk_012_randall-lane-the-problem-with-billionaires-and-t.jpg', 'canonical_url': 'https://www.ted.com/talks/randall_lane_the_problem_with_billionaires_and_the_debut_of_true_net_worth', 'description': "As chief content officer of Forbes, Randall Lane oversees the magazine's signature list of billionaires, tracking the richest people on Earth. But he has noticed that this prompts the ultra-wealthy to stockpile their money instead of spending it on the public good. He debuts a new ranking - True Net Worth - that applauds billionaires for their philanthropy and rewards generosity. Guess who's in the top five?", 'transcript': 'Randall Lane opens by framing the central tension behind The problem with billionaires - and the debut of True Net Worth. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175050', 'title': 'A cheat sheet for accelerating clean energy', 'slug': 'kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy', 'speaker': 'Kimiko Hirata', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 586, 'duration_minutes': 10, 'published_at': '2026-04-20', 'recorded_on': '2025-06-18', 'views': 191819, 'topics': ['climate change', 'policy', 'countdown', 'renewable energy', 'fossil fuels'], 'image': 'images/talk_013_kimiko-hirata-a-cheat-sheet-for-accelerating-cle.jpg', 'canonical_url': 'https://www.ted.com/talks/kimiko_hirata_a_cheat_sheet_for_accelerating_clean_energy', 'description': 'After the Fukushima disaster shut down Japan\'s nuclear reactors, the coal industry rushed in to fill the energy gap. As climate advocate Kimiko Hirata watched dozens of new coal plant proposals quietly surface across the country - each one locking in decades of future emissions - she resolved to make them impossible to ignore. She shares how a small, scrappy civil society movement took on a fossil-fuel-dependent economy and got people to say "yes" to a renewable future.', 'transcript': 'Kimiko Hirata opens by framing the central tension behind A cheat sheet for accelerating clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '176964', 'title': 'How I created OpenClaw, the breakthrough AI agent', 'slug': 'peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent', 'speaker': 'Peter Steinberger', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1055, 'duration_minutes': 18, 'published_at': '2026-04-17', 'recorded_on': '2026-04-16', 'views': 551544, 'topics': ['technology', 'computers', 'ai', 'internet', 'machine learning', 'artificial intelligence'], 'image': 'images/talk_014_peter-steinberger-how-i-created-openclaw-the-bre.jpg', 'canonical_url': 'https://www.ted.com/talks/peter_steinberger_how_i_created_openclaw_the_breakthrough_ai_agent', 'description': 'OpenClaw creator Peter Steinberger takes us back to the transformative moment he let his AI agent loose on the internet, igniting one of the world\'s fastest-growing open-source projects. He makes a fascinating (and slightly unnerving) case that agents are a real shift, not just better versions of chatbots, and explores how they might reshape your ability to work, build and create. "The lobster is loose, and it\'s not going back into the tank," he says. (Followed by a brief Q&A with TED Chairman Chris Anderson)', 'transcript': 'Peter Steinberger opens by framing the central tension behind How I created OpenClaw, the breakthrough AI agent. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176887', 'title': 'A plan to stop AI from automating our decline', 'slug': 'gina-raimondo-a-plan-to-stop-ai-from-automating-our-decline', 'speaker': 'Gina Raimondo', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 951, 'duration_minutes': 16, 'published_at': '2026-04-16', 'recorded_on': '2026-04-14', 'views': 229795, 'topics': ['politics', 'technology', 'business', 'social change', 'work', 'ai'], 'image': 'images/talk_015_gina-raimondo-a-plan-to-stop-ai-from-automating-.jpg', 'canonical_url': 'https://www.ted.com/talks/gina_raimondo_a_plan_to_stop_ai_from_automating_our_decline', 'description': 'The United States is on track to win the AI race - and hollow itself out in the process, says Gina Raimondo, former Governor of Rhode Island and US Secretary of Commerce. In this unflinching look at the threat of AI-induced economic disruption and social unrest, she offers a concrete blueprint to prepare workers for what\'s coming next. "AI is a 100-year technology and needs a 100-year response," she says. Is America up to the challenge?', 'transcript': 'Gina Raimondo opens by framing the central tension behind A plan to stop AI from automating our decline. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175041', 'title': 'East African sound meets cosmic trap', 'slug': 'akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap', 'speaker': 'Akoth Jumadi and Mr. Lu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 483, 'duration_minutes': 8, 'published_at': '2026-04-15', 'recorded_on': '2025-06-18', 'views': 2781, 'topics': ['music', 'performance', 'africa', 'art', 'sound'], 'image': 'images/talk_016_akoth-jumadi-and-mr-lu-east-african-sound-meets-.jpg', 'canonical_url': 'https://www.ted.com/talks/akoth_jumadi_and_mr_lu_east_african_sound_meets_cosmic_trap', 'description': 'Kenyan music duo Akoth Jumadi and MR. LU* fuse tribal roots with cosmic trap and celestial R&B, creating a hypnotic sound where ancient rhythms meet the future.', 'transcript': 'Akoth Jumadi and Mr. Lu opens by framing the central tension behind East African sound meets cosmic trap. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '176566', 'title': 'What I got wrong about changing the world', 'slug': 'malala-yousafzai-what-i-got-wrong-about-changing-the-world', 'speaker': 'Malala Yousafzai', 'event': 'TED2026', 'talk_type': 'TED Stage Talk', 'duration_seconds': 703, 'duration_minutes': 12, 'published_at': '2026-04-14', 'recorded_on': '2026-04-14', 'views': 349363, 'topics': ['education', 'social change', 'activism', 'middle east', 'human rights'], 'image': 'images/talk_017_malala-yousafzai-what-i-got-wrong-about-changing.jpg', 'canonical_url': 'https://www.ted.com/talks/malala_yousafzai_what_i_got_wrong_about_changing_the_world', 'description': "Malala Yousafzai has spent her life advocating for girls' education - surviving an assassination attempt at 15, meeting with world leaders and then watching hard-won progress collapse when Afghanistan fell to the Taliban in 2021. That moment of despair forced her to completely rethink what it means to create change, and what she discovered replaced her shattered optimism with something more powerful and more honest. Hear how to keep fighting for the future you want, even when hope feels lost.", 'transcript': 'Malala Yousafzai opens by framing the central tension behind What I got wrong about changing the world. The talk then connects evidence, lived experience, and examples from TED2026. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174201', 'title': 'Amman, Jordan', 'slug': 'ted-idea-search-amman-jordan', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2610, 'duration_minutes': 44, 'published_at': '2026-04-09', 'recorded_on': '2026-04-09', 'views': 23418, 'topics': ['social change'], 'image': 'images/talk_018_ted-idea-search-amman-jordan.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_amman_jordan', 'description': "The TED Idea Search wraps up in Amman, Jordan, in a 2,000-year-old Roman amphitheater and in front of a crowd of 4,000. What unfolds inside those stone walls is something the series hasn't quite seen before: speakers shaped by the weight of living in a region the world tends to define for itself. From a mountaineer who turned grief into motivation to a therapist rewriting the Arab world's language around mental health, the final city makes the strongest case yet that the best ideas can come from anywhere.", 'transcript': 'TED Idea Search opens by framing the central tension behind Amman, Jordan. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175828', 'title': 'A musical journey through Turkana', 'slug': 'turkana-sessions-a-musical-journey-through-turkana', 'speaker': 'Turkana Sessions', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 401, 'duration_minutes': 7, 'published_at': '2026-04-09', 'recorded_on': '2025-06-16', 'views': 4223, 'topics': ['music', 'performance', 'africa'], 'image': 'images/talk_019_turkana-sessions-a-musical-journey-through-turka.jpg', 'canonical_url': 'https://www.ted.com/talks/turkana_sessions_a_musical_journey_through_turkana', 'description': 'The genre-defying band Turkana Sessions takes us on a musical tour through the soundscape of northwest Kenya, with Elizabeth Korkel singing and Eddie Grey shredding on guitar.', 'transcript': 'Turkana Sessions opens by framing the central tension behind A musical journey through Turkana. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175296', 'title': "A whale's-eye-view of the ocean", 'slug': 'eric-stackpole-a-whale-s-eye-view-of-the-ocean', 'speaker': 'Eric Stackpole', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 311, 'duration_minutes': 5, 'published_at': '2026-04-08', 'recorded_on': '2025-11-11', 'views': 193174, 'topics': ['science', 'technology', 'animals', 'exploration', 'ocean'], 'image': 'images/talk_020_eric-stackpole-a-whale-s-eye-view-of-the-ocean.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_stackpole_a_whale_s_eye_view_of_the_ocean', 'description': "A hand-built camera with suction cups captured something no one had ever seen: two sperm whales communicating and swimming together in the deep ocean. Engineer Eric Stackpole shares the story of how a scrappy, DIY tool revealed this intimate glimpse into the lives of these giants - and makes the case that the only limit to what we can discover is what we're curious enough to explore.", 'transcript': "Eric Stackpole opens by framing the central tension behind A whale's-eye-view of the ocean. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175934', 'title': 'The art and science of wine tasting', 'slug': 'qian-janice-wang-the-art-and-science-of-wine-tasting', 'speaker': 'Qian Janice Wang', 'event': 'TEDxNoVA', 'talk_type': 'TEDx Talk', 'duration_seconds': 919, 'duration_minutes': 15, 'published_at': '2026-04-07', 'recorded_on': '2025-10-10', 'views': 181481, 'topics': ['science', 'food', 'brain'], 'image': 'images/talk_021_qian-janice-wang-the-art-and-science-of-wine-tas.jpg', 'canonical_url': 'https://www.ted.com/talks/qian_janice_wang_the_art_and_science_of_wine_tasting', 'description': "No two people approach wine tasting the same way, and science is starting to show us why. Sensory scientist Qian Janice Wang explores why experts and beginners experience complexity so differently - revealing that what makes a wine great may have less to do with what's in the glass and more to do with what's happening in your brain.", 'transcript': 'Qian Janice Wang opens by framing the central tension behind The art and science of wine tasting. The talk then connects evidence, lived experience, and examples from TEDxNoVA. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '171659', 'title': 'The accidental brilliance of makeshift signs', 'slug': 'kate-canales-the-accidental-brilliance-of-makeshift-signs', 'speaker': 'Kate Canales', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 466, 'duration_minutes': 8, 'published_at': '2026-04-06', 'recorded_on': '2025-11-11', 'views': 203431, 'topics': ['culture', 'technology', 'design', 'creativity', 'art', 'humor', 'society'], 'image': 'images/talk_022_kate-canales-the-accidental-brilliance-of-makesh.jpg', 'canonical_url': 'https://www.ted.com/talks/kate_canales_the_accidental_brilliance_of_makeshift_signs', 'description': "What happens when the design of everyday things misses the mark? People fill in the blanks. Designer Kate Canales has spent more than 20 years photographing the handmade, improvised signs that appear when the original falls short. From perplexing bathroom directions to our struggles with doors and point-of-sale machines, her photos capture something technology can't replace: our instinct to look out for each other and leave a few instructions behind. She also compares handmade fixes with architecture renderings and 3D printing prototypes, making it a design-adjacent near miss rather than a home-building case study.", 'transcript': 'Kate Canales opens by framing the central tension behind The accidental brilliance of makeshift signs. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175830', 'title': "The nurse who can smell Parkinson's", 'slug': 'joy-milne-the-nurse-who-can-smell-parkinson-s', 'speaker': 'Joy Milne', 'event': 'TEDxManchester', 'talk_type': 'TEDx Talk', 'duration_seconds': 1077, 'duration_minutes': 18, 'published_at': '2026-04-03', 'recorded_on': '2023-03-04', 'views': 203929, 'topics': ['science', 'innovation', 'disease', 'health', 'health care', 'biology', 'medicine'], 'image': 'images/talk_023_joy-milne-the-nurse-who-can-smell-parkinson-s.jpg', 'canonical_url': 'https://www.ted.com/talks/joy_milne_the_nurse_who_can_smell_parkinson_s', 'description': "What does Parkinson's smell like? Ask nurse Joy Milne. Born with a hypersensitive nose, she spent a lifetime learning to recognize diseases through their scents. When she smelled Parkinson's on her husband years before his diagnosis, she decided to put her gift to the test. Today, her extraordinary nose has been translated into a non-invasive test - helping researchers diagnose what was right under their noses all along. Her story also explains why careful scent training, familiar from wine tasting, can sharpen medical observation.", 'transcript': "Joy Milne opens by framing the central tension behind The nurse who can smell Parkinson's. The talk then connects evidence, lived experience, and examples from TEDxManchester. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174199', 'title': 'Buenos Aires, Argentina', 'slug': 'ted-idea-search-buenos-aires-argentina', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2561, 'duration_minutes': 43, 'published_at': '2026-04-02', 'recorded_on': '2026-04-02', 'views': 31212, 'topics': ['social change'], 'image': 'images/talk_024_ted-idea-search-buenos-aires-argentina.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_buenos_aires_argentina', 'description': 'The TED Idea Search arrives in Buenos Aires, a city with a fierce intellectual tradition, as 10 speakers deliver talks in a stunning warehouse that\'s home to the city\'s iconic opera sets, competing for a chance to speak on the TED main stage. Watch as a Gen Z voice reframes "brain rot" as a secret diplomatic tool and a surgeon explores the future of robotic medicine, reminding us why the human touch still matters - and much more. Choosing just one to represent Buenos Aires to the world turns out to be one of the hardest decisions yet.', 'transcript': 'TED Idea Search opens by framing the central tension behind Buenos Aires, Argentina. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175297', 'title': "I let DaddyGPT parent my kids. Here's what I learned", 'slug': 'stephen-remedios-i-let-daddygpt-parent-my-kids-here-s-what-i-learned', 'speaker': 'Stephen Remedios', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-04-02', 'recorded_on': '2025-10-23', 'views': 201276, 'topics': ['technology', 'parenting', 'ai', 'kids'], 'image': 'images/talk_025_stephen-remedios-i-let-daddygpt-parent-my-kids-h.jpg', 'canonical_url': 'https://www.ted.com/talks/stephen_remedios_i_let_daddygpt_parent_my_kids_here_s_what_i_learned', 'description': "As the world races toward digital perfection, tech humanist Stephen Remedios tried to optimize the messiest and most imperfect of all human work: parenting. He shares the story of DaddyGPT, a digital version of himself built to help raise his kids - until they began to prefer it over him. What unfolds is a personal look at the limits of AI, and a reminder that what matters most isn't getting it right every time but showing up with the authentic imperfection only humans have.", 'transcript': "Stephen Remedios opens by framing the central tension behind I let DaddyGPT parent my kids. Here's what I learned. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175452', 'title': 'A brilliant blend of ballet, hip-hop and African dance', 'slug': 'ghetto-classics-dance-a-brilliant-blend-of-ballet-hip-hop-and-african-dance', 'speaker': 'Ghetto Classics Dance', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 434, 'duration_minutes': 7, 'published_at': '2026-04-01', 'recorded_on': '2025-06-17', 'views': 3772, 'topics': ['performance', 'africa', 'art', 'dance', 'countdown'], 'image': 'images/talk_026_ghetto-classics-dance-a-brilliant-blend-of-balle.jpg', 'canonical_url': 'https://www.ted.com/talks/ghetto_classics_dance_a_brilliant_blend_of_ballet_hip_hop_and_african_dance', 'description': "Watch the performers of Ghetto Classics Dance light up the stage with a breathtaking fusion of traditional African dance, classical ballet and modern hip-hop. Founded in Korogocho, one of Nairobi's most under-resourced neighborhoods, this community-driven program empowers dancers through intensive training and mentorship.", 'transcript': 'Ghetto Classics Dance opens by framing the central tension behind A brilliant blend of ballet, hip-hop and African dance. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '175374', 'title': '5 practical ways to take control of your life', 'slug': 'jim-vandehei-5-practical-ways-to-take-control-of-your-life', 'speaker': 'Jim VandeHei', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 654, 'duration_minutes': 11, 'published_at': '2026-03-31', 'recorded_on': '2025-11-11', 'views': 243174, 'topics': ['leadership', 'success', 'motivation', 'personal growth', 'goals'], 'image': 'images/talk_027_jim-vandehei-5-practical-ways-to-take-control-of.jpg', 'canonical_url': 'https://www.ted.com/talks/jim_vandehei_5_practical_ways_to_take_control_of_your_life', 'description': 'You can\'t control the world - but you can control you. That\'s the mantra that took Axios CEO Jim VandeHei, a once "unremarkably unremarkable 20-year-old," all the way to launching companies and interviewing presidents. He breaks down a career\'s worth of observations into five deceptively simple things you can control, and explores why mastering them can change the trajectory of your life.', 'transcript': 'Jim VandeHei opens by framing the central tension behind 5 practical ways to take control of your life. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175298', 'title': 'Stress resets, the ultimate mental health hack', 'slug': 'jenny-taitz-stress-resets-the-ultimate-mental-health-hack', 'speaker': 'Jenny Taitz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 630, 'duration_minutes': 10, 'published_at': '2026-03-30', 'recorded_on': '2025-11-10', 'views': 263345, 'topics': ['science', 'psychology', 'relationships', 'personal growth', 'mental health', 'emotions'], 'image': 'images/talk_028_jenny-taitz-stress-resets-the-ultimate-mental-he.jpg', 'canonical_url': 'https://www.ted.com/talks/jenny_taitz_stress_resets_the_ultimate_mental_health_hack', 'description': 'Stress is contagious - but so is calm. Psychologist Jenny Taitz explains why one stressful moment tends to snowball into the next, and shares small, immediate resets you can practice anywhere to break the spiral before it starts.', 'transcript': 'Jenny Taitz opens by framing the central tension behind Stress resets, the ultimate mental health hack. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174198', 'title': 'Chicago, USA', 'slug': 'ted-idea-search-chicago-usa', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2769, 'duration_minutes': 46, 'published_at': '2026-03-27', 'recorded_on': '2026-03-27', 'views': 28577, 'topics': ['social change'], 'image': 'images/talk_029_ted-idea-search-chicago-usa.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_chicago_usa', 'description': 'In the Windy City, 10 Chicagoans step onto the iconic red circle, each with six minutes to prove they have an idea that could change everything. Among them: a chemist who believes we can deploy precision medicine to save endangered species, a journalist creating tools to navigate difficult conversations and a runner challenging the narrative of a divided city by exploring every one of its streets. The stakes are personal, the competition is fierce - and one speaker will earn the chance to take their idea to the main stage at TED in Vancouver.', 'transcript': 'TED Idea Search opens by framing the central tension behind Chicago, USA. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '175334', 'title': 'Why the world is still not built for women', 'slug': 'virginia-santy-why-the-world-is-still-not-built-for-women', 'speaker': 'Virginia Santy', 'event': 'TEDxMileHigh', 'talk_type': 'TEDx Talk', 'duration_seconds': 804, 'duration_minutes': 13, 'published_at': '2026-03-26', 'recorded_on': '2022-11-12', 'views': 214046, 'topics': ['design', 'cities', 'urban planning', 'social change', 'women', 'tedx', 'feminism'], 'image': 'images/talk_030_virginia-santy-why-the-world-is-still-not-built-.jpg', 'canonical_url': 'https://www.ted.com/talks/virginia_santy_why_the_world_is_still_not_built_for_women', 'description': 'Design consultant Virginia Santy set out to create an office space built specifically for women, flipping the script on the subtle (and not-so-subtle) ways that workplaces and cities still fail them. The results were striking: greater productivity, deeper collaboration and an environment where women felt genuinely valued, leading her to ask a simple question: What would the world look like if we designed with women in mind?', 'transcript': 'Virginia Santy opens by framing the central tension behind Why the world is still not built for women. The talk then connects evidence, lived experience, and examples from TEDxMileHigh. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174197', 'title': 'Singapore', 'slug': 'ted-idea-search-singapore', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 0, 'duration_minutes': 1, 'published_at': '2026-03-25', 'recorded_on': '2026-03-25', 'views': 23267, 'topics': ['social change'], 'image': 'images/talk_031_ted-idea-search-singapore.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_singapore', 'description': "The TED Idea Search touches down in Singapore, where eight speakers compete for an extraordinary prize. From a diver-turned-ocean-restorer reviving dead coral reefs to a scientist growing sustainable building materials out of fungus and a government insider reimagining public institutions, the ideas are as diverse as the Lion City itself. As TED's coaches push each speaker to transform their thinking into a powerful narrative, nerves rise, breakthroughs emerge and one speaker earns the opportunity to share their idea on the global stage.", 'transcript': 'TED Idea Search opens by framing the central tension behind Singapore. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174672', 'title': 'My bank called in the middle of my TED Talk', 'slug': 'mike-albo-my-bank-called-in-the-middle-of-my-ted-talk', 'speaker': 'Mike Albo', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 344, 'duration_minutes': 6, 'published_at': '2026-03-25', 'recorded_on': '2025-11-10', 'views': 197679, 'topics': ['culture', 'technology', 'entertainment', 'consumerism', 'comedy', 'data'], 'image': 'images/talk_032_mike-albo-my-bank-called-in-the-middle-of-my-ted.jpg', 'canonical_url': 'https://www.ted.com/talks/mike_albo_my_bank_called_in_the_middle_of_my_ted_talk', 'description': 'In this TED Talk gone wrong, comedian Mike Albo receives an unexpected call from his bank. The result: a hilariously uncomfortable tour of his purchase history, and a reminder that in the digital age, our data knows us a little too well.', 'transcript': 'Mike Albo opens by framing the central tension behind My bank called in the middle of my TED Talk. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174466', 'title': '3 ways to create a truly original design', 'slug': 'lope-gutierrez-ruiz-3-ways-to-create-a-truly-original-design', 'speaker': 'Lope Gutierrez-Ruiz', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 355, 'duration_minutes': 6, 'published_at': '2026-03-24', 'recorded_on': '2025-11-10', 'views': 217982, 'topics': ['culture', 'design', 'media', 'collaboration', 'creativity', 'art', 'ted fellows', 'animation'], 'image': 'images/talk_033_lope-gutierrez-ruiz-3-ways-to-create-a-truly-ori.jpg', 'canonical_url': 'https://www.ted.com/talks/lope_gutierrez_ruiz_3_ways_to_create_a_truly_original_design', 'description': "In a world where design trends are quietly converging - same color palettes, same typography, same illustration styles - how do you make work that actually looks different? Designer and TED Fellow Lope Gutierrez-Ruiz distills his answer into three sharp, counterintuitive ideas, ticking through his studio's own funky creations to show how you can make things that stand out.", 'transcript': 'Lope Gutierrez-Ruiz opens by framing the central tension behind 3 ways to create a truly original design. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174464', 'title': '3 things I wish I knew when I was broke', 'slug': 'vivian-tu-3-things-i-wish-i-knew-when-i-was-broke', 'speaker': 'Vivian Tu', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 560, 'duration_minutes': 9, 'published_at': '2026-03-23', 'recorded_on': '2025-11-10', 'views': 300368, 'topics': ['business', 'personal growth', 'women in business', 'money', 'finance'], 'image': 'images/talk_034_vivian-tu-3-things-i-wish-i-knew-when-i-was-brok.jpg', 'canonical_url': 'https://www.ted.com/talks/vivian_tu_3_things_i_wish_i_knew_when_i_was_broke', 'description': "Finance doesn't have to feel like a foreign language. Wall Street trader-turned-financial educator Vivian Tu helps millions of people make sense of money, breaking down complex concepts into everyday terms you can understand. She shares how she broke free from the stress of living paycheck to paycheck - and explores how we can shift power structures to give everyone a real shot at building wealth.", 'transcript': 'Vivian Tu opens by framing the central tension behind 3 things I wish I knew when I was broke. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174728', 'title': 'Joy will find you - if you let it', 'slug': 'david-larbi-joy-will-find-you-if-you-let-it', 'speaker': 'David Larbi', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 305, 'duration_minutes': 5, 'published_at': '2026-03-20', 'recorded_on': '2025-11-10', 'views': 243270, 'topics': ['performance', 'creativity', 'poetry', 'happiness', 'personal growth'], 'image': 'images/talk_035_david-larbi-joy-will-find-you-if-you-let-it.jpg', 'canonical_url': 'https://www.ted.com/talks/david_larbi_joy_will_find_you_if_you_let_it', 'description': 'Author David Larbi recites a poem about the journey toward joy, reminding us of all the ways it can be found: having a conversation with a stranger, tasting the perfect bite of food or enjoying a good stretch. Joy is all around us - you just need to know where to look.', 'transcript': 'David Larbi opens by framing the central tension behind Joy will find you - if you let it. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174196', 'title': 'London, UK', 'slug': 'ted-idea-search-london-uk', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2786, 'duration_minutes': 46, 'published_at': '2026-03-19', 'recorded_on': '2026-03-19', 'views': 38468, 'topics': ['social change'], 'image': 'images/talk_036_ted-idea-search-london-uk.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_london_uk', 'description': "In London, the TED Idea Search brings together 10 voices from one of the world's most influential cultural capitals to compete for the opportunity to speak on the main stage at TED. From a civil engineer revealing the invisible infrastructure shaping our cities to a classical singer uncovering the erased history of women in music, the ideas on offer are both deeply personal and global in scope. When the lights come up, London doesn't hold back - and one speaker delivers a talk no one in that room will soon forget.", 'transcript': 'TED Idea Search opens by framing the central tension behind London, UK. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173046', 'title': 'How to tune your inner voice', 'slug': 'rhonda-ross-daniel-alexander-jones-how-to-tune-your-inner-voice', 'speaker': 'Rhonda Ross, Daniel Alexander Jones', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1196, 'duration_minutes': 20, 'published_at': '2026-03-19', 'recorded_on': '2025-11-09', 'views': 226951, 'topics': ['culture', 'music', 'creativity', 'art', 'relationships', 'personal growth', 'society', 'ted fellows', 'emotions'], 'image': 'images/talk_037_rhonda-ross-daniel-alexander-jones-how-to-tune-y.jpg', 'canonical_url': 'https://www.ted.com/talks/rhonda_ross_daniel_alexander_jones_how_to_tune_your_inner_voice', 'description': 'To calm the storm inside your mind, you must first understand it. Singer and actress Rhonda Ross shares her theory of "emotional sovereignty" - the idea that your feelings aren\'t shaped just by your circumstances, but by the thoughts running on loop in your head. In conversation with scholar and TED Fellow Daniel Alexander Jones, Ross introduces the unexpected, music-rooted practice for taking control of your narrative.', 'transcript': 'Rhonda Ross, Daniel Alexander Jones opens by framing the central tension behind How to tune your inner voice. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174671', 'title': 'The 6 eras of NBA fashion - from restrained to radical', 'slug': 'mitchell-s-jackson-the-6-eras-of-nba-fashion-from-restrained-to-radical', 'speaker': 'Mitchell S. Jackson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 564, 'duration_minutes': 9, 'published_at': '2026-03-19', 'recorded_on': '2025-11-11', 'views': 183882, 'topics': ['culture', 'history', 'sports', 'fashion', 'ted fellows', 'protest'], 'image': 'images/talk_038_mitchell-s-jackson-the-6-eras-of-nba-fashion-fro.jpg', 'canonical_url': 'https://www.ted.com/talks/mitchell_s_jackson_the_6_eras_of_nba_fashion_from_restrained_to_radical', 'description': 'What are you wearing, and why? This is the question that writer and TED Fellow Mitchell S. Jackson asks as he unpacks the six eras of NBA style. Tracing an arc from Bill Russell to Lebron James and beyond, he explores how players use fashion on and off the court to challenge the limits placed upon them - revealing a deeper story about culture, identity and power.', 'transcript': 'Mitchell S. Jackson opens by framing the central tension behind The 6 eras of NBA fashion - from restrained to radical. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174584', 'title': 'I taught rats to drive. They taught me to enjoy the ride', 'slug': 'kelly-lambert-i-taught-rats-to-drive-they-taught-me-to-enjoy-the-ride', 'speaker': 'Kelly Lambert', 'event': 'TEDxRVA Youth', 'talk_type': 'TEDx Talk', 'duration_seconds': 840, 'duration_minutes': 14, 'published_at': '2026-03-18', 'recorded_on': '2025-11-09', 'views': 217160, 'topics': ['science', 'animals', 'happiness', 'brain', 'neuroscience', 'tedx', 'emotions'], 'image': 'images/talk_039_kelly-lambert-i-taught-rats-to-drive-they-taught.jpg', 'canonical_url': 'https://www.ted.com/talks/kelly_lambert_i_taught_rats_to_drive_they_taught_me_to_enjoy_the_ride', 'description': 'What can happy rats teach us about human joy? Behavioral neuroscientist Kelly Lambert describes how her team trained rats to drive tiny cars to earn treats - and noticed something surprising about how effort and anticipation affect the brain. The experiment opens new questions about how reward, agency and "behaviorceuticals" might help build resilience and support mental health.', 'transcript': 'Kelly Lambert opens by framing the central tension behind I taught rats to drive. They taught me to enjoy the ride. The talk then connects evidence, lived experience, and examples from TEDxRVA Youth. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174670', 'title': 'Is luck random - or can you cultivate it?', 'slug': 'christian-busch-is-luck-random-or-can-you-cultivate-it', 'speaker': 'Christian Busch', 'event': 'TED@BCG', 'talk_type': 'TED Institute Talk', 'duration_seconds': 768, 'duration_minutes': 13, 'published_at': '2026-03-17', 'recorded_on': '2025-10-23', 'views': 833338, 'topics': ['science', 'future', 'personal growth', 'decision-making'], 'image': 'images/talk_040_christian-busch-is-luck-random-or-can-you-cultiv.jpg', 'canonical_url': 'https://www.ted.com/talks/christian_busch_is_luck_random_or_can_you_cultivate_it', 'description': 'When the 2025 Los Angeles wildfires destroyed his home and neighborhood, scientist Christian Busch encountered the opposite of serendipity: "zemblanity," or bad luck by design. Drawing on more than a decade of scientific research, he explores how people can navigate unpredictability by adopting a serendipity mindset that transforms setbacks into unexpected new beginnings. He asks: What if good luck isn\'t random but can actually be cultivated?', 'transcript': 'Christian Busch opens by framing the central tension behind Is luck random - or can you cultivate it?. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174283', 'title': 'How to make transportation quieter, cleaner and cheaper', 'slug': 'doreen-orishaba-how-to-make-transportation-quieter-cleaner-and-cheaper', 'speaker': 'Doreen Orishaba', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 671, 'duration_minutes': 11, 'published_at': '2026-03-16', 'recorded_on': '2025-06-18', 'views': 214856, 'topics': ['climate change', 'transportation', 'africa', 'countdown'], 'image': 'images/talk_041_doreen-orishaba-how-to-make-transportation-quiet.jpg', 'canonical_url': 'https://www.ted.com/talks/doreen_orishaba_how_to_make_transportation_quieter_cleaner_and_cheaper', 'description': 'When Doreen Orishaba helped build Africa\'s first electric car in 2011, skeptics dismissed it as a "toy for the Western world." Now she\'s running dozens of electric buses across Kenya and Rwanda, moving thousands of passengers to work every day on zero-exhaust vehicles powered by near-silent engines. She breaks down what it actually takes to scale clean transport - and why skipping the gas station pit stop is closer than you may think.', 'transcript': 'Doreen Orishaba opens by framing the central tension behind How to make transportation quieter, cleaner and cheaper. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '174282', 'title': 'What China can teach the world about scaling clean energy', 'slug': 'yin-yu-what-china-can-teach-the-world-about-scaling-clean-energy', 'speaker': 'Yin Yu', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 545, 'duration_minutes': 9, 'published_at': '2026-03-13', 'recorded_on': '2025-06-18', 'views': 8098, 'topics': ['climate change', 'sustainability', 'energy', 'china', 'solar energy', 'countdown', 'renewable energy'], 'image': 'images/talk_042_yin-yu-what-china-can-teach-the-world-about-scal.jpg', 'canonical_url': 'https://www.ted.com/talks/yin_yu_what_china_can_teach_the_world_about_scaling_clean_energy', 'description': 'When Yin Yu first visited a major hydropower dam site in China, she expected to see a thriving community. Instead, she found families who\'d lost their land and livelihoods to the rising water. It was a powerful lesson in how "green" megaprojects can harm the people they\'re meant to help. Now, as solar and electric vehicles spread rapidly across Southeast Asia, Yin says the opportunity is enormous - but only if countries don\'t repeat the mistakes of the past.', 'transcript': 'Yin Yu opens by framing the central tension behind What China can teach the world about scaling clean energy. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174195', 'title': 'Lagos, Nigeria', 'slug': 'ted-idea-search-lagos-nigeria', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2792, 'duration_minutes': 47, 'published_at': '2026-03-12', 'recorded_on': '2026-03-12', 'views': 20035, 'topics': ['social change'], 'image': 'images/talk_043_ted-idea-search-lagos-nigeria.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_lagos_nigeria', 'description': "In the heart of Lagos - a megacity of 20 million people pulsing with energy and big ambitions - nine undiscovered voices compete for a chance to speak on the world's biggest stage for ideas. From a renewable energy advocate who studied by candlelight to an archivist reimagining Africa-centered education, these speakers bring stories with global stakes. But only one will earn the 7,000-mile journey to the TED stage in Vancouver.", 'transcript': 'TED Idea Search opens by framing the central tension behind Lagos, Nigeria. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '137525', 'title': '"May Your Kindness Remain" / "If I Told"', 'slug': 'courtney-marie-andrews-may-your-kindness-remain-if-i-told', 'speaker': 'Courtney Marie Andrews', 'event': 'TEDCountdown@BloombergGreenFestival', 'talk_type': 'TED Stage Talk', 'duration_seconds': 634, 'duration_minutes': 11, 'published_at': '2026-03-11', 'recorded_on': '2024-07-12', 'views': 8624, 'topics': ['environment', 'music', 'performance'], 'image': 'images/talk_044_courtney-marie-andrews-may-your-kindness-remain-.jpg', 'canonical_url': 'https://www.ted.com/talks/courtney_marie_andrews_may_your_kindness_remain_if_i_told', 'description': 'Singer-songwriter Courtney Marie Andrews performs "If I Told" and "May Your Kindness Remain," songs based on her connection to music, nature and environmental advocacy.', 'transcript': 'Courtney Marie Andrews opens by framing the central tension behind "May Your Kindness Remain" / "If I Told". The talk then connects evidence, lived experience, and examples from TEDCountdown@BloombergGreenFestival. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174194', 'title': 'Athens, Greece', 'slug': 'ted-idea-search-athens-greece', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2892, 'duration_minutes': 48, 'published_at': '2026-03-10', 'recorded_on': '2026-03-10', 'views': 38463, 'topics': ['social change'], 'image': 'images/talk_045_ted-idea-search-athens-greece.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_athens_greece', 'description': "The next stop on the TED Idea Search is Athens, birthplace of democracy and the world's oldest debating tradition. Nine speakers - from a fashion manufacturer taking on modern slavery to a microbiologist tackling the science of bad breath - go head-to-head for a shot to speak on the TED stage in Vancouver. Rehearsals are rocky, nerves are real and the stakes couldn't be higher - and only one speaker gets to move on and represent Athens to the world.", 'transcript': 'TED Idea Search opens by framing the central tension behind Athens, Greece. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173420', 'title': 'What would your "deathbed self" tell you today?', 'slug': 'lauren-deeley-what-would-your-deathbed-self-tell-you-today', 'speaker': 'Lauren Deeley', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 379, 'duration_minutes': 6, 'published_at': '2026-03-10', 'recorded_on': '2025-11-10', 'views': 252860, 'topics': ['future', 'work', 'personal growth', 'self', 'money', 'life'], 'image': 'images/talk_046_lauren-deeley-what-would-your-deathbed-self-tell.jpg', 'canonical_url': 'https://www.ted.com/talks/lauren_deeley_what_would_your_deathbed_self_tell_you_today', 'description': 'What if the key to making better decisions today is getting to know the person you\'ll become tomorrow? Drawing on psychological research and real-life stories, private wealth advisor Lauren Deeley explores how building a meaningful connection with your "deathbed self" can bring more clarity, joy and intention to the life you\'re building right now.', 'transcript': 'Lauren Deeley opens by framing the central tension behind What would your "deathbed self" tell you today?. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '174009', 'title': 'Mumbai, India', 'slug': 'ted-idea-search-mumbai-india', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2738, 'duration_minutes': 46, 'published_at': '2026-03-09', 'recorded_on': '2026-03-09', 'views': 22102, 'topics': ['social change'], 'image': 'images/talk_047_ted-idea-search-mumbai-india.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_mumbai_india', 'description': "In Mumbai, the TED Idea Search lands in India's bustling financial and creative capital, where 10 speakers are challenged to deliver the talk of their lives and compete for a one-of-a-kind opportunity: a spot on the TED stage in Vancouver. What emerges is a moving portrait of vulnerability and ambition, as ideas about vanishing tribal art, maternal health and India's forgotten fashion history look to shift perspectives on a global scale. Only one can make it through - who will it be?", 'transcript': 'TED Idea Search opens by framing the central tension behind Mumbai, India. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173439', 'title': 'Why you should keep a list of what makes you laugh', 'slug': 'chris-duffy-why-you-should-keep-a-list-of-what-makes-you-laugh', 'speaker': 'Chris Duffy', 'event': 'TED Talks Daily Book Club', 'talk_type': 'TED Stage Talk', 'duration_seconds': 3426, 'duration_minutes': 57, 'published_at': '2026-03-09', 'recorded_on': '2026-02-18', 'views': 229371, 'topics': ['culture', 'creativity', 'personal growth', 'comedy', 'humor'], 'image': 'images/talk_048_chris-duffy-why-you-should-keep-a-list-of-what-m.jpg', 'canonical_url': 'https://www.ted.com/talks/chris_duffy_why_you_should_keep_a_list_of_what_makes_you_laugh', 'description': 'The world is weird and hilarious - if you know where to look, says comedian Chris Duffy. In conversation with "TED Talks Daily" host Elise Hu, Duffy breaks down three practical pillars of humor, showing how laughter can help you feel present, creative and connected, even when the world feels overwhelming. (This conversation was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)', 'transcript': 'Chris Duffy opens by framing the central tension behind Why you should keep a list of what makes you laugh. The talk then connects evidence, lived experience, and examples from TED Talks Daily Book Club. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172133', 'title': 'Conservation: a love story', 'slug': 'elsaphan-njora-conservation-a-love-story', 'speaker': 'Elsaphan Njora', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 520, 'duration_minutes': 9, 'published_at': '2026-03-06', 'recorded_on': '2025-06-17', 'views': 208417, 'topics': ['climate change', 'nature', 'love', 'biodiversity', 'conservation', 'countdown'], 'image': 'images/talk_049_elsaphan-njora-conservation-a-love-story.jpg', 'canonical_url': 'https://www.ted.com/talks/elsaphan_njora_conservation_a_love_story', 'description': "What if the key to saving nature isn't just about science or policy, but love? Love for the land, for the people who depend on it, for the world we leave behind. Artist Elsaphan Njora has journeyed across Kenya witnessing ecosystems vanish, from Indigenous forests to sacred lakes. But he's also seen communities breathing life back into rivers, forests and coasts in creative, unexpected ways - showing that conservation can flourish alongside livelihoods, and that even the most threatened landscapes can be reborn.", 'transcript': 'Elsaphan Njora opens by framing the central tension behind Conservation: a love story. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173850', 'title': 'Sydney, Australia', 'slug': 'ted-idea-search-sydney-australia', 'speaker': 'TED Idea Search', 'event': 'TED Originals', 'talk_type': 'Original Content', 'duration_seconds': 2625, 'duration_minutes': 44, 'published_at': '2026-03-04', 'recorded_on': '2026-03-04', 'views': 46087, 'topics': ['society'], 'image': 'images/talk_050_ted-idea-search-sydney-australia.jpg', 'canonical_url': 'https://www.ted.com/talks/ted_idea_search_sydney_australia', 'description': "In the premiere of the TED Idea Search, we travel to Sydney, Australia, where 10 brilliant people take the stage for the shot of a lifetime: a chance to speak at the TED conference in Vancouver. From a wildlife scientist deploying AI to bust illegal trafficking networks to Australia's own human rights commissioner sounding the alarm on brain-reading technology, these speakers bring ideas that could genuinely shift how we live. But only one can win - and the choice comes down to a single, unforgettable talk that leaves the audience (and the judges) blown away.", 'transcript': 'TED Idea Search opens by framing the central tension behind Sydney, Australia. The talk then connects evidence, lived experience, and examples from TED Originals. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173043', 'title': '3 habits to practice curiosity - and escape your phone', 'slug': 'nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone', 'speaker': 'Nayeema Raza', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 312, 'duration_minutes': 5, 'published_at': '2026-03-04', 'recorded_on': '2025-11-11', 'views': 554563, 'topics': ['culture', 'technology', 'social change', 'society', 'curiosity'], 'image': 'images/talk_051_nayeema-raza-3-habits-to-practice-curiosity-and-.jpg', 'canonical_url': 'https://www.ted.com/talks/nayeema_raza_3_habits_to_practice_curiosity_and_escape_your_phone', 'description': "We're so entangled with our devices that online has started to feel more real than IRL, says journalist Nayeema Raza. As screens reshape how we connect and relate, she offers three practical habits to reignite curiosity, restore presence and break free from our phones.", 'transcript': 'Nayeema Raza opens by framing the central tension behind 3 habits to practice curiosity - and escape your phone. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173440', 'title': '4 relationship traps that lead to burnout', 'slug': 'eric-quintane-4-relationship-traps-that-lead-to-burnout', 'speaker': 'Eric Quintane', 'event': 'TEDxESMTBerlin', 'talk_type': 'TEDx Talk', 'duration_seconds': 991, 'duration_minutes': 17, 'published_at': '2026-03-04', 'recorded_on': '2025-02-01', 'views': 285438, 'topics': ['business', 'psychology', 'relationships', 'communication', 'work', 'personal growth', 'society', 'tedx'], 'image': 'images/talk_052_eric-quintane-4-relationship-traps-that-lead-to-.jpg', 'canonical_url': 'https://www.ted.com/talks/eric_quintane_4_relationship_traps_that_lead_to_burnout', 'description': 'Are your workplace relationships quietly burning you out? Drawing on large-scale research across industries, organizational behavior researcher Eric Quintane reveals four hidden relational traps woven into the fabric of work - and explores how connection shapes resilience, vulnerability and burnout.', 'transcript': 'Eric Quintane opens by framing the central tension behind 4 relationship traps that lead to burnout. The talk then connects evidence, lived experience, and examples from TEDxESMTBerlin. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173576', 'title': 'Love, intimacy and connection in the age of AI', 'slug': 'bryony-cole-love-intimacy-and-connection-in-the-age-of-ai', 'speaker': 'Bryony Cole', 'event': 'TED Membership', 'talk_type': 'TED Stage Talk', 'duration_seconds': 2631, 'duration_minutes': 44, 'published_at': '2026-03-03', 'recorded_on': '2026-02-05', 'views': 203689, 'topics': ['technology', 'love', 'relationships', 'ai', 'sex', 'ted membership'], 'image': 'images/talk_053_bryony-cole-love-intimacy-and-connection-in-the-.jpg', 'canonical_url': 'https://www.ted.com/talks/bryony_cole_love_intimacy_and_connection_in_the_age_of_ai', 'description': "Relationships were never meant to be efficient, says sextech expert Bryony Cole, and yet AI companions are increasingly designed to be exactly that. As intimate relationships between humans and AI become more common, Cole challenges us to think more deliberately about how we shape our connections to machines - and with each other. (This conversation, hosted by TED's Whitney Pennington Rodgers, was part of an exclusive TED Membership event. TED Membership is the best way to support and engage with the big ideas you love from TED. To learn more, visit ted.com/membership.)", 'transcript': 'Bryony Cole opens by framing the central tension behind Love, intimacy and connection in the age of AI. The talk then connects evidence, lived experience, and examples from TED Membership. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173044', 'title': 'The sneaky language tricks cults use to influence you', 'slug': 'amanda-montell-the-sneaky-language-tricks-cults-use-to-influence-you', 'speaker': 'Amanda Montell', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 354, 'duration_minutes': 6, 'published_at': '2026-03-02', 'recorded_on': '2025-11-11', 'views': 260199, 'topics': ['culture', 'media', 'relationships', 'communication', 'community', 'language', 'society'], 'image': 'images/talk_054_amanda-montell-the-sneaky-language-tricks-cults-.jpg', 'canonical_url': 'https://www.ted.com/talks/amanda_montell_the_sneaky_language_tricks_cults_use_to_influence_you', 'description': "In the age of social media and wellness trends, the comments section is as good as a cult compound, says linguist and cultural commentator Amanda Montell. Using Taylor Swift's throng of devoted Swifties as her guide, she exposes three sneaky language tactics that cults use to influence us (for better or for worse), revealing why none of us are as cult-proof as we'd like to think.", 'transcript': 'Amanda Montell opens by framing the central tension behind The sneaky language tricks cults use to influence you. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '173511', 'title': 'The attack on Iran - why now?', 'slug': 'ian-bremmer-the-attack-on-iran-why-now', 'speaker': 'Ian Bremmer', 'event': 'TED Explains the World with Ian Bremmer', 'talk_type': 'Original Content', 'duration_seconds': 2669, 'duration_minutes': 44, 'published_at': '2026-03-01', 'recorded_on': '2026-02-28', 'views': 684021, 'topics': ['global issues', 'politics', 'military', 'war', 'government', 'middle east', 'policy', 'international relations', 'current events'], 'image': 'images/talk_055_ian-bremmer-the-attack-on-iran-why-now.jpg', 'canonical_url': 'https://www.ted.com/talks/ian_bremmer_the_attack_on_iran_why_now', 'description': 'On the morning of February 28, 2026, the US and Israel bombed several parts of Iran, including the Tehran compound of Supreme Leader Ali Khamenei. Geopolitical expert and Eurasia Group founder Ian Bremmer breaks down why US President Donald Trump made the decision to strike, what it means for hopes of "regime change" and the key details you need to know about this perilous moment in global history. (This interview, hosted by TED\'s Helen Walters, was recorded on February 28, 2026.)', 'transcript': 'Ian Bremmer opens by framing the central tension behind The attack on Iran - why now?. The talk then connects evidence, lived experience, and examples from TED Explains the World with Ian Bremmer. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '173004', 'title': "What to do when you're told there's nothing left to try", 'slug': 'david-fajgenbaum-and-kiah-williams-what-to-do-when-you-re-told-there-s-nothing-left-to-try', 'speaker': 'David Fajgenbaum and Kiah Williams', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 1720, 'duration_minutes': 29, 'published_at': '2026-02-27', 'recorded_on': '2025-11-10', 'views': 220867, 'topics': ['science', 'technology', 'social change', 'health', 'health care', 'medicine', 'poverty', 'personal growth', 'ai', 'public health', 'medical research', 'the audacious project', 'artificial intelligence'], 'image': 'images/talk_056_david-fajgenbaum-and-kiah-williams-what-to-do-wh.jpg', 'canonical_url': 'https://www.ted.com/talks/david_fajgenbaum_and_kiah_williams_what_to_do_when_you_re_told_there_s_nothing_left_to_try', 'description': "What do you do when the world declares something impossible? When physician-scientist David Fajgenbaum was dying from a rare disease and social entrepreneur Kiah Williams was confronting the realities of economic hardship, they began asking a different question: What can I do today? In this conversation, they discuss how turning hope into action can drive meaningful change - one step at a time. (This conversation is hosted by The Audacious Project's Alexandra Tillmann.)", 'transcript': "David Fajgenbaum and Kiah Williams opens by framing the central tension behind What to do when you're told there's nothing left to try. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172996', 'title': 'My year living with a robot', 'slug': 'emily-kate-genatowski-my-year-living-with-a-robot', 'speaker': 'Emily Kate Genatowski', 'event': 'TEDAI Vienna 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 830, 'duration_minutes': 14, 'published_at': '2026-02-25', 'recorded_on': '2025-09-26', 'views': 246590, 'topics': ['technology', 'robots', 'ai', 'life'], 'image': 'images/talk_057_emily-kate-genatowski-my-year-living-with-a-robo.jpg', 'canonical_url': 'https://www.ted.com/talks/emily_kate_genatowski_my_year_living_with_a_robot', 'description': "Imagine a robot moving into your home. How would it change your daily life? Historian Emily Kate Genatowski shares five eye-opening lessons from a year living with her AI-powered robot roommate, from the quirky and chaotic to the surprisingly mundane. Her experiences show that the future of robots isn't science fiction - it's practical, messy and already here.", 'transcript': 'Emily Kate Genatowski opens by framing the central tension behind My year living with a robot. The talk then connects evidence, lived experience, and examples from TEDAI Vienna 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172999', 'title': 'Jermaine Dupri on the art of making a hit | On the Spot', 'slug': 'jermaine-dupri-jermaine-dupri-on-the-art-of-making-a-hit-on-the-spot', 'speaker': 'Jermaine Dupri', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 660, 'duration_minutes': 11, 'published_at': '2026-02-26', 'recorded_on': '2025-11-10', 'views': 211240, 'topics': ['culture', 'entertainment', 'music', 'collaboration', 'creativity', 'art'], 'image': 'images/talk_058_jermaine-dupri-jermaine-dupri-on-the-art-of-maki.jpg', 'canonical_url': 'https://www.ted.com/talks/jermaine_dupri_jermaine_dupri_on_the_art_of_making_a_hit_on_the_spot', 'description': 'Legendary music producer Jermaine Dupri pulls back the curtain on how hit songs really get made in TED\'s rapid-fire Q&A format, "On the Spot." Answering a stream of unexpected questions, he covers what makes a good hook, why he doesn\'t chase "cool," how he helped build Atlanta\'s sound and more.', 'transcript': 'Jermaine Dupri opens by framing the central tension behind Jermaine Dupri on the art of making a hit | On the Spot. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '171661', 'title': 'The controversial climate tool funding real change', 'slug': 'sandeep-roy-choudhury-the-controversial-climate-tool-funding-real-change', 'speaker': 'Sandeep Roy Choudhury', 'event': 'TED Countdown Summit 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 535, 'duration_minutes': 9, 'published_at': '2026-02-24', 'recorded_on': '2025-06-17', 'views': 221876, 'topics': ['climate change', 'environment', 'sustainability', 'finance', 'countdown'], 'image': 'images/talk_059_sandeep-roy-choudhury-the-controversial-climate-.jpg', 'canonical_url': 'https://www.ted.com/talks/sandeep_roy_choudhury_the_controversial_climate_tool_funding_real_change', 'description': "If a company plants trees to offset its pollution, is that climate progress - or is it greenwashing? Critics of carbon markets say it's the latter. But Sandeep Roy Choudhury, who's spent two decades financing climate projects from rural cookstoves to coastal forests, says the real failure is discouraging companies from even trying. Hear his case for why we shouldn't let perfection block meaningful action on climate change.", 'transcript': 'Sandeep Roy Choudhury opens by framing the central tension behind The controversial climate tool funding real change. The talk then connects evidence, lived experience, and examples from TED Countdown Summit 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172142', 'title': 'A surprisingly effective way to fight misinformation', 'slug': 'dave-jorgenson-a-surprisingly-effective-way-to-fight-misinformation', 'speaker': 'Dave Jorgenson', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 754, 'duration_minutes': 13, 'published_at': '2026-02-23', 'recorded_on': '2025-11-09', 'views': 406598, 'topics': ['culture', 'media', 'humor', 'society', 'internet'], 'image': 'images/talk_060_dave-jorgenson-a-surprisingly-effective-way-to-f.jpg', 'canonical_url': 'https://www.ted.com/talks/dave_jorgenson_a_surprisingly_effective_way_to_fight_misinformation', 'description': "What if the best defense against misinformation isn't panic, but a punchline? Journalist and comedian Dave Jorgenson explores how misinformation has proliferated throughout history - from the age of Plato to the era of viral TikToks. With his own short, absurdist sketches that explain the news, he shows how humor can cut through fear, spark curiosity and explore nuanced truth.", 'transcript': 'Dave Jorgenson opens by framing the central tension behind A surprisingly effective way to fight misinformation. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '172495', 'title': 'How a viral choreographer makes his moves', 'slug': 'sean-bankhead-how-a-viral-choreographer-makes-his-moves', 'speaker': 'Sean Bankhead', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 399, 'duration_minutes': 7, 'published_at': '2026-02-20', 'recorded_on': '2025-11-09', 'views': 26868, 'topics': ['culture', 'music', 'performance', 'art', 'dance'], 'image': 'images/talk_061_sean-bankhead-how-a-viral-choreographer-makes-hi.jpg', 'canonical_url': 'https://www.ted.com/talks/sean_bankhead_how_a_viral_choreographer_makes_his_moves', 'description': 'In a swaggering performance, choreographer Sean Bankhead and his students perform the viral dance he designed for Victoria Monet\'s hit song "On My Mama." Rooted in Black culture and inspired by generations of iconic artists, Bankhead blends expertise with at least one move everyone can try - showing how choreography doesn\'t just reflect culture, it drives it forward.', 'transcript': 'Sean Bankhead opens by framing the central tension behind How a viral choreographer makes his moves. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '172774', 'title': "The story you're not hearing about AI data centers", 'slug': 'ay-e-coskun-the-story-you-re-not-hearing-about-ai-data-centers', 'speaker': 'Ayse Coskun', 'event': 'TEDAI San Francisco', 'talk_type': 'TED Stage Talk', 'duration_seconds': 717, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-21', 'views': 302717, 'topics': ['environment', 'sustainability', 'technology', 'energy', 'ai', 'data', 'renewable energy'], 'image': 'images/talk_062_ay-e-coskun-the-story-you-re-not-hearing-about-a.jpg', 'canonical_url': 'https://www.ted.com/talks/ay_e_coskun_the_story_you_re_not_hearing_about_ai_data_centers', 'description': "The race to build smarter AI is crashing into a physical limitation: the power grid simply can't keep up with the energy demands of data centers. Computer scientist Ayse Coskun shows how we could turn this problem on its head, transforming AI facilities into virtual batteries that help stabilize the grid and accelerate clean energy. Learn why the technology causing this crisis might be the only thing smart enough to fix it.", 'transcript': "Ayse Coskun opens by framing the central tension behind The story you're not hearing about AI data centers. The talk then connects evidence, lived experience, and examples from TEDAI San Francisco. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}, {'source_id': '170176', 'title': 'How to be a great listener', 'slug': 'maegan-stephens-nicole-lowenbraun-how-to-be-a-great-listener', 'speaker': 'Maegan Stephens, Nicole Lowenbraun', 'event': 'TED@BCG', 'talk_type': 'TED Stage Talk', 'duration_seconds': 706, 'duration_minutes': 12, 'published_at': '2026-02-19', 'recorded_on': '2025-10-23', 'views': 357273, 'topics': ['communication', 'leadership', 'work', 'trust', 'goals'], 'image': 'images/talk_063_maegan-stephens-nicole-lowenbraun-how-to-be-a-gr.jpg', 'canonical_url': 'https://www.ted.com/talks/maegan_stephens_nicole_lowenbraun_how_to_be_a_great_listener', 'description': 'Have you ever left a meeting thinking: everyone talked, but nothing was achieved? Chances are that people were listening to each other, just not in the same way. Listening experts Maegan Stephens and Nicole Lowenbraun unpack the four different ways to listen, sharing a practical framework that could change how you respond, build trust and get results - starting with just one simple question.', 'transcript': 'Maegan Stephens, Nicole Lowenbraun opens by framing the central tension behind How to be a great listener. The talk then connects evidence, lived experience, and examples from TED@BCG. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.', 'recommended_for': ['curious minds', 'team discussion', 'classroom']}, {'source_id': '170828', 'title': "What you know that AI doesn't", 'slug': 'priyanka-vergadia-what-you-know-that-ai-doesn-t', 'speaker': 'Priyanka Vergadia', 'event': 'TEDNext 2025', 'talk_type': 'TED Stage Talk', 'duration_seconds': 559, 'duration_minutes': 9, 'published_at': '2026-02-18', 'recorded_on': '2025-11-10', 'views': 278682, 'topics': ['technology', 'collaboration', 'work', 'ai', 'career'], 'image': 'images/talk_064_priyanka-vergadia-what-you-know-that-ai-doesn-t.jpg', 'canonical_url': 'https://www.ted.com/talks/priyanka_vergadia_what_you_know_that_ai_doesn_t', 'description': "AI is good at seeing patterns, but it's humans who figure out what to do next, says technologist Priyanka Vergadia. She shares three stories of human excellence sparked by AI insights and offers a pathway to identify and cultivate your irreplaceable qualities, turning the AI revolution from a threat into an opportunity.", 'transcript': "Priyanka Vergadia opens by framing the central tension behind What you know that AI doesn't. The talk then connects evidence, lived experience, and examples from TEDNext 2025. The closing section asks viewers to compare trade-offs, notice overlooked details, and carry one useful idea into their own community.", 'recommended_for': ['solo learning', 'research notes', 'evening watch']}] PLAYLISTS = [{'slug': 'ai-and-society', 'title': 'AI, Society, and the Future', 'description': 'Talks about artificial intelligence, prediction, work, law, and public life.', 'topic': 'AI|artificial intelligence|future|technology|law'}, {'slug': 'design-and-creativity', 'title': 'Design, Creativity, and Art', 'description': 'A set of design and creativity talks for teams planning a workshop.', 'topic': 'design|creativity|art|architecture|innovation'}, {'slug': 'climate-nature-conservation', 'title': 'Climate, Nature, and Conservation', 'description': 'Talks about conservation, clean energy, oceans, animals, and climate action.', 'topic': 'nature|climate change|renewable energy|conservation|ocean|animals|wildlife'}, {'slug': 'health-science-body', 'title': 'Health, Science, and the Body', 'description': 'Science and medicine talks with practical questions for public health.', 'topic': 'health|health care|medicine|disease|biology|science'}, {'slug': 'culture-democracy-stories', 'title': 'Culture, Democracy, and Stories', 'description': 'Talks about culture, rights, media, storytelling, and civic life.', 'topic': 'culture|democracy|government|media|storytelling|society|social change'}, {'slug': 'work-business-leadership', 'title': 'Work, Business, and Leadership', 'description': 'Talks about leadership, organizations, money, careers, and decision-making.', 'topic': 'business|work|leadership|money|finance|economics'}, {'slug': 'music-performance-art', 'title': 'Music, Performance, and Art', 'description': 'Performances and creative talks for audiences comparing style, culture, and sound.', 'topic': 'music|performance|dance|sound|art'}] From 0a7c47a6965b8ae76dd53aa5c2c91572c6dd9b43 Mon Sep 17 00:00:00 2001 From: Django-Jiang <43953876+Django-Jiang@users.noreply.github.com> Date: Sat, 18 Jul 2026 16:02:57 -0700 Subject: [PATCH 06/15] Add TED task verifiers and fix task issues found in review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on #1 (TED mirror by @shanjiaming). Adds the reviewer grading contract and fixes task-definition issues surfaced in review. Verifiers (sites/ted/verify/): verify_lib.py + verify_0..17.py — deterministic-first (nav-evidence + answer match + DB after-state), LLM utilities anchored on frozen ground truth. verifier_path + judge_rubric recorded in tasks.jsonl. Validated: no-op FAILs 18/18, correct solve PASSes 18/18, wrong answers/actions FAIL. Task fixes (sites/ted/tasks.jsonl): - Add demo credentials to account-bound tasks (1/4/7/9/12). - De-shortcut prior-knowledge-answerable tasks: TED--5 -> exact title; TED--17 -> event month (Nov 2025) instead of city (Atlanta). - TED--7: retarget from TED Countdown Summit 2025 (Alice is seed-registered -> no-op) to TED2026. --- sites/ted/tasks.jsonl | 36 ++-- sites/ted/verify/verify_0.py | 33 ++++ sites/ted/verify/verify_1.py | 41 +++++ sites/ted/verify/verify_10.py | 34 ++++ sites/ted/verify/verify_11.py | 30 ++++ sites/ted/verify/verify_12.py | 47 ++++++ sites/ted/verify/verify_13.py | 33 ++++ sites/ted/verify/verify_14.py | 32 ++++ sites/ted/verify/verify_15.py | 38 +++++ sites/ted/verify/verify_16.py | 43 +++++ sites/ted/verify/verify_17.py | 31 ++++ sites/ted/verify/verify_2.py | 34 ++++ sites/ted/verify/verify_3.py | 40 +++++ sites/ted/verify/verify_4.py | 33 ++++ sites/ted/verify/verify_5.py | 35 ++++ sites/ted/verify/verify_6.py | 31 ++++ sites/ted/verify/verify_7.py | 42 +++++ sites/ted/verify/verify_8.py | 38 +++++ sites/ted/verify/verify_9.py | 45 +++++ sites/ted/verify/verify_lib.py | 292 +++++++++++++++++++++++++++++++++ 20 files changed, 970 insertions(+), 18 deletions(-) create mode 100644 sites/ted/verify/verify_0.py create mode 100644 sites/ted/verify/verify_1.py create mode 100644 sites/ted/verify/verify_10.py create mode 100644 sites/ted/verify/verify_11.py create mode 100644 sites/ted/verify/verify_12.py create mode 100644 sites/ted/verify/verify_13.py create mode 100644 sites/ted/verify/verify_14.py create mode 100644 sites/ted/verify/verify_15.py create mode 100644 sites/ted/verify/verify_16.py create mode 100644 sites/ted/verify/verify_17.py create mode 100644 sites/ted/verify/verify_2.py create mode 100644 sites/ted/verify/verify_3.py create mode 100644 sites/ted/verify/verify_4.py create mode 100644 sites/ted/verify/verify_5.py create mode 100644 sites/ted/verify/verify_6.py create mode 100644 sites/ted/verify/verify_7.py create mode 100644 sites/ted/verify/verify_8.py create mode 100644 sites/ted/verify/verify_9.py create mode 100644 sites/ted/verify/verify_lib.py diff --git a/sites/ted/tasks.jsonl b/sites/ted/tasks.jsonl index b6f66000..d8b6a125 100644 --- a/sites/ted/tasks.jsonl +++ b/sites/ted/tasks.jsonl @@ -1,18 +1,18 @@ -{"web_name": "TED", "id": "TED--0", "ques": "Search for talks about AI and open the Anil Seth talk. What is the talk duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--1", "ques": "Find a TED2026 talk about driverless cars and save it to Alice Johnson's account with the note 'mobility planning'.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--2", "ques": "Browse the design topic and open Debbie Millman's TEDNext 2025 talk that is shorter than 10 minutes. What is its duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--3", "ques": "Open the climate and nature playlist and name one talk recorded at the TED Countdown Summit 2025.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--4", "ques": "Log in as alice.j@test.com and change the newsletter topic to conservation.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--5", "ques": "Find the talk by Malala Yousafzai and list two topics attached to it.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--6", "ques": "Search for 'clean energy' and open the result by Kimiko Hirata. What event is it from?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--7", "ques": "Register interest in the TED Countdown Summit 2025 event while logged in as Alice Johnson.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--8", "ques": "Compare Alexi Pappas's \"Why I love my bad days\" with Debbie Millman's \"You got what you wanted. Now what?\" Which one is shorter?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--9", "ques": "Find a talk about Parkinson's and save it to the current account with a note for public health review.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--10", "ques": "Open the AI, Society, and the Future playlist. Which included talk discusses a Supreme Court case?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--11", "ques": "Use filters to find TED2026 talks under 10 minutes and open the talk by Maya Higa.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--12", "ques": "Log in as alice.j@test.com and remove one saved talk that is not about AI from the account page.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--13", "ques": "Find the science topic page and identify the TEDx talk specifically about wine tasting.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--14", "ques": "Search for 'architecture 3D printing' and open the talk about traditional architecture. Who is the speaker?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--15", "ques": "Find the music topic talks by Akoth Jumadi and Mr. Lu and by Turkana Sessions. Which one has more views?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--16", "ques": "Create a new account, save the Peter Steinberger AI agent talk, then confirm it appears under saved talks.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} -{"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the city for the TEDNext 2025 event.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/"} +{"web_name": "TED", "id": "TED--0", "ques": "Search for talks about AI and open the Anil Seth talk. What is the talk duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_0.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Anil Seth's talk 'Why AI is unlikely to become conscious'. (2) The reported duration MUST be 15 minutes. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the duration is not 15; empty answer."} +{"web_name": "TED", "id": "TED--1", "ques": "Find a TED2026 talk about driverless cars and save it to Alice Johnson's account (email: alice.j@test.com, password: TestPass123!) with the note 'mobility planning'.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_1.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST open the TED2026 driverless-cars talk (Waymo, Tekedra Mawakana & Sal Khan). (3) The talk MUST be saved to Alice's account with a note containing 'mobility planning'. (4) Final answer non-empty. FAIL if: no login; the Waymo talk was not saved; the note does not mention 'mobility planning'; empty answer."} +{"web_name": "TED", "id": "TED--2", "ques": "Browse the design topic and open Debbie Millman's TEDNext 2025 talk that is shorter than 10 minutes. What is its duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_2.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Debbie Millman's TEDNext 2025 talk shorter than 10 minutes ('You got what you wanted. Now what?'). (2) The reported duration MUST be 8 minutes. (3) Final answer non-empty. FAIL if: the correct talk detail page was never opened; the duration is not 8; the 18-minute co-talk was reported instead; empty answer."} +{"web_name": "TED", "id": "TED--3", "ques": "Open the climate and nature playlist and name one talk recorded at the TED Countdown Summit 2025.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_3.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the Climate, Nature, and Conservation playlist. (2) The named talk MUST be one recorded at TED Countdown Summit 2025 that appears in that playlist (e.g. 'Conservation: a love story', 'A cheat sheet for accelerating clean energy'). (3) Final answer non-empty. FAIL if: the playlist was never opened; the named talk is not a TED Countdown Summit 2025 talk in the playlist; empty answer."} +{"web_name": "TED", "id": "TED--4", "ques": "Log in with the demo account (email: alice.j@test.com, password: TestPass123!) and change the newsletter topic to conservation.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_4.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!) — /login visited. (2) After the run Alice's newsletter topic MUST be 'conservation' (set via /account). (3) Final answer non-empty. FAIL if: no login; the newsletter topic is not 'conservation'; /account never visited; empty answer."} +{"web_name": "TED", "id": "TED--5", "ques": "Find the talk by Malala Yousafzai. What is the exact title of the talk?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_5.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Malala Yousafzai's talk detail page (listing cards show only the speaker, so the detail page must be opened to read the title). (2) The reported title MUST be 'What I got wrong about changing the world'. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the title is wrong or missing; empty answer."} +{"web_name": "TED", "id": "TED--6", "ques": "Search for 'clean energy' and open the result by Kimiko Hirata. What event is it from?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_6.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Kimiko Hirata's talk 'A cheat sheet for accelerating clean energy'. (2) The reported event MUST be 'TED Countdown Summit 2025'. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the event is wrong; empty answer."} +{"web_name": "TED", "id": "TED--7", "ques": "Register interest in the TED2026 event while logged in as Alice Johnson (email: alice.j@test.com, password: TestPass123!).", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_7.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST register Alice for the TED2026 event via the events page (/events). (3) After the run Alice MUST hold a registration for TED2026 (she was not registered for it initially). (4) Final answer non-empty. FAIL if: no login; Alice is not registered for TED2026 after the run; /events never visited; empty answer."} +{"web_name": "TED", "id": "TED--8", "ques": "Compare Alexi Pappas's \"Why I love my bad days\" with Debbie Millman's \"You got what you wanted. Now what?\" Which one is shorter?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_8.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open BOTH Alexi Pappas's 'Why I love my bad days' and Debbie Millman's 'You got what you wanted. Now what?'. (2) The answer MUST identify Alexi Pappas's talk (5 minutes) as the shorter one. (3) Final answer non-empty. FAIL if: either talk detail page was not opened; the answer names the wrong talk as shorter; empty answer."} +{"web_name": "TED", "id": "TED--9", "ques": "Find a talk about Parkinson's and save it to Alice Johnson's account (email: alice.j@test.com, password: TestPass123!) with a note for public health review.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_9.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST open Joy Milne's Parkinson's talk ('The nurse who can smell Parkinson's'). (3) The talk MUST be saved to Alice's account with a non-empty note related to public health review. (4) Final answer non-empty. FAIL if: no login; the Parkinson's talk was not saved; the note is empty/unrelated; empty answer."} +{"web_name": "TED", "id": "TED--10", "ques": "Open the AI, Society, and the Future playlist. Which included talk discusses a Supreme Court case?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_10.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the 'AI, Society, and the Future' playlist. (2) The named talk MUST be Neal Kumar Katyal's 'What really won the trillion-dollar Supreme Court case'. (3) Final answer non-empty. FAIL if: the playlist was never opened; the wrong talk is named; empty answer."} +{"web_name": "TED", "id": "TED--11", "ques": "Use filters to find TED2026 talks under 10 minutes and open the talk by Maya Higa.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_11.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST use the talks listing/filters (/talks) for TED2026 talks under 10 minutes. (2) The agent MUST open Maya Higa's talk 'The wildlife sanctuary you can visit from anywhere'. (3) Final answer non-empty. FAIL if: the talks listing was never used; Maya Higa's talk detail page was never opened; empty answer."} +{"web_name": "TED", "id": "TED--12", "ques": "Log in with the demo account (email: alice.j@test.com, password: TestPass123!) and remove one saved talk that is not about AI from the account page.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_12.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!) — /login visited. (2) The agent MUST remove exactly one saved talk that is NOT about AI from /account. (3) After the run Alice MUST have exactly 3 saved talks, with the AI talk ('How I created OpenClaw...') retained and the removed talk not being the AI one. (4) Final answer non-empty. FAIL if: no login; the AI talk was removed; not exactly one talk removed; /account never visited; empty answer."} +{"web_name": "TED", "id": "TED--13", "ques": "Find the science topic page and identify the TEDx talk specifically about wine tasting.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_13.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST reach the wine-tasting talk via the science topic. (2) The identified talk MUST be Qian Janice Wang's 'The art and science of wine tasting' (a TEDx talk). (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the wrong talk (e.g. Joy Milne's Parkinson's talk) is named; empty answer."} +{"web_name": "TED", "id": "TED--14", "ques": "Search for 'architecture 3D printing' and open the talk about traditional architecture. Who is the speaker?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_14.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST search 'architecture 3D printing' and open the traditional-architecture talk. (2) The reported speaker MUST be Riyad Joucka. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the speaker is wrong (e.g. Kate Canales); empty answer."} +{"web_name": "TED", "id": "TED--15", "ques": "Find the music topic talks by Akoth Jumadi and Mr. Lu and by Turkana Sessions. Which one has more views?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_15.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open BOTH music talks — Akoth Jumadi and Mr. Lu, and Turkana Sessions. (2) The answer MUST identify Turkana Sessions as having more views. (3) Final answer non-empty. FAIL if: either talk detail page was not opened; the answer names the wrong talk; empty answer."} +{"web_name": "TED", "id": "TED--16", "ques": "Create a new account, save the Peter Steinberger AI agent talk, then confirm it appears under saved talks.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_16.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST register a new account (/register). (2) The agent MUST save Peter Steinberger's talk 'How I created OpenClaw, the breakthrough AI agent'. (3) The agent MUST confirm it on the account page (/account), and the new (non-seed) user MUST have that talk saved. (4) Final answer non-empty. FAIL if: no new account created; the OpenClaw talk not saved by the new user; /account never visited; empty answer."} +{"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the month scheduled for the TEDNext 2025 event.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_17.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the events page (/events). (2) The reported month for TEDNext 2025 MUST be November 2025. (3) Final answer non-empty. FAIL if: the events page was never opened; the month is wrong; empty answer."} diff --git a/sites/ted/verify/verify_0.py b/sites/ted/verify/verify_0.py new file mode 100644 index 00000000..edc63420 --- /dev/null +++ b/sites/ted/verify/verify_0.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--0. + +Search for AI talks, open Anil Seth's talk, report its duration in minutes. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav Anil Seth talk detail | answer duration == 15 minutes | screenshot shows duration +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "anil-seth-why-ai-is-unlikely-to-become-conscious" + +def main(): + a = parse_args() + j = Judge('TED--0', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_anil_seth", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("answer_duration_15", 15 in extract_ints(fa), f"final={fa!r} ints={extract_ints(fa)}") + ok, ev = llm_text_match(fa, "15 minutes", + "What is the duration in minutes of Anil Seth's talk 'Why AI is unlikely to become conscious'?") + j.check("answer_duration_llm", ok, ev, llm=True) + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_1.py b/sites/ted/verify/verify_1.py new file mode 100644 index 00000000..90ca3e76 --- /dev/null +++ b/sites/ted/verify/verify_1.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--1. + +Find the TED2026 driverless-cars talk and save it to Alice's account with the +note 'mobility planning'. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav Waymo talk detail + /login | DB after: Waymo saved by alice with note containing 'mobility planning', absent in seed +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "tekedra-mawakana-sal-khan-waymo-s-case-for-a-driverless-future" +TITLE_SUB = "driverless future" +EMAIL = "alice.j@test.com" + +def main(): + a = parse_args() + j = Judge('TED--1', a.no_llm) + t = load_run(a.run_dir) + after = resolve_db(a.after_db, a.container, "instance") + init = resolve_db(a.initial_db, a.container, "instance_seed") + note = note_for_saved(after, EMAIL, TITLE_SUB) + init_titles = saved_titles_for(init) + j.check("nav_waymo", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("db_waymo_saved_by_alice", note is not None, f"note={note!r}") + j.check("db_note_mobility_planning", + note is not None and contains_all(note, ["mobility planning"]), f"note={note!r}") + j.check("db_absent_in_seed", + init_titles is not None and not any(norm(TITLE_SUB) in norm(x) for x in init_titles), + f"initial_saved={init_titles}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_10.py b/sites/ted/verify/verify_10.py new file mode 100644 index 00000000..3b12b3f0 --- /dev/null +++ b/sites/ted/verify/verify_10.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--10. + +Open the 'AI, Society, and the Future' playlist; which included talk discusses a +Supreme Court case? -> Neal Kumar Katyal, 'What really won the trillion-dollar +Supreme Court case'. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav ai-and-society playlist | answer names Neal Katyal / the Supreme Court talk +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +def main(): + a = parse_args() + j = Judge('TED--10', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_ai_society", navigated_to(t, "playlists/ai-and-society"), + f"navigated={navigated_to(t, 'playlists/ai-and-society')}") + j.check("answer_supreme_court_talk", + contains_any(fa, ["Neal Kumar Katyal", "Neal Katyal", + "What really won the trillion-dollar Supreme Court case"]), + f"final={fa!r}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_11.py b/sites/ted/verify/verify_11.py new file mode 100644 index 00000000..ca9d0873 --- /dev/null +++ b/sites/ted/verify/verify_11.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--11. + +Use the filters to find TED2026 talks under 10 minutes and open the talk by +Maya Higa. This is a navigation task (no factual answer required). + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav filtered /talks listing | nav Maya Higa talk detail +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere" + +def main(): + a = parse_args() + j = Judge('TED--11', a.no_llm) + t = load_run(a.run_dir) + j.check("nav_talks_listing", navigated_to(t, "/talks"), f"navigated={navigated_to(t, '/talks')}") + j.check("nav_maya_higa", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_12.py b/sites/ted/verify/verify_12.py new file mode 100644 index 00000000..d8569915 --- /dev/null +++ b/sites/ted/verify/verify_12.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--12. + +Log in as Alice and remove one saved talk that is NOT about AI. Seed baseline: +4 saved talks, exactly one about AI ('How I created OpenClaw, the breakthrough +AI agent'). A correct run removes one non-AI talk, leaving 3 with OpenClaw kept. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav /login,/account | DB after: exactly one talk removed, OpenClaw retained, removed talk is not the AI one +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +EMAIL = "alice.j@test.com" +AI_MARKER = "openclaw" + +def main(): + a = parse_args() + j = Judge('TED--12', a.no_llm) + t = load_run(a.run_dir) + after = resolve_db(a.after_db, a.container, "instance") + init = resolve_db(a.initial_db, a.container, "instance_seed") + after_titles = saved_titles_for(after, EMAIL) + init_titles = saved_titles_for(init, EMAIL) + removed = ([] if (after_titles is None or init_titles is None) + else [x for x in init_titles if norm(x) not in {norm(y) for y in after_titles}]) + j.check("nav_login", navigated_to(t, "/login"), f"navigated={navigated_to(t, '/login')}") + j.check("nav_account", navigated_to(t, "/account"), f"navigated={navigated_to(t, '/account')}") + j.check("db_exactly_one_removed", + after_titles is not None and init_titles is not None + and len(after_titles) == len(init_titles) - 1, + f"initial={init_titles} after={after_titles}") + j.check("db_ai_talk_retained", + after_titles is not None and any(AI_MARKER in norm(x) for x in after_titles), + f"after={after_titles}") + j.check("db_removed_not_ai", + len(removed) == 1 and AI_MARKER not in norm(removed[0]), f"removed={removed}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_13.py b/sites/ted/verify/verify_13.py new file mode 100644 index 00000000..f2598fa9 --- /dev/null +++ b/sites/ted/verify/verify_13.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--13. + +Find the science topic page and identify the TEDx talk specifically about wine +tasting. -> Qian Janice Wang, 'The art and science of wine tasting'. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav Qian Janice Wang talk detail | answer names the wine-tasting talk / speaker +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "qian-janice-wang-the-art-and-science-of-wine-tasting" + +def main(): + a = parse_args() + j = Judge('TED--13', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_wine_talk", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("answer_wine_talk", + contains_any(fa, ["Qian Janice Wang", "The art and science of wine tasting"]), + f"final={fa!r}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_14.py b/sites/ted/verify/verify_14.py new file mode 100644 index 00000000..b72acfc1 --- /dev/null +++ b/sites/ted/verify/verify_14.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--14. + +Search 'architecture 3D printing', open the talk about traditional architecture, +report the speaker. -> Riyad Joucka ('Reimagining traditional architecture for +modern needs'). Kate Canales's makeshift-signs talk is the near-miss distractor. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav Riyad Joucka talk detail | answer names the speaker Riyad Joucka +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "riyad-joucka-reimagining-traditional-architecture-for-modern-needs" + +def main(): + a = parse_args() + j = Judge('TED--14', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_riyad", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("answer_speaker", contains_all(fa, ["Riyad Joucka"]), f"final={fa!r}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_15.py b/sites/ted/verify/verify_15.py new file mode 100644 index 00000000..0cbbedca --- /dev/null +++ b/sites/ted/verify/verify_15.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--15. + +Among the music-topic talks by Akoth Jumadi and Mr. Lu vs Turkana Sessions, +which has more views? -> Turkana Sessions (4,223 views vs 2,781). + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav both talk details | answer names Turkana Sessions as having more views +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +AKOTH = "akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap" +TURKANA = "turkana-sessions-a-musical-journey-through-turkana" + +def main(): + a = parse_args() + j = Judge('TED--15', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_akoth", navigated_to(t, AKOTH), f"navigated={navigated_to(t, AKOTH)}") + j.check("nav_turkana", navigated_to(t, TURKANA), f"navigated={navigated_to(t, TURKANA)}") + j.check("answer_turkana_more", + contains_any(fa, ["Turkana Sessions", "A musical journey through Turkana"]), + f"final={fa!r}") + ok, ev = llm_text_match(fa, "Turkana Sessions ('A musical journey through Turkana') has more views", + "Which talk has more views: Akoth Jumadi and Mr. Lu, or Turkana Sessions?") + j.check("answer_more_views_llm", ok, ev, llm=True) + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_16.py b/sites/ted/verify/verify_16.py new file mode 100644 index 00000000..5284b540 --- /dev/null +++ b/sites/ted/verify/verify_16.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--16. + +Create a new account, save Peter Steinberger's AI-agent talk ('How I created +OpenClaw, the breakthrough AI agent'), then confirm it appears under saved talks. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav /register + Peter Steinberger talk detail + /account | DB after: a NON-seed user exists with the OpenClaw talk saved +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent" +OPENCLAW = "openclaw" + +def main(): + a = parse_args() + j = Judge('TED--16', a.no_llm) + t = load_run(a.run_dir) + after = resolve_db(a.after_db, a.container, "instance") + emails = user_emails(after) + new_emails = [e for e in (emails or []) if e not in SEED_EMAILS] + saved_by_new = False + for e in new_emails: + titles = saved_titles_for(after, e) or [] + if any(OPENCLAW in norm(x) for x in titles): + saved_by_new = True + break + j.check("nav_register", navigated_to(t, "/register"), f"navigated={navigated_to(t, '/register')}") + j.check("nav_openclaw_talk", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("nav_account", navigated_to(t, "/account"), f"navigated={navigated_to(t, '/account')}") + j.check("db_new_user_created", bool(new_emails), f"non_seed_users={new_emails}") + j.check("db_new_user_saved_openclaw", saved_by_new, f"non_seed_users={new_emails}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_17.py b/sites/ted/verify/verify_17.py new file mode 100644 index 00000000..07089b66 --- /dev/null +++ b/sites/ted/verify/verify_17.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--17. + +Open events and identify the month scheduled for the TEDNext 2025 event. +-> November 2025. (Re-anchored from the original 'city', which was Atlanta — a +value that matches the real world and is answerable from prior knowledge. The +month is a mirror-specific synthetic field, so it is only obtainable on-page.) + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav /events | answer names the month 'November' (2025) +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +def main(): + a = parse_args() + j = Judge('TED--17', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_events", navigated_to(t, "/events"), f"navigated={navigated_to(t, '/events')}") + j.check("answer_month_november", contains_all(fa, ["november"]), f"final={fa!r}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_2.py b/sites/ted/verify/verify_2.py new file mode 100644 index 00000000..24972e1f --- /dev/null +++ b/sites/ted/verify/verify_2.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--2. + +Browse the design topic, open Debbie Millman's TEDNext 2025 talk shorter than +10 minutes, report its duration in minutes. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav Debbie Millman 'You got what you wanted' detail | answer duration == 8 minutes +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "debbie-millman-you-got-what-you-wanted-now-what" + +def main(): + a = parse_args() + j = Judge('TED--2', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_debbie_millman", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("answer_duration_8", 8 in extract_ints(fa), f"final={fa!r} ints={extract_ints(fa)}") + ok, ev = llm_text_match(fa, "8 minutes", + "What is the duration in minutes of Debbie Millman's talk 'You got what you wanted. Now what?'") + j.check("answer_duration_llm", ok, ev, llm=True) + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_3.py b/sites/ted/verify/verify_3.py new file mode 100644 index 00000000..cf1cb77e --- /dev/null +++ b/sites/ted/verify/verify_3.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--3. + +Open the climate and nature playlist, name one talk recorded at the TED +Countdown Summit 2025. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav climate-nature-conservation playlist | answer names one of the summit talks in that playlist +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +# The TED Countdown Summit 2025 talks that sit in the climate-nature-conservation +# playlist (titles + speakers accepted). Ground truth frozen from ted.db. +CANDIDATES = [ + "Conservation: a love story", "Elsaphan Njora", + "A cheat sheet for accelerating clean energy", "Kimiko Hirata", + "How to make transportation quieter, cleaner and cheaper", "Doreen Orishaba", + "What China can teach the world about scaling clean energy", "Yin Yu", + "The controversial climate tool funding real change", "Sandeep Roy Choudhury", +] + +def main(): + a = parse_args() + j = Judge('TED--3', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_climate_playlist", navigated_to(t, "playlists/climate-nature-conservation"), + f"navigated={navigated_to(t, 'playlists/climate-nature-conservation')}") + j.check("answer_names_summit_talk", contains_any(fa, CANDIDATES), f"final={fa!r}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_4.py b/sites/ted/verify/verify_4.py new file mode 100644 index 00000000..8b4d1417 --- /dev/null +++ b/sites/ted/verify/verify_4.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--4. + +Log in as Alice and change the newsletter topic to conservation. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav /login,/account | DB after: alice newsletter_topic == 'conservation' (seed was 'ai') +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +EMAIL = "alice.j@test.com" + +def main(): + a = parse_args() + j = Judge('TED--4', a.no_llm) + t = load_run(a.run_dir) + after = resolve_db(a.after_db, a.container, "instance") + topic = newsletter_topic_for(after, EMAIL) + j.check("nav_login", navigated_to(t, "/login"), f"navigated={navigated_to(t, '/login')}") + j.check("nav_account", navigated_to(t, "/account"), f"navigated={navigated_to(t, '/account')}") + j.check("db_newsletter_conservation", topic is not None and norm(topic) == "conservation", + f"newsletter_topic={topic!r}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_5.py b/sites/ted/verify/verify_5.py new file mode 100644 index 00000000..b2c86bc4 --- /dev/null +++ b/sites/ted/verify/verify_5.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--5. + +Find Malala Yousafzai's talk and report its exact title. (Re-anchored from the +original 'list two topics', which a model could answer from prior knowledge; the +title is on-page only — listing cards show the speaker, not the title.) + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav Malala talk detail | answer contains the exact title +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "malala-yousafzai-what-i-got-wrong-about-changing-the-world" +TITLE = "What I got wrong about changing the world" + +def main(): + a = parse_args() + j = Judge('TED--5', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_malala", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("answer_exact_title", contains_all(fa, [TITLE]), f"final={fa!r}") + ok, ev = llm_text_match(fa, TITLE, "What is the exact title of Malala Yousafzai's talk?") + j.check("answer_title_llm", ok, ev, llm=True) + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_6.py b/sites/ted/verify/verify_6.py new file mode 100644 index 00000000..ceaf6182 --- /dev/null +++ b/sites/ted/verify/verify_6.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--6. + +Search 'clean energy', open Kimiko Hirata's result, report which event it is from. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav Kimiko Hirata talk detail | answer names 'TED Countdown Summit 2025' +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy" + +def main(): + a = parse_args() + j = Judge('TED--6', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_kimiko", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("answer_event", contains_any(fa, ["TED Countdown Summit 2025", "Countdown Summit 2025"]), + f"final={fa!r}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_7.py b/sites/ted/verify/verify_7.py new file mode 100644 index 00000000..279b03c7 --- /dev/null +++ b/sites/ted/verify/verify_7.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--7. + +Register interest in the TED2026 event while logged in as Alice. (Re-anchored +from 'TED Countdown Summit 2025', which Alice is already seed-registered for — +that made the task a no-op and the after-state indistinguishable from doing +nothing. Alice is NOT seed-registered for TED2026, so a registration is a +genuine, verifiable state change.) + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav /events + /login | DB after: alice registered for TED2026, not registered in seed +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +EMAIL = "alice.j@test.com" +EVENT = "TED2026" + +def main(): + a = parse_args() + j = Judge('TED--7', a.no_llm) + t = load_run(a.run_dir) + after = resolve_db(a.after_db, a.container, "instance") + init = resolve_db(a.initial_db, a.container, "instance_seed") + after_regs = registered_events_for(after, EMAIL) + init_regs = registered_events_for(init, EMAIL) + j.check("nav_events", navigated_to(t, "/events"), f"navigated={navigated_to(t, '/events')}") + j.check("nav_login", navigated_to(t, "/login"), f"navigated={navigated_to(t, '/login')}") + j.check("db_registered_ted2026", + after_regs is not None and EVENT in after_regs, f"after_regs={after_regs}") + j.check("db_not_registered_in_seed", + init_regs is not None and EVENT not in init_regs, f"initial_regs={init_regs}") + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_8.py b/sites/ted/verify/verify_8.py new file mode 100644 index 00000000..c2b505af --- /dev/null +++ b/sites/ted/verify/verify_8.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--8. + +Compare Alexi Pappas's 'Why I love my bad days' (5 min) with Debbie Millman's +'You got what you wanted. Now what?' (8 min) — which is shorter? -> Alexi Pappas. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav both talk details | answer names Alexi Pappas / 'Why I love my bad days' as shorter +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +ALEXI = "alexi-pappas-why-i-love-my-bad-days" +DEBBIE = "debbie-millman-you-got-what-you-wanted-now-what" + +def main(): + a = parse_args() + j = Judge('TED--8', a.no_llm) + t = load_run(a.run_dir) + fa = final_answer(t) + j.check("nav_alexi", navigated_to(t, ALEXI), f"navigated={navigated_to(t, ALEXI)}") + j.check("nav_debbie", navigated_to(t, DEBBIE), f"navigated={navigated_to(t, DEBBIE)}") + j.check("answer_alexi_shorter", + contains_any(fa, ["Alexi Pappas", "Why I love my bad days"]), f"final={fa!r}") + ok, ev = llm_text_match(fa, "Alexi Pappas's 'Why I love my bad days' (5 minutes) is the shorter talk", + "Which talk is shorter: Alexi Pappas's 'Why I love my bad days' or Debbie Millman's " + "'You got what you wanted. Now what?'") + j.check("answer_shorter_llm", ok, ev, llm=True) + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_9.py b/sites/ted/verify/verify_9.py new file mode 100644 index 00000000..b6be216c --- /dev/null +++ b/sites/ted/verify/verify_9.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +"""Deterministic verifier for TED task TED--9. + +Find a talk about Parkinson's and save it to Alice's account with a note for +public health review. Ground truth: Joy Milne, 'The nurse who can smell +Parkinson's'. + +Checks (deterministic first; LLM utilities anchored on ground truth): +nav Joy Milne talk detail + /login | DB after: talk saved by alice with a non-empty note, absent in seed +Input/Output: see verify_lib.parse_args / Judge.emit. +""" +import os, sys +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, + norm, contains_all, contains_any, answer_equals, extract_ints, + resolve_db, saved_talks_for, saved_titles_for, note_for_saved, + newsletter_topic_for, registered_events_for, user_emails, + SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) + +SLUG = "joy-milne-the-nurse-who-can-smell-parkinson-s" +TITLE_SUB = "smell Parkinson" +EMAIL = "alice.j@test.com" + +def main(): + a = parse_args() + j = Judge('TED--9', a.no_llm) + t = load_run(a.run_dir) + after = resolve_db(a.after_db, a.container, "instance") + init = resolve_db(a.initial_db, a.container, "instance_seed") + note = note_for_saved(after, EMAIL, TITLE_SUB) + init_titles = saved_titles_for(init) + j.check("nav_parkinson", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") + j.check("db_parkinson_saved_by_alice", note is not None, f"note={note!r}") + j.check("db_note_present", bool(note and note.strip()), f"note={note!r}") + j.check("db_absent_in_seed", + init_titles is not None and not any(norm(TITLE_SUB) in norm(x) for x in init_titles), + f"initial_saved={init_titles}") + # The note text is free-form; confirm it reads as a public-health review note (anchored). + ok, ev = llm_text_match(note or "", "a note about public health / public health review", + "Is this saved-talk note a note for public health review?") + j.check("note_public_health_llm", ok, ev, llm=True) + j.emit() + +if __name__ == "__main__": + main() diff --git a/sites/ted/verify/verify_lib.py b/sites/ted/verify/verify_lib.py new file mode 100644 index 00000000..26123c0a --- /dev/null +++ b/sites/ted/verify/verify_lib.py @@ -0,0 +1,292 @@ +#!/usr/bin/env python3 +"""verify_lib.py — shared deterministic + LLM utilities for TED task verification. + +Philosophy: DETERMINISTIC FIRST. + 1. Trajectory navigation check (anti knowledge-shortcut): the agent MUST have + opened the relevant on-site page; a correct answer with no matching navigation + is a memory-recall shortcut = FAIL. + 2. Answer check: exact / regex / token-containment against frozen ground truth. + 3. DB after-state check (stateful tasks): query the SQLite instance DB directly — + the strongest deterministic signal (saved-talk row, registration row, + newsletter topic, newly registered user). + 4. LLM utilities (text match, screenshot-contains) are used ONLY where exact + matching is brittle, and are ALWAYS anchored on ground truth: the model + verifies *presence* of given content, it never supplies knowledge. One call each. + +Input signature (per task): + --run_dir DIR agent trajectory dir: trajectory.json + screenshots/step_NNN.png + --initial_db PATH initial-state SQLite DB (default: fetched instance_seed from container) + --after_db PATH after-state SQLite DB (default: fetched live instance DB from container) + --container NAME docker container to fetch DBs from (default: $WH_CONTAINER or wh-review) + --no_llm skip LLM-based checks (run deterministic-only) +Output: JSON {task_id, pass, reason, evidence[]} to stdout; exit 0 on PASS, 1 on FAIL. +""" +import base64, json, os, re, sqlite3, subprocess, sys, tempfile, urllib.request +from pathlib import Path +from dataclasses import dataclass + +SITE = "ted" + +# The four benchmark users seeded by seed_users() in sites/ted/app.py. Used by +# "create a new account" tasks to tell a freshly-registered user apart from seed rows. +SEED_EMAILS = ["alice.j@test.com", "bob.c@test.com", "carol.d@test.com", "david.k@test.com"] + +# ---------------------------------------------------------------- trajectory +def load_run(run_dir): + d = Path(run_dir) + traj = json.loads((d / "trajectory.json").read_text()) + traj["_run_dir"] = d + traj["_shots"] = {p.name: p for p in sorted((d / "screenshots").glob("step_*.png"))} + return traj + +def step_urls(traj): + return [s.get("url", "") for s in traj.get("steps", [])] + +def navigated_to(traj, substr, times=1): + """Deterministic: at least `times` trajectory steps have a URL containing substr.""" + return sum(1 for u in step_urls(traj) if substr in u) >= times + +def navigated_any(traj, substrs): + return any(navigated_to(traj, s) for s in substrs) + +def final_answer(traj): + return (traj.get("final_answer") or "").strip() + +def _shot(traj, name): + if not name: + return None + p = traj["_shots"].get(Path(name).name) + return p if (p and p.exists()) else None + +def shot_after_url(traj, substr): + """screenshot_after path of the first step whose URL contains substr.""" + for s in traj.get("steps", []): + if substr in s.get("url", ""): + p = _shot(traj, s.get("screenshot_after")) + if p: + return p + return None + +def last_shot(traj): + for s in reversed(traj.get("steps", [])): + p = _shot(traj, s.get("screenshot_after")) or _shot(traj, s.get("screenshot_before")) + if p: + return p + shots = sorted(traj["_shots"].values()) + return shots[-1] if shots else None + +# ---------------------------------------------------------------- deterministic answer match +def norm(s): + return re.sub(r"\s+", " ", (s or "").strip()).casefold() + +def answer_equals(final, expected): + return norm(final) == norm(expected) + +def contains_all(final, tokens): + f = norm(final) + return all(norm(t) in f for t in tokens) + +def contains_any(final, tokens): + f = norm(final) + return any(norm(t) in f for t in tokens) + +def extract_years(text): + return re.findall(r"\b(1[5-9]\d{2}|20\d{2})\b", text or "") + +def extract_ints(text): + return [int(n) for n in re.findall(r"\d+", text or "")] + +# ---------------------------------------------------------------- DB state +def fetch_db(container, kind): + """kind: 'instance' (after-state) or 'instance_seed' (initial-state). docker cp -> temp file.""" + src = f"{container}:/opt/WebSyn/{SITE}/{kind}/{SITE}.db" + fd, path = tempfile.mkstemp(suffix=".db") + os.close(fd) + r = subprocess.run(["docker", "cp", src, path], capture_output=True, text=True) + if r.returncode != 0: + try: + os.unlink(path) + except OSError: + pass + raise RuntimeError(f"docker cp {src} failed: {r.stderr.strip()}") + return path + +def resolve_db(arg, container, kind): + if arg: + return arg + try: + return fetch_db(container, kind) + except Exception: + return None # caller treats None as "unavailable" and FAILs that check + +def db_query(db_path, sql, params=()): + con = sqlite3.connect(db_path) + try: + return con.execute(sql, params).fetchall() + finally: + con.close() + +def saved_talks_for(db_path, email="alice.j@test.com"): + """List of (talk_title, note) saved by the user, or None if db unavailable.""" + if not db_path: + return None + rows = db_query(db_path, + "SELECT t.title, s.note FROM saved_talk s JOIN user u ON u.id=s.user_id " + "JOIN talk t ON t.id=s.talk_id WHERE u.email=? ORDER BY t.title", (email,)) + return [(r[0], r[1] or "") for r in rows] + +def saved_titles_for(db_path, email="alice.j@test.com"): + st = saved_talks_for(db_path, email) + return None if st is None else [title for title, _ in st] + +def note_for_saved(db_path, email, title_substr): + """Note text of the saved talk whose title contains title_substr; None if not saved.""" + st = saved_talks_for(db_path, email) + if st is None: + return None + for title, note in st: + if norm(title_substr) in norm(title): + return note + return None + +def newsletter_topic_for(db_path, email="alice.j@test.com"): + if not db_path: + return None + rows = db_query(db_path, "SELECT newsletter_topic FROM user WHERE email=?", (email,)) + return rows[0][0] if rows else None + +def registered_events_for(db_path, email="alice.j@test.com"): + """Event names the user holds a registration row for, or None if db unavailable.""" + if not db_path: + return None + rows = db_query(db_path, + "SELECT e.name FROM registration r JOIN user u ON u.id=r.user_id " + "JOIN event e ON e.id=r.event_id WHERE u.email=?", (email,)) + return [r[0] for r in rows] + +def user_emails(db_path): + if not db_path: + return None + return [r[0] for r in db_query(db_path, "SELECT email FROM user ORDER BY id")] + +# ---------------------------------------------------------------- shared LLM utilities (anchored) +# Unified LLM config, same env vars as agent.py / eval_judge.py: +# OPENAI_API_KEY, OPENAI_BASE_URL, JUDGE_MODEL +import simpleArgParser as sap + +# When --no_llm is set (via Judge), the llm_* helpers short-circuit so verifiers +# that call them directly (before j.check(llm=True)) still make ZERO LLM calls. +_NO_LLM = False + + +def _llm_config(): + """Resolve (api_key, api_base, model) from env once per process.""" + key = os.environ.get("OPENAI_API_KEY", "") + base = os.environ.get("OPENAI_BASE_URL", "") + model = os.environ.get("JUDGE_MODEL", "") + return key, base, model + + +def _chat(messages, max_tokens=1024): + """One LLM call against the configured OpenAI-compatible endpoint. Returns text or None.""" + if _NO_LLM: + return None + key, base, model = _llm_config() + if not (key and base and model): + return None # no LLM configured -> callers treat as non-PASS + payload = {"model": model, "messages": messages, + "max_tokens": max_tokens, "temperature": 1.0} + req = urllib.request.Request(base, + data=json.dumps(payload).encode(), + headers={"Content-Type": "application/json", + "Authorization": f"Bearer {key}"}) + try: + data = json.loads(urllib.request.urlopen(req, timeout=180).read()) + except Exception: + return None # caller treats None as a non-PASS; never raises + try: + return data["choices"][0]["message"]["content"] + except Exception: + return None + +def _verdict(out): + """Normalize an LLM reply to (pass_bool, text). None/empty -> (False, '').""" + if not out: + return False, "" + s = out.strip() + return s.upper().startswith("PASS"), s + +def llm_text_match(agent_answer, ground_truth, question): + """One LLM call: does agent_answer correctly answer question AND stay consistent + with the frozen ground truth? The model is given the ground truth as an anchor + and is told NOT to use its own knowledge.""" + if _NO_LLM: + return False, "[skipped: --no_llm]" + out = _chat([{"role": "user", "content": + f"You are a STRICT binary grader.\nQuestion: {question}\n" + f"Ground-truth answer (ANCHOR — judge against THIS, never use your own knowledge): {ground_truth}\n" + f"Agent's answer: {agent_answer}\n" + f"Decide PASS or FAIL ignoring case/punctuation/word order/surrounding prose. " + f"PASS only if the agent's answer is consistent with the ground truth AND actually answers the question. " + f"Line 1: PASS or FAIL. Line 2: one-sentence reason."}]) + return _verdict(out) + +def llm_screenshot_shows(shot_path, must_show, question=""): + """One vision LLM call: does this screenshot visibly render text answering/containing + `must_show`? The model judges pixels only, anchored on the expected content.""" + if _NO_LLM: + return False, "[skipped: --no_llm]" + b64 = base64.b64encode(Path(shot_path).read_bytes()).decode() + out = _chat([{"role": "user", "content": [ + {"type": "text", "text": + f"You are a STRICT binary grader. Only what is VISIBLY rendered in this screenshot counts.\n" + f"Question the page should answer: {question}\n" + f"Expected content to verify PRESENCE of: {must_show}\n" + f"PASS only if the expected content (or a semantically equivalent on-screen answer) is visibly shown. " + f"Do NOT use prior knowledge — judge only the rendered pixels.\n" + f"Line 1: PASS or FAIL. Line 2: quote the visible evidence."}, + {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}]}]) + return _verdict(out) + +# ---------------------------------------------------------------- judge harness + CLI +class Judge: + def __init__(self, task_id, no_llm=False): + global _NO_LLM + _NO_LLM = bool(no_llm) # gate the llm_* helpers at the source + self.task_id = task_id + self.no_llm = no_llm + self.ok = True + self.reason = "" + self.evidence = [] + + def check(self, name, cond, evidence="", llm=False): + if llm and self.no_llm: + self.evidence.append(f"[SKIP] {name} (--no-llm)") + return True + if cond: + self.evidence.append(f"[PASS] {name}: {evidence}") + else: + self.ok = False + if not self.reason: + self.reason = name # record the FIRST failing check + self.evidence.append(f"[FAIL] {name}: {evidence}") + return bool(cond) + + def emit(self): + print(json.dumps({"task_id": self.task_id, "pass": self.ok, + "reason": self.reason, "evidence": self.evidence}, indent=2)) + sys.exit(0 if self.ok else 1) + +def parse_args(): + @dataclass + class VerifyArgs: + run_dir: str = "" + initial_db: str = "" + after_db: str = "" + container: str = os.environ.get("WH_CONTAINER", "wh-review") + no_llm: bool = False + + def post_process(self): + if not self.run_dir: + raise SystemExit("--run_dir is required") + return sap.parse_args(VerifyArgs) From 065e39a4e1bf33e61902abdfb3e9d35f1e62428e Mon Sep 17 00:00:00 2001 From: Django-Jiang <43953876+Django-Jiang@users.noreply.github.com> Date: Sat, 18 Jul 2026 16:33:04 -0700 Subject: [PATCH 07/15] fix(ted): tighten verifier nav + integer checks - verify_11: require /talks? (filter listing) so opening a /talks/ detail page alone no longer satisfies the 'used filters' check. - extract_ints: word-boundary match so a duration check can't be satisfied by an incidental integer (e.g. '15k' views). --- sites/ted/verify/verify_11.py | 5 ++++- sites/ted/verify/verify_lib.py | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sites/ted/verify/verify_11.py b/sites/ted/verify/verify_11.py index ca9d0873..ddc70c6e 100644 --- a/sites/ted/verify/verify_11.py +++ b/sites/ted/verify/verify_11.py @@ -22,7 +22,10 @@ def main(): a = parse_args() j = Judge('TED--11', a.no_llm) t = load_run(a.run_dir) - j.check("nav_talks_listing", navigated_to(t, "/talks"), f"navigated={navigated_to(t, '/talks')}") + # Require the filtered listing specifically: "/talks?" (a query string) is + # only produced by the GET filter form, whereas "/talks" alone would also + # match every "/talks/" detail page and make this check vacuous. + j.check("nav_talks_listing", navigated_to(t, "/talks?"), f"navigated={navigated_to(t, '/talks?')}") j.check("nav_maya_higa", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") j.emit() diff --git a/sites/ted/verify/verify_lib.py b/sites/ted/verify/verify_lib.py index 26123c0a..cdbc6b4b 100644 --- a/sites/ted/verify/verify_lib.py +++ b/sites/ted/verify/verify_lib.py @@ -94,7 +94,8 @@ def extract_years(text): return re.findall(r"\b(1[5-9]\d{2}|20\d{2})\b", text or "") def extract_ints(text): - return [int(n) for n in re.findall(r"\d+", text or "")] + # \b word boundaries so e.g. "15" is not matched inside "15k" or "2015". + return [int(n) for n in re.findall(r"\b\d+\b", text or "")] # ---------------------------------------------------------------- DB state def fetch_db(container, kind): From 22c769fc40d7b6cc108669b7810a1f20c4ffb9e9 Mon Sep 17 00:00:00 2001 From: manager_of_pre_star_li Date: Sun, 6 Sep 2026 15:34:26 +0800 Subject: [PATCH 08/15] fix(ted): require final answers in stateful verifiers --- sites/ted/verify/verify_1.py | 2 ++ sites/ted/verify/verify_4.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/sites/ted/verify/verify_1.py b/sites/ted/verify/verify_1.py index 90ca3e76..0c2be85b 100644 --- a/sites/ted/verify/verify_1.py +++ b/sites/ted/verify/verify_1.py @@ -24,6 +24,8 @@ def main(): a = parse_args() j = Judge('TED--1', a.no_llm) t = load_run(a.run_dir) + fa = final_answer(t) + j.check("final_answer_nonempty", bool(fa.strip()), f"final={fa!r}") after = resolve_db(a.after_db, a.container, "instance") init = resolve_db(a.initial_db, a.container, "instance_seed") note = note_for_saved(after, EMAIL, TITLE_SUB) diff --git a/sites/ted/verify/verify_4.py b/sites/ted/verify/verify_4.py index 8b4d1417..91fbe05c 100644 --- a/sites/ted/verify/verify_4.py +++ b/sites/ted/verify/verify_4.py @@ -21,6 +21,8 @@ def main(): a = parse_args() j = Judge('TED--4', a.no_llm) t = load_run(a.run_dir) + fa = final_answer(t) + j.check("final_answer_nonempty", bool(fa.strip()), f"final={fa!r}") after = resolve_db(a.after_db, a.container, "instance") topic = newsletter_topic_for(after, EMAIL) j.check("nav_login", navigated_to(t, "/login"), f"navigated={navigated_to(t, '/login')}") From 20d1b12435516c74eaf86296f7a7e48b8c2c556e Mon Sep 17 00:00:00 2001 From: manager_of_pre_star_li Date: Sun, 6 Sep 2026 15:35:13 +0800 Subject: [PATCH 09/15] feat(ted): add two filtered comparison tasks --- sites/ted/tasks.jsonl | 2 ++ sites/ted/verify/verify_18.py | 14 ++++++++++++++ sites/ted/verify/verify_19.py | 13 +++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 sites/ted/verify/verify_18.py create mode 100644 sites/ted/verify/verify_19.py diff --git a/sites/ted/tasks.jsonl b/sites/ted/tasks.jsonl index d8b6a125..faf53791 100644 --- a/sites/ted/tasks.jsonl +++ b/sites/ted/tasks.jsonl @@ -16,3 +16,5 @@ {"web_name": "TED", "id": "TED--15", "ques": "Find the music topic talks by Akoth Jumadi and Mr. Lu and by Turkana Sessions. Which one has more views?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_15.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open BOTH music talks — Akoth Jumadi and Mr. Lu, and Turkana Sessions. (2) The answer MUST identify Turkana Sessions as having more views. (3) Final answer non-empty. FAIL if: either talk detail page was not opened; the answer names the wrong talk; empty answer."} {"web_name": "TED", "id": "TED--16", "ques": "Create a new account, save the Peter Steinberger AI agent talk, then confirm it appears under saved talks.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_16.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST register a new account (/register). (2) The agent MUST save Peter Steinberger's talk 'How I created OpenClaw, the breakthrough AI agent'. (3) The agent MUST confirm it on the account page (/account), and the new (non-seed) user MUST have that talk saved. (4) Final answer non-empty. FAIL if: no new account created; the OpenClaw talk not saved by the new user; /account never visited; empty answer."} {"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the month scheduled for the TEDNext 2025 event.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_17.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the events page (/events). (2) The reported month for TEDNext 2025 MUST be November 2025. (3) Final answer non-empty. FAIL if: the events page was never opened; the month is wrong; empty answer."} +{"web_name":"TED","id":"TED--18","ques":"Use the talks filters to find TED2026 AI talks under 20 minutes. Open both Peter Steinberger's 'How I created OpenClaw, the breakthrough AI agent' and Anil Seth's 'Why AI is unlikely to become conscious'. Which talk has more views, and by exactly how many views?","web":"http://localhost:40016/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_18.py","judge_rubric":"FACT CHECKPOINTS: (1) The agent MUST use the talks listing with TED2026, AI, and under-20-minute filters. (2) The agent MUST open both specified talk detail pages. (3) It MUST compare the visible view counts and identify Peter Steinberger's OpenClaw talk as higher by exactly 359862 views. (4) Final answer non-empty. FAIL if any filter/detail/comparison step is missing or the arithmetic is wrong."} +{"web_name":"TED","id":"TED--19","ques":"Use the talks filters to find TEDNext 2025 culture talks under 10 minutes. Open Nayeema Raza's '3 habits to practice curiosity - and escape your phone' and Kate Canales's 'The accidental brilliance of makeshift signs'. Which has more views, and what is the exact difference?","web":"http://localhost:40016/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_19.py","judge_rubric":"FACT CHECKPOINTS: (1) The agent MUST use the talks listing with TEDNext 2025, culture, and under-10-minute filters. (2) The agent MUST open both specified talk detail pages. (3) It MUST identify Nayeema Raza's talk as higher and report the exact visible-count difference of 351132 views. (4) Final answer non-empty. FAIL if filters/details/comparison/arithmetic are missing or incorrect."} diff --git a/sites/ted/verify/verify_18.py b/sites/ted/verify/verify_18.py new file mode 100644 index 00000000..537291ac --- /dev/null +++ b/sites/ted/verify/verify_18.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +"""Verifier for TED--18: filtered TED2026 AI view-count comparison.""" +import os,sys +sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) +from verify_lib import load_run,navigated_to,final_answer,contains_all,extract_ints,Judge,parse_args +PETER='peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent' +ANIL='anil-seth-why-ai-is-unlikely-to-become-conscious' +def main(): + a=parse_args(); j=Judge('TED--18',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url','') for s in t.get('steps',[])) + j.check('nav_filtered_ted2026_ai_under20', '/talks?' in urls and 'event=TED2026' in urls and 'topic=ai' in urls and 'max_minutes=20' in urls, f'urls={urls!r}') + j.check('nav_peter',navigated_to(t,PETER),f'navigated={navigated_to(t,PETER)}'); j.check('nav_anil',navigated_to(t,ANIL),f'navigated={navigated_to(t,ANIL)}') + j.check('answer_peter_higher_difference',contains_all(fa,['Peter','359862']),f'final={fa!r}') + j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() +if __name__=='__main__': main() diff --git a/sites/ted/verify/verify_19.py b/sites/ted/verify/verify_19.py new file mode 100644 index 00000000..6e457ab1 --- /dev/null +++ b/sites/ted/verify/verify_19.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 +"""Verifier for TED--19: filtered TEDNext culture view-count comparison.""" +import os,sys +sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) +from verify_lib import load_run,navigated_to,final_answer,contains_all,Judge,parse_args +NAYEEMA='nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone' +KATE='kate-canales-the-accidental-brilliance-of-makeshift-signs' +def main(): + a=parse_args(); j=Judge('TED--19',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url','') for s in t.get('steps',[])) + j.check('nav_filtered_tednext_culture_under10','/talks?' in urls and 'event=TEDNext' in urls and 'topic=culture' in urls and 'max_minutes=10' in urls,f'urls={urls!r}') + j.check('nav_nayeema',navigated_to(t,NAYEEMA),f'navigated={navigated_to(t,NAYEEMA)}'); j.check('nav_kate',navigated_to(t,KATE),f'navigated={navigated_to(t,KATE)}') + j.check('answer_nayeema_higher_difference',contains_all(fa,['Nayeema','351132']),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() +if __name__=='__main__': main() From 25d49320cc73d33ef117020f1f18085fd8494b41 Mon Sep 17 00:00:00 2001 From: manager_of_pre_star_li Date: Sun, 6 Sep 2026 15:38:30 +0800 Subject: [PATCH 10/15] fix(ted): tighten task quality and verifier semantics --- sites/ted/tasks.jsonl | 16 ++++++------- sites/ted/verify/verify_11.py | 43 ++++++++++----------------------- sites/ted/verify/verify_13.py | 38 ++++++----------------------- sites/ted/verify/verify_17.py | 35 +++++---------------------- sites/ted/verify/verify_3.py | 45 ++++++----------------------------- 5 files changed, 40 insertions(+), 137 deletions(-) diff --git a/sites/ted/tasks.jsonl b/sites/ted/tasks.jsonl index faf53791..86090768 100644 --- a/sites/ted/tasks.jsonl +++ b/sites/ted/tasks.jsonl @@ -1,7 +1,7 @@ {"web_name": "TED", "id": "TED--0", "ques": "Search for talks about AI and open the Anil Seth talk. What is the talk duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_0.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Anil Seth's talk 'Why AI is unlikely to become conscious'. (2) The reported duration MUST be 15 minutes. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the duration is not 15; empty answer."} -{"web_name": "TED", "id": "TED--1", "ques": "Find a TED2026 talk about driverless cars and save it to Alice Johnson's account (email: alice.j@test.com, password: TestPass123!) with the note 'mobility planning'.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_1.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST open the TED2026 driverless-cars talk (Waymo, Tekedra Mawakana & Sal Khan). (3) The talk MUST be saved to Alice's account with a note containing 'mobility planning'. (4) Final answer non-empty. FAIL if: no login; the Waymo talk was not saved; the note does not mention 'mobility planning'; empty answer."} -{"web_name": "TED", "id": "TED--2", "ques": "Browse the design topic and open Debbie Millman's TEDNext 2025 talk that is shorter than 10 minutes. What is its duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_2.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Debbie Millman's TEDNext 2025 talk shorter than 10 minutes ('You got what you wanted. Now what?'). (2) The reported duration MUST be 8 minutes. (3) Final answer non-empty. FAIL if: the correct talk detail page was never opened; the duration is not 8; the 18-minute co-talk was reported instead; empty answer."} -{"web_name": "TED", "id": "TED--3", "ques": "Open the climate and nature playlist and name one talk recorded at the TED Countdown Summit 2025.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_3.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the Climate, Nature, and Conservation playlist. (2) The named talk MUST be one recorded at TED Countdown Summit 2025 that appears in that playlist (e.g. 'Conservation: a love story', 'A cheat sheet for accelerating clean energy'). (3) Final answer non-empty. FAIL if: the playlist was never opened; the named talk is not a TED Countdown Summit 2025 talk in the playlist; empty answer."} +{"web_name": "TED", "id": "TED--1", "ques": "Use the TED2026 event filter or search for TED2026 talks, then find the talk about driverless cars and save it to Alice Johnson's account (email: alice.j@test.com, password: TestPass123!) with the note 'mobility planning'.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_1.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST open the TED2026 driverless-cars talk (Waymo, Tekedra Mawakana & Sal Khan). (3) The talk MUST be saved to Alice's account with a note containing 'mobility planning'. (4) Final answer non-empty. FAIL if: no login; the Waymo talk was not saved; the note does not mention 'mobility planning'; empty answer."} +{"web_name": "TED", "id": "TED--2", "ques": "Search the TED site for 'design', then open Debbie Millman's TEDNext 2025 talk that is shorter than 10 minutes. What is its duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_2.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Debbie Millman's TEDNext 2025 talk shorter than 10 minutes ('You got what you wanted. Now what?'). (2) The reported duration MUST be 8 minutes. (3) Final answer non-empty. FAIL if: the correct talk detail page was never opened; the duration is not 8; the 18-minute co-talk was reported instead; empty answer."} +{"web_name": "TED", "id": "TED--3", "ques": "Open the climate and nature playlist and name one talk recorded at the TED Countdown Summit 2025.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_3.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the Climate, Nature, and Conservation playlist. (2) The final answer MUST name a talk title (not only a speaker) that is recorded at TED Countdown Summit 2025 and appears in that playlist. (3) Final answer non-empty. FAIL if the playlist was never opened, only a speaker is named, or the title is not a qualifying talk."} {"web_name": "TED", "id": "TED--4", "ques": "Log in with the demo account (email: alice.j@test.com, password: TestPass123!) and change the newsletter topic to conservation.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_4.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!) — /login visited. (2) After the run Alice's newsletter topic MUST be 'conservation' (set via /account). (3) Final answer non-empty. FAIL if: no login; the newsletter topic is not 'conservation'; /account never visited; empty answer."} {"web_name": "TED", "id": "TED--5", "ques": "Find the talk by Malala Yousafzai. What is the exact title of the talk?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_5.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Malala Yousafzai's talk detail page (listing cards show only the speaker, so the detail page must be opened to read the title). (2) The reported title MUST be 'What I got wrong about changing the world'. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the title is wrong or missing; empty answer."} {"web_name": "TED", "id": "TED--6", "ques": "Search for 'clean energy' and open the result by Kimiko Hirata. What event is it from?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_6.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Kimiko Hirata's talk 'A cheat sheet for accelerating clean energy'. (2) The reported event MUST be 'TED Countdown Summit 2025'. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the event is wrong; empty answer."} @@ -9,12 +9,12 @@ {"web_name": "TED", "id": "TED--8", "ques": "Compare Alexi Pappas's \"Why I love my bad days\" with Debbie Millman's \"You got what you wanted. Now what?\" Which one is shorter?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_8.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open BOTH Alexi Pappas's 'Why I love my bad days' and Debbie Millman's 'You got what you wanted. Now what?'. (2) The answer MUST identify Alexi Pappas's talk (5 minutes) as the shorter one. (3) Final answer non-empty. FAIL if: either talk detail page was not opened; the answer names the wrong talk as shorter; empty answer."} {"web_name": "TED", "id": "TED--9", "ques": "Find a talk about Parkinson's and save it to Alice Johnson's account (email: alice.j@test.com, password: TestPass123!) with a note for public health review.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_9.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST open Joy Milne's Parkinson's talk ('The nurse who can smell Parkinson's'). (3) The talk MUST be saved to Alice's account with a non-empty note related to public health review. (4) Final answer non-empty. FAIL if: no login; the Parkinson's talk was not saved; the note is empty/unrelated; empty answer."} {"web_name": "TED", "id": "TED--10", "ques": "Open the AI, Society, and the Future playlist. Which included talk discusses a Supreme Court case?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_10.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the 'AI, Society, and the Future' playlist. (2) The named talk MUST be Neal Kumar Katyal's 'What really won the trillion-dollar Supreme Court case'. (3) Final answer non-empty. FAIL if: the playlist was never opened; the wrong talk is named; empty answer."} -{"web_name": "TED", "id": "TED--11", "ques": "Use filters to find TED2026 talks under 10 minutes and open the talk by Maya Higa.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_11.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST use the talks listing/filters (/talks) for TED2026 talks under 10 minutes. (2) The agent MUST open Maya Higa's talk 'The wildlife sanctuary you can visit from anywhere'. (3) Final answer non-empty. FAIL if: the talks listing was never used; Maya Higa's talk detail page was never opened; empty answer."} +{"web_name": "TED", "id": "TED--11", "ques": "Use filters to find TED2026 talks under 10 minutes and open the talk by Maya Higa.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_11.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST use the talks listing filters with event TED2026 and maximum duration 10 minutes. (2) The agent MUST open Maya Higa's talk 'The wildlife sanctuary you can visit from anywhere'. (3) Final answer non-empty. FAIL if either filter is missing, the listing was not used, or Maya's detail page was not opened."} {"web_name": "TED", "id": "TED--12", "ques": "Log in with the demo account (email: alice.j@test.com, password: TestPass123!) and remove one saved talk that is not about AI from the account page.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_12.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!) — /login visited. (2) The agent MUST remove exactly one saved talk that is NOT about AI from /account. (3) After the run Alice MUST have exactly 3 saved talks, with the AI talk ('How I created OpenClaw...') retained and the removed talk not being the AI one. (4) Final answer non-empty. FAIL if: no login; the AI talk was removed; not exactly one talk removed; /account never visited; empty answer."} -{"web_name": "TED", "id": "TED--13", "ques": "Find the science topic page and identify the TEDx talk specifically about wine tasting.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_13.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST reach the wine-tasting talk via the science topic. (2) The identified talk MUST be Qian Janice Wang's 'The art and science of wine tasting' (a TEDx talk). (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the wrong talk (e.g. Joy Milne's Parkinson's talk) is named; empty answer."} +{"web_name": "TED", "id": "TED--13", "ques": "Find the science topic page and identify the TEDx talk specifically about wine tasting.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_13.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST reach the wine-tasting talk via the science topic. (2) The final answer MUST identify the speaker Qian Janice Wang. (3) Final answer non-empty. FAIL if the detail page was never opened or only the title is reported without the speaker."} {"web_name": "TED", "id": "TED--14", "ques": "Search for 'architecture 3D printing' and open the talk about traditional architecture. Who is the speaker?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_14.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST search 'architecture 3D printing' and open the traditional-architecture talk. (2) The reported speaker MUST be Riyad Joucka. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the speaker is wrong (e.g. Kate Canales); empty answer."} {"web_name": "TED", "id": "TED--15", "ques": "Find the music topic talks by Akoth Jumadi and Mr. Lu and by Turkana Sessions. Which one has more views?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_15.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open BOTH music talks — Akoth Jumadi and Mr. Lu, and Turkana Sessions. (2) The answer MUST identify Turkana Sessions as having more views. (3) Final answer non-empty. FAIL if: either talk detail page was not opened; the answer names the wrong talk; empty answer."} {"web_name": "TED", "id": "TED--16", "ques": "Create a new account, save the Peter Steinberger AI agent talk, then confirm it appears under saved talks.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_16.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST register a new account (/register). (2) The agent MUST save Peter Steinberger's talk 'How I created OpenClaw, the breakthrough AI agent'. (3) The agent MUST confirm it on the account page (/account), and the new (non-seed) user MUST have that talk saved. (4) Final answer non-empty. FAIL if: no new account created; the OpenClaw talk not saved by the new user; /account never visited; empty answer."} -{"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the month scheduled for the TEDNext 2025 event.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_17.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the events page (/events). (2) The reported month for TEDNext 2025 MUST be November 2025. (3) Final answer non-empty. FAIL if: the events page was never opened; the month is wrong; empty answer."} -{"web_name":"TED","id":"TED--18","ques":"Use the talks filters to find TED2026 AI talks under 20 minutes. Open both Peter Steinberger's 'How I created OpenClaw, the breakthrough AI agent' and Anil Seth's 'Why AI is unlikely to become conscious'. Which talk has more views, and by exactly how many views?","web":"http://localhost:40016/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_18.py","judge_rubric":"FACT CHECKPOINTS: (1) The agent MUST use the talks listing with TED2026, AI, and under-20-minute filters. (2) The agent MUST open both specified talk detail pages. (3) It MUST compare the visible view counts and identify Peter Steinberger's OpenClaw talk as higher by exactly 359862 views. (4) Final answer non-empty. FAIL if any filter/detail/comparison step is missing or the arithmetic is wrong."} -{"web_name":"TED","id":"TED--19","ques":"Use the talks filters to find TEDNext 2025 culture talks under 10 minutes. Open Nayeema Raza's '3 habits to practice curiosity - and escape your phone' and Kate Canales's 'The accidental brilliance of makeshift signs'. Which has more views, and what is the exact difference?","web":"http://localhost:40016/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_19.py","judge_rubric":"FACT CHECKPOINTS: (1) The agent MUST use the talks listing with TEDNext 2025, culture, and under-10-minute filters. (2) The agent MUST open both specified talk detail pages. (3) It MUST identify Nayeema Raza's talk as higher and report the exact visible-count difference of 351132 views. (4) Final answer non-empty. FAIL if filters/details/comparison/arithmetic are missing or incorrect."} +{"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the month scheduled for the TEDNext 2025 event.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_17.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the events page (/events). (2) The final answer MUST state that TEDNext 2025 is scheduled for November 2025. (3) Final answer non-empty. FAIL if the event is not identified or either November/2025 is missing."} +{"web_name": "TED", "id": "TED--18", "ques": "Use the talks filters to find TED2026 AI talks under 20 minutes. Open both Peter Steinberger's 'How I created OpenClaw, the breakthrough AI agent' and Anil Seth's 'Why AI is unlikely to become conscious'. Which talk has more views, and by exactly how many views?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_18.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST use the talks listing with TED2026, AI, and under-20-minute filters. (2) The agent MUST open both specified talk detail pages. (3) It MUST compare the visible view counts and identify Peter Steinberger's OpenClaw talk as higher by exactly 359862 views. (4) Final answer non-empty. FAIL if any filter/detail/comparison step is missing or the arithmetic is wrong."} +{"web_name": "TED", "id": "TED--19", "ques": "Use the talks filters to find TEDNext 2025 culture talks under 10 minutes. Open Nayeema Raza's '3 habits to practice curiosity - and escape your phone' and Kate Canales's 'The accidental brilliance of makeshift signs'. Which has more views, and what is the exact difference?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_19.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST use the talks listing with TEDNext 2025, culture, and under-10-minute filters. (2) The agent MUST open both specified talk detail pages. (3) It MUST identify Nayeema Raza's talk as higher and report the exact visible-count difference of 351132 views. (4) Final answer non-empty. FAIL if filters/details/comparison/arithmetic are missing or incorrect."} diff --git a/sites/ted/verify/verify_11.py b/sites/ted/verify/verify_11.py index ddc70c6e..91b65e05 100644 --- a/sites/ted/verify/verify_11.py +++ b/sites/ted/verify/verify_11.py @@ -1,33 +1,14 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--11. - -Use the filters to find TED2026 talks under 10 minutes and open the talk by -Maya Higa. This is a navigation task (no factual answer required). - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav filtered /talks listing | nav Maya Higa talk detail -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -SLUG = "maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere" - +"""Verifier for TED--11 filtered TED2026 under-10 navigation.""" +import os,sys +from urllib.parse import parse_qs,urlparse +sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) +from verify_lib import load_run,navigated_to,final_answer,Judge,parse_args +SLUG='maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere' def main(): - a = parse_args() - j = Judge('TED--11', a.no_llm) - t = load_run(a.run_dir) - # Require the filtered listing specifically: "/talks?" (a query string) is - # only produced by the GET filter form, whereas "/talks" alone would also - # match every "/talks/" detail page and make this check vacuous. - j.check("nav_talks_listing", navigated_to(t, "/talks?"), f"navigated={navigated_to(t, '/talks?')}") - j.check("nav_maya_higa", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args(); j=Judge('TED--11',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); ok=False + for s in t.get('steps',[]): + u=s.get('url',''); q=parse_qs(urlparse(u).query) + if urlparse(u).path=='/talks' and q.get('event')==['TED2026'] and q.get('max_minutes')==['10']: ok=True; break + j.check('nav_filtered_ted2026_under10',ok,f'filtered={ok}'); j.check('nav_maya_higa',navigated_to(t,SLUG),f'navigated={navigated_to(t,SLUG)}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() +if __name__=='__main__': main() diff --git a/sites/ted/verify/verify_13.py b/sites/ted/verify/verify_13.py index f2598fa9..2f4990f6 100644 --- a/sites/ted/verify/verify_13.py +++ b/sites/ted/verify/verify_13.py @@ -1,33 +1,9 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--13. - -Find the science topic page and identify the TEDx talk specifically about wine -tasting. -> Qian Janice Wang, 'The art and science of wine tasting'. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav Qian Janice Wang talk detail | answer names the wine-tasting talk / speaker -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -SLUG = "qian-janice-wang-the-art-and-science-of-wine-tasting" - +"""Verifier for TED--13 science wine-tasting speaker.""" +import os,sys +sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) +from verify_lib import load_run,navigated_to,final_answer,contains_all,Judge,parse_args +SLUG='qian-janice-wang-the-art-and-science-of-wine-tasting' def main(): - a = parse_args() - j = Judge('TED--13', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_wine_talk", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") - j.check("answer_wine_talk", - contains_any(fa, ["Qian Janice Wang", "The art and science of wine tasting"]), - f"final={fa!r}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args(); j=Judge('TED--13',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); j.check('nav_wine_talk',navigated_to(t,SLUG),f'navigated={navigated_to(t,SLUG)}'); j.check('answer_speaker_exact',contains_all(fa,['Qian Janice Wang']),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() +if __name__=='__main__': main() diff --git a/sites/ted/verify/verify_17.py b/sites/ted/verify/verify_17.py index 07089b66..240e5178 100644 --- a/sites/ted/verify/verify_17.py +++ b/sites/ted/verify/verify_17.py @@ -1,31 +1,8 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--17. - -Open events and identify the month scheduled for the TEDNext 2025 event. --> November 2025. (Re-anchored from the original 'city', which was Atlanta — a -value that matches the real world and is answerable from prior knowledge. The -month is a mirror-specific synthetic field, so it is only obtainable on-page.) - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav /events | answer names the month 'November' (2025) -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - +"""Verifier for TED--17 TEDNext 2025 month.""" +import os,sys +sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) +from verify_lib import load_run,navigated_to,final_answer,contains_all,Judge,parse_args def main(): - a = parse_args() - j = Judge('TED--17', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_events", navigated_to(t, "/events"), f"navigated={navigated_to(t, '/events')}") - j.check("answer_month_november", contains_all(fa, ["november"]), f"final={fa!r}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args(); j=Judge('TED--17',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); j.check('nav_events',navigated_to(t,'/events'),f'navigated={navigated_to(t,"/events")}'); j.check('answer_tednext_november_2025',contains_all(fa,['november','2025']),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() +if __name__=='__main__': main() diff --git a/sites/ted/verify/verify_3.py b/sites/ted/verify/verify_3.py index cf1cb77e..d32ade19 100644 --- a/sites/ted/verify/verify_3.py +++ b/sites/ted/verify/verify_3.py @@ -1,40 +1,9 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--3. - -Open the climate and nature playlist, name one talk recorded at the TED -Countdown Summit 2025. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav climate-nature-conservation playlist | answer names one of the summit talks in that playlist -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -# The TED Countdown Summit 2025 talks that sit in the climate-nature-conservation -# playlist (titles + speakers accepted). Ground truth frozen from ted.db. -CANDIDATES = [ - "Conservation: a love story", "Elsaphan Njora", - "A cheat sheet for accelerating clean energy", "Kimiko Hirata", - "How to make transportation quieter, cleaner and cheaper", "Doreen Orishaba", - "What China can teach the world about scaling clean energy", "Yin Yu", - "The controversial climate tool funding real change", "Sandeep Roy Choudhury", -] - +"""Verifier for TED--3 playlist title answer.""" +import os,sys +sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) +from verify_lib import load_run,navigated_to,final_answer,contains_any,Judge,parse_args +TITLES=['Conservation: a love story','A cheat sheet for accelerating clean energy','How to make transportation quieter, cleaner and cheaper','What China can teach the world about scaling clean energy','The controversial climate tool funding real change'] def main(): - a = parse_args() - j = Judge('TED--3', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_climate_playlist", navigated_to(t, "playlists/climate-nature-conservation"), - f"navigated={navigated_to(t, 'playlists/climate-nature-conservation')}") - j.check("answer_names_summit_talk", contains_any(fa, CANDIDATES), f"final={fa!r}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args(); j=Judge('TED--3',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); j.check('nav_climate_playlist',navigated_to(t,'playlists/climate-nature-conservation'),f'navigated={navigated_to(t,"playlists/climate-nature-conservation")}'); j.check('answer_names_summit_talk_title',contains_any(fa,TITLES),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() +if __name__=='__main__': main() From 3e2ce44f92dcce7d81bd50c463c60bf24a13ca44 Mon Sep 17 00:00:00 2001 From: manager_of_pre_star_li Date: Sun, 6 Sep 2026 15:40:16 +0800 Subject: [PATCH 11/15] fix(ted): accept recorded after URLs in verifier navigation --- sites/ted/verify/verify_18.py | 2 +- sites/ted/verify/verify_19.py | 2 +- sites/ted/verify/verify_lib.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sites/ted/verify/verify_18.py b/sites/ted/verify/verify_18.py index 537291ac..4c5ec9ec 100644 --- a/sites/ted/verify/verify_18.py +++ b/sites/ted/verify/verify_18.py @@ -6,7 +6,7 @@ PETER='peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent' ANIL='anil-seth-why-ai-is-unlikely-to-become-conscious' def main(): - a=parse_args(); j=Judge('TED--18',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url','') for s in t.get('steps',[])) + a=parse_args(); j=Judge('TED--18',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url') or s.get('url_after') or s.get('url_before') or '' for s in t.get('steps',[])) j.check('nav_filtered_ted2026_ai_under20', '/talks?' in urls and 'event=TED2026' in urls and 'topic=ai' in urls and 'max_minutes=20' in urls, f'urls={urls!r}') j.check('nav_peter',navigated_to(t,PETER),f'navigated={navigated_to(t,PETER)}'); j.check('nav_anil',navigated_to(t,ANIL),f'navigated={navigated_to(t,ANIL)}') j.check('answer_peter_higher_difference',contains_all(fa,['Peter','359862']),f'final={fa!r}') diff --git a/sites/ted/verify/verify_19.py b/sites/ted/verify/verify_19.py index 6e457ab1..a0b6c23f 100644 --- a/sites/ted/verify/verify_19.py +++ b/sites/ted/verify/verify_19.py @@ -6,7 +6,7 @@ NAYEEMA='nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone' KATE='kate-canales-the-accidental-brilliance-of-makeshift-signs' def main(): - a=parse_args(); j=Judge('TED--19',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url','') for s in t.get('steps',[])) + a=parse_args(); j=Judge('TED--19',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url') or s.get('url_after') or s.get('url_before') or '' for s in t.get('steps',[])) j.check('nav_filtered_tednext_culture_under10','/talks?' in urls and 'event=TEDNext' in urls and 'topic=culture' in urls and 'max_minutes=10' in urls,f'urls={urls!r}') j.check('nav_nayeema',navigated_to(t,NAYEEMA),f'navigated={navigated_to(t,NAYEEMA)}'); j.check('nav_kate',navigated_to(t,KATE),f'navigated={navigated_to(t,KATE)}') j.check('answer_nayeema_higher_difference',contains_all(fa,['Nayeema','351132']),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() diff --git a/sites/ted/verify/verify_lib.py b/sites/ted/verify/verify_lib.py index cdbc6b4b..ade708fb 100644 --- a/sites/ted/verify/verify_lib.py +++ b/sites/ted/verify/verify_lib.py @@ -40,7 +40,7 @@ def load_run(run_dir): return traj def step_urls(traj): - return [s.get("url", "") for s in traj.get("steps", [])] + return [s.get("url") or s.get("url_after") or s.get("url_before") or "" for s in traj.get("steps", [])] def navigated_to(traj, substr, times=1): """Deterministic: at least `times` trajectory steps have a URL containing substr.""" From c94cc25b5ec4011c78a1b3cc566eb998c1dd716b Mon Sep 17 00:00:00 2001 From: manager_of_pre_star_li Date: Sun, 6 Sep 2026 15:40:48 +0800 Subject: [PATCH 12/15] fix(ted): normalize comma-separated view differences --- sites/ted/verify/verify_18.py | 2 +- sites/ted/verify/verify_19.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sites/ted/verify/verify_18.py b/sites/ted/verify/verify_18.py index 4c5ec9ec..dc796c11 100644 --- a/sites/ted/verify/verify_18.py +++ b/sites/ted/verify/verify_18.py @@ -9,6 +9,6 @@ def main(): a=parse_args(); j=Judge('TED--18',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url') or s.get('url_after') or s.get('url_before') or '' for s in t.get('steps',[])) j.check('nav_filtered_ted2026_ai_under20', '/talks?' in urls and 'event=TED2026' in urls and 'topic=ai' in urls and 'max_minutes=20' in urls, f'urls={urls!r}') j.check('nav_peter',navigated_to(t,PETER),f'navigated={navigated_to(t,PETER)}'); j.check('nav_anil',navigated_to(t,ANIL),f'navigated={navigated_to(t,ANIL)}') - j.check('answer_peter_higher_difference',contains_all(fa,['Peter','359862']),f'final={fa!r}') + j.check('answer_peter_higher_difference',contains_all(fa,['Peter']) and ('359862' in fa.replace(',','') ),f'final={fa!r}') j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() if __name__=='__main__': main() diff --git a/sites/ted/verify/verify_19.py b/sites/ted/verify/verify_19.py index a0b6c23f..aca6d37c 100644 --- a/sites/ted/verify/verify_19.py +++ b/sites/ted/verify/verify_19.py @@ -9,5 +9,5 @@ def main(): a=parse_args(); j=Judge('TED--19',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url') or s.get('url_after') or s.get('url_before') or '' for s in t.get('steps',[])) j.check('nav_filtered_tednext_culture_under10','/talks?' in urls and 'event=TEDNext' in urls and 'topic=culture' in urls and 'max_minutes=10' in urls,f'urls={urls!r}') j.check('nav_nayeema',navigated_to(t,NAYEEMA),f'navigated={navigated_to(t,NAYEEMA)}'); j.check('nav_kate',navigated_to(t,KATE),f'navigated={navigated_to(t,KATE)}') - j.check('answer_nayeema_higher_difference',contains_all(fa,['Nayeema','351132']),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() + j.check('answer_nayeema_higher_difference',contains_all(fa,['Nayeema']) and ('351132' in fa.replace(',','') ),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() if __name__=='__main__': main() From 3fdc86d57c443aa6def3ed44b5234a120778748a Mon Sep 17 00:00:00 2001 From: manager_of_pre_star_li Date: Sun, 6 Sep 2026 22:07:43 +0800 Subject: [PATCH 13/15] docs(ted): add sanitized review evidence package --- PR-65-DRAFT-PR-BODY.md | 63 +++++ PR-65-STATUS.md | 11 + VERIFIER-LOGIC-REVIEW.md | 35 +++ final-verifier-results.txt | 256 +++++++++++++++++++ full-env-smoke.txt | 27 ++ hf-revision-check.txt | 6 + noop-verifier-results-20.txt | 256 +++++++++++++++++++ remote-pr-check.txt | 9 + review-reports/FINAL-BY-TASK.md | 39 +++ review-reports/INDEPENDENT-CLAUDE-RESULTS.md | 28 ++ review-reports/MAIN-JUDGE-REVIEW.md | 41 +++ review-reports/PR-65-REVIEW-DRAFT.md | 69 +++++ 12 files changed, 840 insertions(+) create mode 100644 PR-65-DRAFT-PR-BODY.md create mode 100644 PR-65-STATUS.md create mode 100644 VERIFIER-LOGIC-REVIEW.md create mode 100644 final-verifier-results.txt create mode 100644 full-env-smoke.txt create mode 100644 hf-revision-check.txt create mode 100644 noop-verifier-results-20.txt create mode 100644 remote-pr-check.txt create mode 100644 review-reports/FINAL-BY-TASK.md create mode 100644 review-reports/INDEPENDENT-CLAUDE-RESULTS.md create mode 100644 review-reports/MAIN-JUDGE-REVIEW.md create mode 100644 review-reports/PR-65-REVIEW-DRAFT.md diff --git a/PR-65-DRAFT-PR-BODY.md b/PR-65-DRAFT-PR-BODY.md new file mode 100644 index 00000000..22d03191 --- /dev/null +++ b/PR-65-DRAFT-PR-BODY.md @@ -0,0 +1,63 @@ +## Summary + +This draft pull request is the reviewer-authored remediation package for [WebHarbor PR #65](https://github.com/aiming-lab/WebHarbor/pull/65). It completes and hardens the TED task grading contract that was reviewed against the remote PR head `065e39a4e1bf33e61902abdfb3e9d35f1e62428e`. + +The original PR remains unchanged. Its remote head contains 18 tasks and 18 verifiers; this draft adds the missing two high-difficulty comparison tasks and carries the fixes required by the Review Environment Skill. Maintainers can review this as a replacement/companion PR before deciding how to land the remediation. + +## What changed + +- Added `TED--18` and `TED--19`, two filtered, multi-page view-count comparison tasks with dedicated deterministic verifiers and judge rubrics. +- Re-anchored narrow tasks on visible TED searches with distractor results and explicit selection steps. +- Tightened verifier contracts for exact filters, required detail/listing navigation, title/speaker/year constraints, non-empty final answers, and state deltas. +- Kept all ground truth inside the reviewer-authored verifier code. `sites/ted/tasks.jsonl` has no `answer` key and contains only the permitted task and grading-contract fields. +- Retained raw Browser Use trajectories, screenshots, and before/after SQLite snapshots in the local review archive. They are intentionally excluded from this public PR because they contain session-sensitive artifacts; public-safe aggregate reports and controls are included below. + +## Review outcome for PR #65 + +The correct status for the current remote PR head is **REQUEST_CHANGES** until equivalent changes are present on that PR. The remote head has the following blocking gaps: + +1. It has 18 rather than the complete 20-task contract. +2. Several tasks omit a broad visible search path or use narrow queries, leaving first-result and distractor-quality risks. +3. Task 11's verifier does not bind the requested TED2026 and duration filters. +4. Task 3 accepts a speaker-only token for a talk-identification task. +5. Task 16 does not require visiting a real `/talks` listing. +6. Task 17 checks `November` without requiring the `TEDNext 2025` event/year. +7. Stateful verifiers do not consistently reject empty final answers. + +## Validation + +- 20/20 clean Luna Browser Use runs passed their deterministic verifiers. +- 20/20 homepage-only, empty-answer no-op controls failed their verifiers (exit code 1). +- 20/20 primary trajectory, screenshot, and database audits passed. +- 20/20 sanitized blind Claude judge packets passed. +- Full local environment smoke passed: control plane healthy, all 17 site ports returned HTTP 200, TED reset was ready, and instance/seed MD5s matched. +- The pinned Hugging Face asset revision `597623a2f32898afa12e3bbeda15520f559aa7c7` was checked directly and returned HTTP 200. + +The full-environment smoke used the existing local `webharbor:ted-review` image. A fresh source rebuild of the exact remote PR head was not established because unrelated local asset locks affected the earlier build; CI should remain the final reproducibility check. + +## Evidence + +- [Final by-task matrix](review-reports/FINAL-BY-TASK.md) +- [Verifier logic review](VERIFIER-LOGIC-REVIEW.md) +- [Primary trajectory audit](review-reports/MAIN-JUDGE-REVIEW.md) +- [Independent blind Claude results](review-reports/INDEPENDENT-CLAUDE-RESULTS.md) +- [Full environment smoke](full-env-smoke.txt) +- [No-op verifier matrix](noop-verifier-results-20.txt) +- Raw per-task trajectories, screenshots, and SQLite snapshots remain in the local review archive and are available for maintainer inspection through an approved channel. +- [Remote PR metadata](remote-pr-check.txt) +- [Hugging Face revision check](hf-revision-check.txt) + +## Review contract + +Each task has one verifier under `sites/ted/verify/verify_.py` and a corresponding `judge_rubric` in `sites/ted/tasks.jsonl`. The verifier is deterministic-first and checks navigation, visible task facts, final output, and SQLite state where applicable. The LLM judge is secondary; no-op failure and state-delta checks are retained as independent controls. + +## Checklist + +- [x] 20 tasks and 20 dedicated verifiers +- [x] No answer key in the agent-facing task rows +- [x] No-op controls fail all verifiers +- [x] Clean positive-control matrix passes all verifiers +- [x] Browser screenshots and operation logs retained in the local review archive +- [x] Public PR excludes session-sensitive raw artifacts +- [x] No remote branch was modified by the original PR review +- [ ] Maintainer review and merge decision pending diff --git a/PR-65-STATUS.md b/PR-65-STATUS.md new file mode 100644 index 00000000..67801055 --- /dev/null +++ b/PR-65-STATUS.md @@ -0,0 +1,11 @@ +# TED PR 65 — Review status + +- Manifest: 20 tasks (`TED--0` … `TED--19`), each with a dedicated verifier and rubric. +- Final gates: 20/20 clean Luna runs, 20/20 deterministic Verifier PASS, 20/20 primary trajectory audit PASS, and 20/20 independent blind Claude PASS. +- No-op control: all 20 homepage-only runs FAIL their verifier. +- Runtime: standalone TED service healthy (`/_health` = 64 talks; `/` and `/talks` = HTTP 200). +- Full local Docker smoke: control plane healthy, all 17 site ports HTTP 200, and TED reset instance/seed MD5s identical; evidence is [`full-env-smoke.txt`](full-env-smoke.txt). +- Source image rebuild was previously affected by unrelated asset locks; the existing local review image completed the full-environment smoke test. +- Raw trajectories, screenshots, and SQLite snapshots remain in the local review archive and are intentionally excluded from this public PR. + +See [`review-reports/FINAL-BY-TASK.md`](review-reports/FINAL-BY-TASK.md), [`review-reports/MAIN-JUDGE-REVIEW.md`](review-reports/MAIN-JUDGE-REVIEW.md), [`VERIFIER-LOGIC-REVIEW.md`](VERIFIER-LOGIC-REVIEW.md), and [`review-reports/INDEPENDENT-CLAUDE-RESULTS.md`](review-reports/INDEPENDENT-CLAUDE-RESULTS.md). diff --git a/VERIFIER-LOGIC-REVIEW.md b/VERIFIER-LOGIC-REVIEW.md new file mode 100644 index 00000000..85647d5e --- /dev/null +++ b/VERIFIER-LOGIC-REVIEW.md @@ -0,0 +1,35 @@ +# TED PR 65 — Verifier 逻辑审查 + +日期:2026-09-06。每个 verifier 均根据对应任务评分标准完成审查,并在最终干净运行和仅访问主页的空操作运行中进行验证。事实依据仍保留在 verifier 代码中;任务条目仅包含问题、verifier 路径和评分标准。 + +## 矩阵 + +| Verifier | 契约审查 | 结果 | +|---:|---|---| +| 0 | 准确导航至 Anil 详情页,时长为 15,且答案非空。 | **PASS** | +| 1 | Waymo 导航、Alice 收藏、准确备注、种子状态中不存在该记录,且答案非空。 | **PASS** | +| 2 | 准确匹配 Debbie 单人演讲详情页和 8 分钟时长;排除合作演讲。 | **PASS** | +| 3 | Climate 播放列表以及符合条件的 Summit 2025 演讲标题;仅回答演讲者不能通过。 | **PASS** | +| 4 | 登录/账户导航,以及已持久化的 conservation 主题。 | **PASS** | +| 5 | Malala 详情页导航和准确标题。 | **PASS** | +| 6 | Kimiko 详情页导航和准确活动。 | **PASS** | +| 7 | 活动/登录导航,以及新增的 TED2026 注册记录。 | **PASS** | +| 8 | 两个准确详情页,以及说明 Alexi 更短的答案。 | **PASS** | +| 9 | 搜索/详情页/登录,以及已持久化的 Joy 收藏和非空公共健康备注。 | **PASS** | +| 10 | 准确播放列表和 Neal Katyal 演讲/标题。 | **PASS** | +| 11 | 准确的 `/talks` 列表路径,包含 `event=TED2026` 和 `max_minutes=20`,然后进入 Maya 详情页。 | **PASS** | +| 12 | 恰好移除一个非 AI 收藏演讲,同时保留 OpenClaw。 | **PASS** | +| 13 | 准确导航至品酒详情页,并准确匹配演讲者 Qian Janice Wang。 | **PASS** | +| 14 | 搜索/详情页导航,以及演讲者 Riyad Joucka。 | **PASS** | +| 15 | 两个准确的音乐详情页,以及关于 Turkana 的比较答案。 | **PASS** | +| 16 | 注册、准确的 `/talks` 列表路径、OpenClaw 详情页/账户导航,以及非种子收藏记录。 | **PASS** | +| 17 | 活动导航,以及答案中同时包含 November 和 2025 标记。 | **PASS** | +| 18 | 准确的 TED2026/AI/max20 列表、两个详情页、准确的界面计数,以及算术答案。 | **PASS** | +| 19 | 准确的 TEDNext/culture/max10 列表、两个详情页、准确的界面计数,以及算术答案。 | **PASS** | + +## 空操作与正向对照 + +- 20 次仅访问主页且答案为空的运行均未改变种子数据库,并且每个 verifier 均返回 `pass: false` / 退出码 1。见 [`noop-verifier-results-20.txt`](noop-verifier-results-20.txt)。 +- 最终干净证据中每个 verifier 均返回 `pass: true` / 退出码 0。见 [`final-verifier-results.txt`](final-verifier-results.txt)。 +- 有状态 verifier 比较明确的 SQLite 前后文件;只读 verifier 要求导航至目标页面并检查答案。 +- 此前在 Verifier 3、11、13、17 和 16 中发现的问题已收紧逻辑并重新运行。 diff --git a/final-verifier-results.txt b/final-verifier-results.txt new file mode 100644 index 00000000..8bf55979 --- /dev/null +++ b/final-verifier-results.txt @@ -0,0 +1,256 @@ +=== task-00 === +{ + "task_id": "TED--0", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_anil_seth: navigated=True", + "[PASS] answer_duration_15: final='15 minutes' ints=[15]", + "[SKIP] answer_duration_llm (--no-llm)" + ] +} +rc=0 +=== task-01 === +{ + "task_id": "TED--1", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] final_answer_nonempty: final=\"Saved Waymo's case for a driverless future to Alice Johnson's TED account with the note mobility planning.\"", + "[PASS] nav_waymo: navigated=True", + "[PASS] db_waymo_saved_by_alice: note='mobility planning'", + "[PASS] db_note_mobility_planning: note='mobility planning'", + "[PASS] db_absent_in_seed: initial_saved=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']" + ] +} +rc=0 +=== task-02 === +{ + "task_id": "TED--2", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_debbie_millman: navigated=True", + "[PASS] answer_duration_8: final='8 minutes' ints=[8]", + "[SKIP] answer_duration_llm (--no-llm)" + ] +} +rc=0 +=== task-03 === +{ + "task_id": "TED--3", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_climate_playlist: navigated=True", + "[PASS] answer_names_summit_talk_title: final='Conservation: a love story'", + "[PASS] final_answer_nonempty: final='Conservation: a love story'" + ] +} +rc=0 +=== task-04 === +{ + "task_id": "TED--4", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] final_answer_nonempty: final='Changed Alice Johnson newsletter topic to conservation.'", + "[PASS] nav_login: navigated=True", + "[PASS] nav_account: navigated=True", + "[PASS] db_newsletter_conservation: newsletter_topic='conservation'" + ] +} +rc=0 +=== task-05 === +{ + "task_id": "TED--5", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_malala: navigated=True", + "[PASS] answer_exact_title: final='The exact title is \u201cWhat I got wrong about changing the world\u201d.'", + "[SKIP] answer_title_llm (--no-llm)" + ] +} +rc=0 +=== task-06 === +{ + "task_id": "TED--6", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_kimiko: navigated=True", + "[PASS] answer_event: final='TED Countdown Summit 2025'" + ] +} +rc=0 +=== task-07 === +{ + "task_id": "TED--7", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_events: navigated=True", + "[PASS] nav_login: navigated=True", + "[PASS] db_registered_ted2026: after_regs=['TED Countdown Summit 2025', 'TED2026']", + "[PASS] db_not_registered_in_seed: initial_regs=['TED Countdown Summit 2025']" + ] +} +rc=0 +=== task-08 === +{ + "task_id": "TED--8", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_alexi: navigated=True", + "[PASS] nav_debbie: navigated=True", + "[PASS] answer_alexi_shorter: final=\"Alexi Pappas's 'Why I love my bad days' is shorter at 5 minutes, versus Debbie Millman's 8 minutes.\"", + "[SKIP] answer_shorter_llm (--no-llm)" + ] +} +rc=0 +=== task-09 === +{ + "task_id": "TED--9", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_parkinson: navigated=True", + "[PASS] db_parkinson_saved_by_alice: note='public health review'", + "[PASS] db_note_present: note='public health review'", + "[PASS] db_absent_in_seed: initial_saved=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']", + "[SKIP] note_public_health_llm (--no-llm)" + ] +} +rc=0 +=== task-10 === +{ + "task_id": "TED--10", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_ai_society: navigated=True", + "[PASS] answer_supreme_court_talk: final=\"Neal Kumar Katyal's talk, 'What really won the trillion-dollar Supreme Court case.'\"" + ] +} +rc=0 +=== task-11 === +{ + "task_id": "TED--11", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_filtered_ted2026_under20: filtered=True", + "[PASS] nav_maya_higa: navigated=True", + "[PASS] final_answer_nonempty: final='Maya Higa \u2014 The wildlife sanctuary you can visit from anywhere.'" + ] +} +rc=0 +=== task-12 === +{ + "task_id": "TED--12", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_login: navigated=True", + "[PASS] nav_account: navigated=True", + "[PASS] db_exactly_one_removed: initial=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?'] after=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?']", + "[PASS] db_ai_talk_retained: after=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?']", + "[PASS] db_removed_not_ai: removed=['The attack on Iran - why now?']" + ] +} +rc=0 +=== task-13 === +{ + "task_id": "TED--13", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_wine_talk: navigated=True", + "[PASS] answer_speaker_exact: final='Qian Janice Wang'", + "[PASS] final_answer_nonempty: final='Qian Janice Wang'" + ] +} +rc=0 +=== task-14 === +{ + "task_id": "TED--14", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_riyad: navigated=True", + "[PASS] answer_speaker: final='Riyad Joucka'" + ] +} +rc=0 +=== task-15 === +{ + "task_id": "TED--15", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_akoth: navigated=True", + "[PASS] nav_turkana: navigated=True", + "[PASS] answer_turkana_more: final='Turkana Sessions has more views: 4,223 versus 2,781 for Akoth Jumadi and Mr. Lu.'", + "[SKIP] answer_more_views_llm (--no-llm)" + ] +} +rc=0 +=== task-16 === +{ + "task_id": "TED--16", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_register: navigated=True", + "[PASS] nav_talks_listing: listing=True", + "[PASS] nav_openclaw_talk: navigated=True", + "[PASS] nav_account: navigated=True", + "[PASS] db_new_user_created: non_seed_users=['']", + "[PASS] db_new_user_saved_openclaw: non_seed_users=['']" + ] +} +rc=0 +=== task-17 === +{ + "task_id": "TED--17", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_events: navigated=True", + "[PASS] answer_tednext_november_2025: final='TEDNext 2025 is scheduled for November 2025.'", + "[PASS] final_answer_nonempty: final='TEDNext 2025 is scheduled for November 2025.'" + ] +} +rc=0 +=== task-18 === +{ + "task_id": "TED--18", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_filtered_ted2026_ai_under20: urls='http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks?event=TED2026&max_minutes=20&topic=ai http://127.0.0.1:41014/talks?event=TED2026&max_minutes=20 http://127.0.0.1:41014/talks?event=TED2026&max_minutes=20 http://127.0.0.1:41014/talks/peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent http://127.0.0.1:41014/talks/peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent http://127.0.0.1:41014/talks?event=TED2026&max_minutes=20 http://127.0.0.1:41014/talks/anil-seth-why-ai-is-unlikely-to-become-conscious http://127.0.0.1:41014/talks/anil-seth-why-ai-is-unlikely-to-become-conscious'", + "[PASS] visible_exact_view_counts: feedback_has_exact_counts=True", + "[PASS] nav_peter: navigated=True", + "[PASS] nav_anil: navigated=True", + "[PASS] answer_peter_higher_difference: final='Peter OpenClaw has 359,862 more views than Anil Seth.'", + "[PASS] final_answer_nonempty: final='Peter OpenClaw has 359,862 more views than Anil Seth.'" + ] +} +rc=0 +=== task-19 === +{ + "task_id": "TED--19", + "pass": true, + "reason": "", + "evidence": [ + "[PASS] nav_filtered_tednext_culture_under10: urls='http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs'", + "[PASS] visible_exact_view_counts: feedback_has_exact_counts=True", + "[PASS] nav_nayeema: navigated=True", + "[PASS] nav_kate: navigated=True", + "[PASS] answer_nayeema_higher_difference: final='Nayeema Raza has 351,132 more views than Kate Canales.'", + "[PASS] final_answer_nonempty: final='Nayeema Raza has 351,132 more views than Kate Canales.'" + ] +} +rc=0 diff --git a/full-env-smoke.txt b/full-env-smoke.txt new file mode 100644 index 00000000..7ee635c7 --- /dev/null +++ b/full-env-smoke.txt @@ -0,0 +1,27 @@ +# 控制平面健康状态: +{"ok":true,"sites":{"allrecipes":{"alive":true,"pid":43,"port":40000},"amazon":{"alive":true,"pid":44,"port":40001},"apple":{"alive":true,"pid":45,"port":40002},"arxiv":{"alive":true,"pid":46,"port":40003},"bbc_news":{"alive":true,"pid":47,"port":40004},"booking":{"alive":true,"pid":48,"port":40005},"cambridge_dictionary":{"alive":true,"pid":55,"port":40012},"coursera":{"alive":true,"pid":56,"port":40013},"espn":{"alive":true,"pid":57,"port":40014},"github":{"alive":true,"pid":49,"port":40006},"google_flights":{"alive":true,"pid":50,"port":40007},"google_map":{"alive":true,"pid":51,"port":40008},"google_search":{"alive":true,"pid":52,"port":40009},"huggingface":{"alive":true,"pid":53,"port":40010},"merriam_webster":{"alive":true,"pid":58,"port":40015},"ted":{"alive":true,"pid":59,"port":40016},"wolfram_alpha":{"alive":true,"pid":54,"port":40011}}} + +# 站点 HTTP 状态: +42000:200 +42001:200 +42002:200 +42003:200 +42004:200 +42005:200 +42006:200 +42007:200 +42008:200 +42009:200 +42010:200 +42011:200 +42012:200 +42013:200 +42014:200 +42015:200 +42016:200 +# TED 重置: +{"pid":224,"ready":true,"site":"ted"} + +# TED 数据库 MD5: +5fcca409b441876f22b8964ff681be91 /opt/WebSyn/ted/instance/ted.db +5fcca409b441876f22b8964ff681be91 /opt/WebSyn/ted/instance_seed/ted.db diff --git a/hf-revision-check.txt b/hf-revision-check.txt new file mode 100644 index 00000000..abdfe806 --- /dev/null +++ b/hf-revision-check.txt @@ -0,0 +1,6 @@ +Hugging Face revision check (read-only) +date: 2026-09-06 +repo: ChilleD/WebHarbor +revision: 597623a2f32898afa12e3bbeda15520f559aa7c7 +url: https://huggingface.co/datasets/ChilleD/WebHarbor/commit/597623a2f32898afa12e3bbeda15520f559aa7c7 +http_status: 200 diff --git a/noop-verifier-results-20.txt b/noop-verifier-results-20.txt new file mode 100644 index 00000000..3b3cff2f --- /dev/null +++ b/noop-verifier-results-20.txt @@ -0,0 +1,256 @@ +=== task-00 === +{ + "task_id": "TED--0", + "pass": false, + "reason": "nav_anil_seth", + "evidence": [ + "[FAIL] nav_anil_seth: navigated=False", + "[FAIL] answer_duration_15: final='' ints=[]", + "[SKIP] answer_duration_llm (--no-llm)" + ] +} +rc=1 +=== task-01 === +{ + "task_id": "TED--1", + "pass": false, + "reason": "final_answer_nonempty", + "evidence": [ + "[FAIL] final_answer_nonempty: final=''", + "[FAIL] nav_waymo: navigated=False", + "[FAIL] db_waymo_saved_by_alice: note=None", + "[FAIL] db_note_mobility_planning: note=None", + "[PASS] db_absent_in_seed: initial_saved=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']" + ] +} +rc=1 +=== task-02 === +{ + "task_id": "TED--2", + "pass": false, + "reason": "nav_debbie_millman", + "evidence": [ + "[FAIL] nav_debbie_millman: navigated=False", + "[FAIL] answer_duration_8: final='' ints=[]", + "[SKIP] answer_duration_llm (--no-llm)" + ] +} +rc=1 +=== task-03 === +{ + "task_id": "TED--3", + "pass": false, + "reason": "nav_climate_playlist", + "evidence": [ + "[FAIL] nav_climate_playlist: navigated=False", + "[FAIL] answer_names_summit_talk_title: final=''", + "[FAIL] final_answer_nonempty: final=''" + ] +} +rc=1 +=== task-04 === +{ + "task_id": "TED--4", + "pass": false, + "reason": "final_answer_nonempty", + "evidence": [ + "[FAIL] final_answer_nonempty: final=''", + "[FAIL] nav_login: navigated=False", + "[FAIL] nav_account: navigated=False", + "[FAIL] db_newsletter_conservation: newsletter_topic='ai'" + ] +} +rc=1 +=== task-05 === +{ + "task_id": "TED--5", + "pass": false, + "reason": "nav_malala", + "evidence": [ + "[FAIL] nav_malala: navigated=False", + "[FAIL] answer_exact_title: final=''", + "[SKIP] answer_title_llm (--no-llm)" + ] +} +rc=1 +=== task-06 === +{ + "task_id": "TED--6", + "pass": false, + "reason": "nav_kimiko", + "evidence": [ + "[FAIL] nav_kimiko: navigated=False", + "[FAIL] answer_event: final=''" + ] +} +rc=1 +=== task-07 === +{ + "task_id": "TED--7", + "pass": false, + "reason": "nav_events", + "evidence": [ + "[FAIL] nav_events: navigated=False", + "[FAIL] nav_login: navigated=False", + "[FAIL] db_registered_ted2026: after_regs=['TED Countdown Summit 2025']", + "[PASS] db_not_registered_in_seed: initial_regs=['TED Countdown Summit 2025']" + ] +} +rc=1 +=== task-08 === +{ + "task_id": "TED--8", + "pass": false, + "reason": "nav_alexi", + "evidence": [ + "[FAIL] nav_alexi: navigated=False", + "[FAIL] nav_debbie: navigated=False", + "[FAIL] answer_alexi_shorter: final=''", + "[SKIP] answer_shorter_llm (--no-llm)" + ] +} +rc=1 +=== task-09 === +{ + "task_id": "TED--9", + "pass": false, + "reason": "nav_parkinson", + "evidence": [ + "[FAIL] nav_parkinson: navigated=False", + "[FAIL] db_parkinson_saved_by_alice: note=None", + "[FAIL] db_note_present: note=None", + "[PASS] db_absent_in_seed: initial_saved=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']", + "[SKIP] note_public_health_llm (--no-llm)" + ] +} +rc=1 +=== task-10 === +{ + "task_id": "TED--10", + "pass": false, + "reason": "nav_ai_society", + "evidence": [ + "[FAIL] nav_ai_society: navigated=False", + "[FAIL] answer_supreme_court_talk: final=''" + ] +} +rc=1 +=== task-11 === +{ + "task_id": "TED--11", + "pass": false, + "reason": "nav_filtered_ted2026_under20", + "evidence": [ + "[FAIL] nav_filtered_ted2026_under20: filtered=False", + "[FAIL] nav_maya_higa: navigated=False", + "[FAIL] final_answer_nonempty: final=''" + ] +} +rc=1 +=== task-12 === +{ + "task_id": "TED--12", + "pass": false, + "reason": "nav_login", + "evidence": [ + "[FAIL] nav_login: navigated=False", + "[FAIL] nav_account: navigated=False", + "[FAIL] db_exactly_one_removed: initial=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?'] after=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']", + "[PASS] db_ai_talk_retained: after=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']", + "[FAIL] db_removed_not_ai: removed=[]" + ] +} +rc=1 +=== task-13 === +{ + "task_id": "TED--13", + "pass": false, + "reason": "nav_wine_talk", + "evidence": [ + "[FAIL] nav_wine_talk: navigated=False", + "[FAIL] answer_speaker_exact: final=''", + "[FAIL] final_answer_nonempty: final=''" + ] +} +rc=1 +=== task-14 === +{ + "task_id": "TED--14", + "pass": false, + "reason": "nav_riyad", + "evidence": [ + "[FAIL] nav_riyad: navigated=False", + "[FAIL] answer_speaker: final=''" + ] +} +rc=1 +=== task-15 === +{ + "task_id": "TED--15", + "pass": false, + "reason": "nav_akoth", + "evidence": [ + "[FAIL] nav_akoth: navigated=False", + "[FAIL] nav_turkana: navigated=False", + "[FAIL] answer_turkana_more: final=''", + "[SKIP] answer_more_views_llm (--no-llm)" + ] +} +rc=1 +=== task-16 === +{ + "task_id": "TED--16", + "pass": false, + "reason": "nav_register", + "evidence": [ + "[FAIL] nav_register: navigated=False", + "[FAIL] nav_talks_listing: listing=False", + "[FAIL] nav_openclaw_talk: navigated=False", + "[FAIL] nav_account: navigated=False", + "[FAIL] db_new_user_created: non_seed_users=[]", + "[FAIL] db_new_user_saved_openclaw: non_seed_users=[]" + ] +} +rc=1 +=== task-17 === +{ + "task_id": "TED--17", + "pass": false, + "reason": "nav_events", + "evidence": [ + "[FAIL] nav_events: navigated=False", + "[FAIL] answer_tednext_november_2025: final=''", + "[FAIL] final_answer_nonempty: final=''" + ] +} +rc=1 +=== task-18 === +{ + "task_id": "TED--18", + "pass": false, + "reason": "nav_filtered_ted2026_ai_under20", + "evidence": [ + "[FAIL] nav_filtered_ted2026_ai_under20: urls='http://127.0.0.1:41014/'", + "[FAIL] visible_exact_view_counts: feedback_has_exact_counts=False", + "[FAIL] nav_peter: navigated=False", + "[FAIL] nav_anil: navigated=False", + "[FAIL] answer_peter_higher_difference: final=''", + "[FAIL] final_answer_nonempty: final=''" + ] +} +rc=1 +=== task-19 === +{ + "task_id": "TED--19", + "pass": false, + "reason": "nav_filtered_tednext_culture_under10", + "evidence": [ + "[FAIL] nav_filtered_tednext_culture_under10: urls='http://127.0.0.1:41014/'", + "[FAIL] visible_exact_view_counts: feedback_has_exact_counts=False", + "[FAIL] nav_nayeema: navigated=False", + "[FAIL] nav_kate: navigated=False", + "[FAIL] answer_nayeema_higher_difference: final=''", + "[FAIL] final_answer_nonempty: final=''" + ] +} +rc=1 diff --git a/remote-pr-check.txt b/remote-pr-check.txt new file mode 100644 index 00000000..355e4cc3 --- /dev/null +++ b/remote-pr-check.txt @@ -0,0 +1,9 @@ +GitHub PR metadata check (read-only via Clash 7890) +date: 2026-09-06 +repo: aiming-lab/WebHarbor +pr: 65 +state: OPEN +title: Add TED task verifiers (site by @shanjiaming, verifiers by reviewer) +base_sha: 7269be89c93b72cf1d8596b4fde65ba1c7453c15 +head_sha: 065e39a4e1bf33e61902abdfb3e9d35f1e62428e +url: https://github.com/aiming-lab/WebHarbor/pull/65 diff --git a/review-reports/FINAL-BY-TASK.md b/review-reports/FINAL-BY-TASK.md new file mode 100644 index 00000000..5ac445e0 --- /dev/null +++ b/review-reports/FINAL-BY-TASK.md @@ -0,0 +1,39 @@ +# TED PR 65 — 按任务最终报告 + +审查日期:2026-09-06。验收需要通过四道关卡:重置后的干净 Luna Browser Use 运行、该运行的确定性 Verifier PASS、主代理轨迹/截图/数据库审计,以及独立 Claude 盲审 PASS。未执行远程推送。 + +| 任务 | Luna 干净运行 | Verifier | 主审计 | Claude 盲审 | 最终结论 | 证据 / 发现 | +|---:|---|---|---|---|---|---| +| 0 | PASS | PASS | PASS | PASS | **PASS** | 搜索 → Anil Seth 详情页;回答 15 分钟。只读操作;3 种视口。 | +| 1 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “future”(11 个结果)→ Waymo 详情页 → Alice 收藏并添加备注。状态差异仅包含预期的 Waymo 收藏。 | +| 2 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “design”(7 个结果)→ Debbie TEDNext 详情页;8 分钟。选择了正确的单人演讲;排除了合作演讲。 | +| 3 | PASS | PASS | PASS | PASS | **PASS** | Climate/Nature/Conservation 播放列表 → 符合条件的 Summit 演讲标题。Verifier 要求标题中包含符合条件的标记。 | +| 4 | PASS | PASS | PASS | PASS | **PASS** | Alice 登录 → 账户新闻通讯主题 conservation。个人资料更新已持久化到数据库。 | +| 5 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “world”(19 个结果)→ Malala 详情页;标题完全匹配。标题来自详情页。 | +| 6 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “climate”(6 个结果)→ Kimiko 详情页/活动。活动信息有页面依据。 | +| 7 | PASS | PASS | PASS | PASS | **PASS** | Alice 登录 → 活动 → 注册 TED2026。注册记录是在种子状态基础上新增的。 | +| 8 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “change”(27 个结果)找到 Alexi;搜索 “design”(7 个结果)找到 Debbie;进行比较。两者的详情页和时长均已记录。 | +| 9 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “health”(6 个结果)→ Joy 详情页 → Alice 收藏并添加备注。状态差异包含预期备注。 | +| 10 | PASS | PASS | PASS | PASS | **PASS** | AI/Society 播放列表 → Neal Katyal 的最高法院演讲。播放列表和详情页均已打开。 | +| 11 | PASS | PASS | PASS | PASS | **PASS** | 可见演讲列表 → TED2026 + 最长 20 分钟 → Maya 详情页。Verifier 绑定了活动/最长时长查询及准确的列表路径。 | +| 12 | PASS | PASS | PASS | PASS | **PASS** | Alice 账户 → 移除一个非 AI 收藏演讲。恰好移除一个;保留 OpenClaw。 | +| 13 | PASS | PASS | PASS | PASS | **PASS** | Science 主题 → 品酒详情页;Qian Janice Wang。演讲者严格匹配。 | +| 14 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “technology”(17 个结果)→ Riyad 建筑详情页。演讲者信息有页面依据。 | +| 15 | PASS | PASS | PASS | PASS | **PASS** | 两个音乐详情页 → Turkana 的观看次数更多。比较结果以两个页面为依据。 | +| 16 | PASS | PASS | PASS | PASS | **PASS** | 注册新用户 → 可见的 /talks 列表 → 收藏 OpenClaw → 账户。已确认新用户数据库记录和收藏记录。 | +| 17 | PASS | PASS | PASS | PASS | **PASS** | 活动 → TEDNext 2025;2025 年 11 月。回答必须同时包含月份和年份。 | +| 18 | PASS | PASS | PASS | PASS | **PASS** | TED2026 + AI + 最长 20 分钟 → Peter/Anil 详情页;差值准确。界面显示准确观看次数 551,544 和 191,682。 | +| 19 | PASS | PASS | PASS | PASS | **PASS** | TEDNext 2025 + culture + 最长 10 分钟 → Nayeema/Kate 详情页;差值准确。界面显示准确观看次数 554,563 和 203,431。 | + +## 各关卡统计 + +- 清单中的任务:**20** 个,ID 从 `TED--0` 到 `TED--19`,每个任务都有专用 verifier 和评分标准。 +- Luna 干净运行:**20/20**;原始 SQLite 文件、轨迹日志和截图保留在本地审查归档中。 +- 确定性 verifier 矩阵:**20/20 PASS**;输出见 [`final-verifier-results.txt`](../final-verifier-results.txt)。 +- 空操作对照:仅访问主页且答案为空的运行 **20/20 FAIL**;输出见 [`noop-verifier-results-20.txt`](../noop-verifier-results-20.txt)。 +- 独立 Claude 盲审:**20/20 PASS**。其仅收到脱敏后的任务/评分标准、轨迹、公开数据库摘要,没有收到 verifier 或源代码实现。 +- 主代理审计:**20/20 PASS**,审查了轨迹语义、已采集的 1440/390/320 视口截图,以及数据库前后差异。 + +完整环境 smoke 测试在本地 `webharbor:ted-review` 镜像上通过:控制平面 `/health` 状态正常,全部 17 个站点端口均返回 HTTP 200,TED 重置生成了字节级完全相同的 instance/seed MD5。最终 TED 任务运行使用了获授权的独立服务(`/_health` 报告 64 个演讲;`/`、`/talks` 返回 HTTP 200),因此准确计数代码变更得到了直接执行。本次 smoke 测试无需重新构建源代码;此前的源代码构建受到无关资源锁的影响。 + +原始截图、轨迹和 SQLite 快照保留在本地审查归档中,未包含在此公共分支;本报告和聚合日志可公开审查。 diff --git a/review-reports/INDEPENDENT-CLAUDE-RESULTS.md b/review-reports/INDEPENDENT-CLAUDE-RESULTS.md new file mode 100644 index 00000000..dcb3589f --- /dev/null +++ b/review-reports/INDEPENDENT-CLAUDE-RESULTS.md @@ -0,0 +1,28 @@ +# 独立 Claude 盲审——最终矩阵 + +日期:2026-09-06。每个评审仅查看对应的任务问题/评分标准、规范化轨迹、公开的前后状态摘要和本地任务包。电子邮件/密码已脱敏;未发送截图及实现/verifier 文件。 + +| 任务 | 判定 | 置信度 | +|---:|---|---| +| 0 | **PASS** | high | +| 1 | **PASS** | 0.97 | +| 2 | **PASS** | high | +| 3 | **PASS** | 0.9 | +| 4 | **PASS** | high | +| 5 | **PASS** | 0.95 | +| 6 | **PASS** | 0.95 | +| 7 | **PASS** | medium-high | +| 8 | **PASS** | high | +| 9 | **PASS** | 0.95 | +| 10 | **PASS** | high | +| 11 | **PASS** | 0.92 | +| 12 | **PASS** | high | +| 13 | **PASS** | 0.95 | +| 14 | **PASS** | 0.88 | +| 15 | **PASS** | 0.98 | +| 16 | **PASS** | high | +| 17 | **PASS** | 0.97 | +| 18 | **PASS** | 0.72 | +| 19 | **PASS** | high | + +20 个任务全部返回 PASS。原始评审包仍保存在仓库之外的 本地审查归档 下;仓库中仅保存这份脱敏后的结果摘要。 diff --git a/review-reports/MAIN-JUDGE-REVIEW.md b/review-reports/MAIN-JUDGE-REVIEW.md new file mode 100644 index 00000000..0c6851c2 --- /dev/null +++ b/review-reports/MAIN-JUDGE-REVIEW.md @@ -0,0 +1,41 @@ +# TED PR 65 — Main-agent trajectory and visual audit + +Date: 2026-09-06. I reviewed the final Luna trajectories, every task’s before/after DB, recorded page feedback, and the saved screenshots. The primary audit treats the browser interaction as the source of truth and checks for direct URL shortcuts, incomplete state transitions, answer leaks, missing screenshots, and responsive overflow. + +| Task | Audit result | What was checked | +|---:|---|---| +| 0 | **PASS** | Search → Anil Seth detail; 15-minute answer; Read-only; 3 viewports. | +| 1 | **PASS** | Search “future” (11 results) → Waymo detail → Alice save + note; State delta contains only intended Waymo save. | +| 2 | **PASS** | Search “design” (7 results) → Debbie TEDNext detail; 8 minutes; Correct solo talk selected; co-talk excluded. | +| 3 | **PASS** | Climate/Nature/Conservation playlist → qualifying Summit talk title; Verifier requires a qualifying title token. | +| 4 | **PASS** | Alice login → account newsletter topic conservation; Profile update persisted in DB. | +| 5 | **PASS** | Search “world” (19 results) → Malala detail; exact title; Detail page supplies title. | +| 6 | **PASS** | Search “climate” (6 results) → Kimiko detail/event; Event is page-grounded. | +| 7 | **PASS** | Alice login → Events → TED2026 registration; Registration added from seed state. | +| 8 | **PASS** | Search “change” (27 results) Alexi; “design” (7 results) Debbie; compare; Both details and durations recorded. | +| 9 | **PASS** | Search “health” (6 results) → Joy detail → Alice save + note; State delta contains intended note. | +| 10 | **PASS** | AI/Society playlist → Neal Katyal Supreme Court talk; Playlist and detail both opened. | +| 11 | **PASS** | Visible talks listing → TED2026 + max 20 → Maya detail; Verifier binds event/max query and exact listing path. | +| 12 | **PASS** | Alice account → remove one non-AI saved talk; Exactly one removed; OpenClaw retained. | +| 13 | **PASS** | Science topic → wine-tasting detail; Qian Janice Wang; Exact speaker check. | +| 14 | **PASS** | Search “technology” (17 results) → Riyad architecture detail; Speaker page-grounded. | +| 15 | **PASS** | Both music details → Turkana has more views; Comparison grounded on both pages. | +| 16 | **PASS** | Register new user → visible /talks listing → OpenClaw save → account; New-user DB row and saved row confirmed. | +| 17 | **PASS** | Events → TEDNext 2025; November 2025; Answer requires both month and year. | +| 18 | **PASS** | TED2026 + AI + max 20 → Peter/Anil details; exact difference; UI exposes exact counts 551,544 and 191,682. | +| 19 | **PASS** | TEDNext 2025 + culture + max 10 → Nayeema/Kate details; exact difference; UI exposes exact counts 554,563 and 203,431. | + +## Findings resolved during review + +- Added Tasks 18 and 19 as filtered, two-detail exact view-count comparisons. +- Reworked narrow queries for Tasks 1, 5, 6, 8, 9, and 14 to provide distractors and require selection. +- Task 2’s clean run was redone from seed after an earlier contaminated after-state. +- Task 8 was rerun with visible result selection for both talks after earlier incomplete/wrong-query attempts. +- Task 11 was rerun with an exact click from the filtered TED2026 listing; its verifier now binds event and max-duration query parameters. +- Task 16 was rerun with visible `/talks` listing navigation; its verifier now recognizes the exact listing path without confusing detail URLs. +- Tasks 18 and 19 now record exact comma-separated UI view counts; `views_label` exposes the public integer count needed for arithmetic. +- Earlier attempts remain under each task’s `attempt-*` directory where applicable; the final trajectory and screenshots identify the accepted run. + +## Visual/runtime audit + +The final evidence includes real TED imagery and populated cards/details. Captured viewport widths include 1440, 390, and 320 pixels; screenshots were checked for horizontal overflow using recorded scroll-width feedback and image dimensions. The standalone TED service remained healthy (`/_health`, 64 talks; `/` and `/talks` HTTP 200). A full local Docker smoke run also passed: the control plane was healthy, all 17 site ports returned HTTP 200, and TED reset produced matching instance/seed MD5s. Earlier source rebuild attempts encountered unrelated asset locks; the existing review image supplied the complete environment smoke test. diff --git a/review-reports/PR-65-REVIEW-DRAFT.md b/review-reports/PR-65-REVIEW-DRAFT.md new file mode 100644 index 00000000..864813f9 --- /dev/null +++ b/review-reports/PR-65-REVIEW-DRAFT.md @@ -0,0 +1,69 @@ +# Review: TED (PR #65) + +**Recommendation: REQUEST_CHANGES** + +This draft reviews the remote PR head `065e39a4e1bf33e61902abdfb3e9d35f1e62428e`. The local review branch is ahead at `b8d3bc3c2c734dfb649e733fc50051271065b91`; those remediation commits and their evidence have **not** been pushed to GitHub, so they do not change the status of PR #65. The read-only remote metadata is recorded in [`remote-pr-check.txt`](../remote-pr-check.txt). + +## Mechanical checks: PASS locally; remote-head rebuild unverified + +- [x] The existing local review image passed control-plane health, all 17 site-port HTTP-200 checks, TED reset, and byte-identical `instance`/`instance_seed` MD5 checks. See [`full-env-smoke.txt`](../full-env-smoke.txt). +- [x] The local TED service was healthy (`/_health` reported 64 talks; `/` and `/talks` returned HTTP 200). +- [x] The pinned asset revision `597623a2f32898afa12e3bbeda15520f559aa7c7` is present in [`.assets-revision`](../.assets-revision) and its Hugging Face commit page returned HTTP 200. See [`hf-revision-check.txt`](../hf-revision-check.txt). +- [ ] A fresh source-image rebuild from the exact remote PR head was not established in this sandbox. The full smoke result above is for the local review image and must not be treated as a remote-head reproducibility result. + +## Visual fidelity: PASS on the local review run + +- [x] Playwright screenshots cover the homepage, search/listing, detail, auth/account, and responsive 1440/390/320px views. +- [x] No blocking placeholder-image, blank-page, navigation, or responsive-overflow issue was observed in the audited TED flows. +- [x] Evidence is retained per task in the local review archive; this public remediation branch includes only the safe aggregate reports and controls. + +## Functional depth: PASS on the local remediation run + +- [x] Search, topic/playlist, event, detail, login, registration, account update, save/note, remove, and comparison flows were exercised through the visible UI. +- [x] The local run produced 20/20 clean Luna trajectories and 20/20 deterministic verifier passes. See [`FINAL-BY-TASK.md`](FINAL-BY-TASK.md) and [`final-verifier-results.txt`](../final-verifier-results.txt). +- [x] The 20 homepage-only empty-answer controls all failed their verifiers (20/20, exit code 1). See [`noop-verifier-results-20.txt`](../noop-verifier-results-20.txt). + +## Task quality: FAIL on the remote PR head + +The remote PR contains 18 tasks and 18 verifiers, while the reviewed contract requires the complete 20-task suite. The original task set also leaves several quality and grading gaps: + +- Tasks 1, 2, 5, 8, 9, and 14 do not consistently force a sufficiently broad visible search path. Several original queries are narrow or omit search entirely, creating first-result/shortcut risk and failing the distractor standard. +- Task 11 says TED2026 and under 10 minutes, but its remote verifier only checks a `/talks?` visit plus Maya Higa navigation; it does not bind the event and duration query parameters. +- Task 3's remote verifier accepts speaker-only tokens even though the task asks for a talk; the answer contract should require a qualifying talk title or an explicitly complete identification. +- Task 13's task, rubric, and verifier should be aligned on whether the required output is the complete talk identity or the speaker; the remote verifier currently accepts either token without making that contract explicit. +- Stateful tasks should consistently reject an empty final answer and require the visible navigation that establishes the requested action. The remote stateful verifiers for Tasks 1 and 4 lacked that final-answer gate; Task 16 lacked a real `/talks` listing requirement. +- Task 17's remote verifier checks only `November`; it does not require the `TEDNext 2025` event/year, so a month-only answer can pass. + +These are benchmark-quality issues rather than cosmetic preferences: they permit under-navigation, incomplete answers, or a verifier pass without satisfying all task constraints. + +## Grading contract authored in the local remediation branch + +The local reviewer remediation now contains 20 one-to-one task verifiers and rubrics (`TED--0` through `TED--19`), with no `answer` key in `tasks.jsonl`. Ground truth remains in verifier code. The revised contract adds two filtered comparison tasks, broadens the visible search paths, binds exact filter parameters, tightens title/speaker/year checks, requires non-empty final answers, and preserves state-delta checks. + +The local controls are: + +- 20/20 clean Luna runs → deterministic verifier PASS; +- 20/20 homepage-only no-op runs → verifier FAIL; +- 20/20 primary trajectory/screenshot/DB audits → PASS; +- 20/20 sanitized blind Claude judge packets → PASS. + +See [`VERIFIER-LOGIC-REVIEW.md`](../VERIFIER-LOGIC-REVIEW.md), [`MAIN-JUDGE-REVIEW.md`](MAIN-JUDGE-REVIEW.md), and [`INDEPENDENT-CLAUDE-RESULTS.md`](INDEPENDENT-CLAUDE-RESULTS.md). Raw screenshots, trajectories, and database snapshots remain in the local review archive and are intentionally not published. + +## Required fixes before approval + +1. Bring the PR to the complete 20-task contract by adding the two filtered comparison tasks and dedicated verifiers/rubrics. +2. Re-anchor the narrow/underspecified tasks on visible searches with at least six results, near misses, and multiple sub-categories; ensure no task is solvable by the first result alone. +3. Make every verifier enforce every task constraint: exact filter parameters for Task 11, complete talk identification for Task 3/13, TEDNext plus year for Task 17, visible listing navigation for Task 16, and non-empty final answers for stateful tasks. +4. Re-run the clean Luna, deterministic verifier, no-op, primary trajectory, and blind-judge gates from the updated PR head, then attach the resulting screenshots and logs. + +## Local evidence and provenance + +- Local remediation commits: `d5504eb`, `90303bb`, `fbba792`, `654e9f5`, `8d7fcab`, `c38b012`, `fa4a33d`, `b8d3bc3`. +- Local final matrix: [`FINAL-BY-TASK.md`](FINAL-BY-TASK.md). +- Verifier logic audit: [`VERIFIER-LOGIC-REVIEW.md`](../VERIFIER-LOGIC-REVIEW.md). +- Full environment smoke: [`full-env-smoke.txt`](../full-env-smoke.txt). +- This is a public remediation draft; no GitHub review comment has been posted. + + From 491f0197042c6bfb07bf256d564c0611b7d0ba80 Mon Sep 17 00:00:00 2001 From: raibows Date: Sun, 6 Sep 2026 21:15:23 -0700 Subject: [PATCH 14/15] fix: harden and validate TED mirror --- AGENTS.md | 12 +- CLAUDE.md | 2 +- CONTRIBUTING.md | 2 +- Dockerfile | 3 +- PR-65-DRAFT-PR-BODY.md | 63 -- PR-65-STATUS.md | 11 - README.md | 8 +- VERIFIER-LOGIC-REVIEW.md | 35 -- agent_demo/README.md | 2 +- final-verifier-results.txt | 256 -------- full-env-smoke.txt | 27 - hf-revision-check.txt | 6 - noop-verifier-results-20.txt | 256 -------- remote-pr-check.txt | 9 - review-reports/FINAL-BY-TASK.md | 39 -- review-reports/INDEPENDENT-CLAUDE-RESULTS.md | 28 - review-reports/MAIN-JUDGE-REVIEW.md | 41 -- review-reports/PR-65-REVIEW-DRAFT.md | 69 --- review-reports/PR-85-FINAL-AUDIT.md | 39 ++ scripts/fetch_assets.sh | 20 +- sites/ted/app.py | 306 +++++----- sites/ted/migrate_seed.py | 26 + sites/ted/requirements.txt | 1 + sites/ted/scraped_data/.gitkeep | 0 sites/ted/static/css/main.css | 13 +- sites/ted/tasks.jsonl | 40 +- sites/ted/templates/_talk_card.html | 6 +- sites/ted/templates/account.html | 14 +- sites/ted/templates/base.html | 7 +- sites/ted/templates/events.html | 3 +- sites/ted/templates/index.html | 6 +- sites/ted/templates/login.html | 5 +- sites/ted/templates/register.html | 9 +- sites/ted/templates/talk_detail.html | 18 +- sites/ted/templates/talks.html | 17 +- sites/ted/verify/test_app.py | 66 ++ sites/ted/verify/test_environment_quality.py | 52 ++ sites/ted/verify/test_verifiers.py | 139 +++++ sites/ted/verify/verify_0.py | 38 +- sites/ted/verify/verify_1.py | 53 +- sites/ted/verify/verify_10.py | 36 +- sites/ted/verify/verify_11.py | 16 +- sites/ted/verify/verify_12.py | 56 +- sites/ted/verify/verify_13.py | 11 +- sites/ted/verify/verify_14.py | 34 +- sites/ted/verify/verify_15.py | 40 +- sites/ted/verify/verify_16.py | 53 +- sites/ted/verify/verify_17.py | 10 +- sites/ted/verify/verify_18.py | 16 +- sites/ted/verify/verify_19.py | 15 +- sites/ted/verify/verify_2.py | 38 +- sites/ted/verify/verify_3.py | 14 +- sites/ted/verify/verify_4.py | 44 +- sites/ted/verify/verify_5.py | 37 +- sites/ted/verify/verify_6.py | 33 +- sites/ted/verify/verify_7.py | 50 +- sites/ted/verify/verify_8.py | 40 +- sites/ted/verify/verify_9.py | 53 +- sites/ted/verify/verify_lib.py | 604 +++++++++++-------- 59 files changed, 1081 insertions(+), 1866 deletions(-) delete mode 100644 PR-65-DRAFT-PR-BODY.md delete mode 100644 PR-65-STATUS.md delete mode 100644 VERIFIER-LOGIC-REVIEW.md delete mode 100644 final-verifier-results.txt delete mode 100644 full-env-smoke.txt delete mode 100644 hf-revision-check.txt delete mode 100644 noop-verifier-results-20.txt delete mode 100644 remote-pr-check.txt delete mode 100644 review-reports/FINAL-BY-TASK.md delete mode 100644 review-reports/INDEPENDENT-CLAUDE-RESULTS.md delete mode 100644 review-reports/MAIN-JUDGE-REVIEW.md delete mode 100644 review-reports/PR-65-REVIEW-DRAFT.md create mode 100644 review-reports/PR-85-FINAL-AUDIT.md create mode 100644 sites/ted/migrate_seed.py delete mode 100644 sites/ted/scraped_data/.gitkeep create mode 100644 sites/ted/verify/test_app.py create mode 100644 sites/ted/verify/test_environment_quality.py create mode 100644 sites/ted/verify/test_verifiers.py diff --git a/AGENTS.md b/AGENTS.md index 8f6e45b8..14e45939 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ A coding agent (Claude Code, Cursor, Aider, Codex, ...) is reading this. Read on ## What it is -19 Flask mirror websites (Amazon, GitHub, BBC News, ...) packaged into one Docker image, plus a control plane on `:8101` for resetting per-site state. Used as a deterministic offline environment for web-agent benchmarks. ~3 GB image. +20 Flask mirror websites (Amazon, GitHub, BBC News, ...) packaged into one Docker image, plus a control plane on `:8101` for resetting per-site state. Used as a deterministic offline environment for web-agent benchmarks. ~3 GB image. Two repos: - **code** (this one) — Flask apps, control plane, scripts. @@ -48,17 +48,17 @@ Inside the image, sites live at `/opt/WebSyn//`. The path predates the ren # fresh clone ./scripts/fetch_assets.sh # pulls assets from HF ./scripts/build.sh # docker build -t webharbor:dev . -docker run -d -p 8101:8101 -p 40000-40018:40000-40018 webharbor:dev +docker run -d -p 8101:8101 -p 40000-40019:40000-40019 webharbor:dev ``` Or use the published image directly: ```bash -docker run -d -p 8101:8101 -p 40000-40018:40000-40018 \ +docker run -d -p 8101:8101 -p 40000-40019:40000-40019 \ battalion7244/webharbor:latest ``` -Sites are on `40000`-`40018` in the order declared by `SITES=( ... )` in `websyn_start.sh`. Control plane: +Sites are on `40000`-`40019` in the order declared by `SITES=( ... )` in `websyn_start.sh`. Control plane: | Method | Path | Purpose | |--------|---------------------|-------------------------------------------| @@ -136,13 +136,13 @@ python3 -m py_compile sites//app.py # 3. run on alt ports (don't collide with anything you already have running) docker run -d --rm --name wh-test \ - -p 8201:8101 -p 41000-41018:40000-40018 webharbor:dev + -p 8201:8101 -p 41000-41019:40000-40019 webharbor:dev # 4. control plane healthy, all sites alive curl -s http://localhost:8201/health | python3 -m json.tool | head # 5. every site renders 200 -for p in $(seq 41000 41018); do +for p in $(seq 41000 41019); do curl -so /dev/null -w "$p:%{http_code}\n" http://localhost:$p/ done diff --git a/CLAUDE.md b/CLAUDE.md index 3f6b490e..5dcf2283 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,4 +16,4 @@ The full agent guide is loaded above via `@AGENTS.md`. The notes below apply onl ## Existing containers -If a container is already running on `:8101` / `:40000-40018`, treat it as the user's working environment — don't `docker stop` or `docker rm` it without explicit confirmation. Spin up your test container under a different name on alt ports (`:8201`, `:41000-41018`). +If a container is already running on `:8101` / `:40000-40019`, treat it as the user's working environment — don't `docker stop` or `docker rm` it without explicit confirmation. Spin up your test container under a different name on alt ports (`:8201`, `:41000-41019`). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 07a7248b..6dce56be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,7 +24,7 @@ git clone https://github.com//webharbor && cd webharbor ./scripts/fetch_assets.sh # pull current assets ./scripts/new_site.py mywebsite # OR edit an existing site ./scripts/build.sh && docker run -d --rm \ - -p 8101:8101 -p 40000-40018:40000-40018 webharbor:dev + -p 8101:8101 -p 40000-40019:40000-40019 webharbor:dev # iterate locally... ./scripts/extract_assets.sh ../webharbor-static-pr/ # split assets out diff --git a/Dockerfile b/Dockerfile index 91383cb7..51f61ce7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,9 +31,10 @@ COPY sites/ /opt/WebSyn/ # IKEA's seed is reproducibly materialized from the tracked source catalog so code-only content fixes do not require an asset-repository write. Product images still come from the pinned asset bundle. RUN cd /opt/WebSyn/ikea && PYTHONHASHSEED=0 python seed_data.py && rm -rf instance -# Apply tracked, idempotent Phys.org and Target data corrections to their seed assets. +# Apply tracked, idempotent data corrections to downloaded seed assets. RUN cd /opt/WebSyn/phys_org && PYTHONHASHSEED=0 python migrate_seed.py && rm -rf instance RUN cd /opt/WebSyn/target && PYTHONHASHSEED=0 python migrate_seed.py && rm -rf instance +RUN cd /opt/WebSyn/ted && PYTHONHASHSEED=0 python migrate_seed.py && rm -rf instance COPY websyn_start.sh /opt/websyn_start.sh COPY control_server.py /opt/control_server.py diff --git a/PR-65-DRAFT-PR-BODY.md b/PR-65-DRAFT-PR-BODY.md deleted file mode 100644 index 22d03191..00000000 --- a/PR-65-DRAFT-PR-BODY.md +++ /dev/null @@ -1,63 +0,0 @@ -## Summary - -This draft pull request is the reviewer-authored remediation package for [WebHarbor PR #65](https://github.com/aiming-lab/WebHarbor/pull/65). It completes and hardens the TED task grading contract that was reviewed against the remote PR head `065e39a4e1bf33e61902abdfb3e9d35f1e62428e`. - -The original PR remains unchanged. Its remote head contains 18 tasks and 18 verifiers; this draft adds the missing two high-difficulty comparison tasks and carries the fixes required by the Review Environment Skill. Maintainers can review this as a replacement/companion PR before deciding how to land the remediation. - -## What changed - -- Added `TED--18` and `TED--19`, two filtered, multi-page view-count comparison tasks with dedicated deterministic verifiers and judge rubrics. -- Re-anchored narrow tasks on visible TED searches with distractor results and explicit selection steps. -- Tightened verifier contracts for exact filters, required detail/listing navigation, title/speaker/year constraints, non-empty final answers, and state deltas. -- Kept all ground truth inside the reviewer-authored verifier code. `sites/ted/tasks.jsonl` has no `answer` key and contains only the permitted task and grading-contract fields. -- Retained raw Browser Use trajectories, screenshots, and before/after SQLite snapshots in the local review archive. They are intentionally excluded from this public PR because they contain session-sensitive artifacts; public-safe aggregate reports and controls are included below. - -## Review outcome for PR #65 - -The correct status for the current remote PR head is **REQUEST_CHANGES** until equivalent changes are present on that PR. The remote head has the following blocking gaps: - -1. It has 18 rather than the complete 20-task contract. -2. Several tasks omit a broad visible search path or use narrow queries, leaving first-result and distractor-quality risks. -3. Task 11's verifier does not bind the requested TED2026 and duration filters. -4. Task 3 accepts a speaker-only token for a talk-identification task. -5. Task 16 does not require visiting a real `/talks` listing. -6. Task 17 checks `November` without requiring the `TEDNext 2025` event/year. -7. Stateful verifiers do not consistently reject empty final answers. - -## Validation - -- 20/20 clean Luna Browser Use runs passed their deterministic verifiers. -- 20/20 homepage-only, empty-answer no-op controls failed their verifiers (exit code 1). -- 20/20 primary trajectory, screenshot, and database audits passed. -- 20/20 sanitized blind Claude judge packets passed. -- Full local environment smoke passed: control plane healthy, all 17 site ports returned HTTP 200, TED reset was ready, and instance/seed MD5s matched. -- The pinned Hugging Face asset revision `597623a2f32898afa12e3bbeda15520f559aa7c7` was checked directly and returned HTTP 200. - -The full-environment smoke used the existing local `webharbor:ted-review` image. A fresh source rebuild of the exact remote PR head was not established because unrelated local asset locks affected the earlier build; CI should remain the final reproducibility check. - -## Evidence - -- [Final by-task matrix](review-reports/FINAL-BY-TASK.md) -- [Verifier logic review](VERIFIER-LOGIC-REVIEW.md) -- [Primary trajectory audit](review-reports/MAIN-JUDGE-REVIEW.md) -- [Independent blind Claude results](review-reports/INDEPENDENT-CLAUDE-RESULTS.md) -- [Full environment smoke](full-env-smoke.txt) -- [No-op verifier matrix](noop-verifier-results-20.txt) -- Raw per-task trajectories, screenshots, and SQLite snapshots remain in the local review archive and are available for maintainer inspection through an approved channel. -- [Remote PR metadata](remote-pr-check.txt) -- [Hugging Face revision check](hf-revision-check.txt) - -## Review contract - -Each task has one verifier under `sites/ted/verify/verify_.py` and a corresponding `judge_rubric` in `sites/ted/tasks.jsonl`. The verifier is deterministic-first and checks navigation, visible task facts, final output, and SQLite state where applicable. The LLM judge is secondary; no-op failure and state-delta checks are retained as independent controls. - -## Checklist - -- [x] 20 tasks and 20 dedicated verifiers -- [x] No answer key in the agent-facing task rows -- [x] No-op controls fail all verifiers -- [x] Clean positive-control matrix passes all verifiers -- [x] Browser screenshots and operation logs retained in the local review archive -- [x] Public PR excludes session-sensitive raw artifacts -- [x] No remote branch was modified by the original PR review -- [ ] Maintainer review and merge decision pending diff --git a/PR-65-STATUS.md b/PR-65-STATUS.md deleted file mode 100644 index 67801055..00000000 --- a/PR-65-STATUS.md +++ /dev/null @@ -1,11 +0,0 @@ -# TED PR 65 — Review status - -- Manifest: 20 tasks (`TED--0` … `TED--19`), each with a dedicated verifier and rubric. -- Final gates: 20/20 clean Luna runs, 20/20 deterministic Verifier PASS, 20/20 primary trajectory audit PASS, and 20/20 independent blind Claude PASS. -- No-op control: all 20 homepage-only runs FAIL their verifier. -- Runtime: standalone TED service healthy (`/_health` = 64 talks; `/` and `/talks` = HTTP 200). -- Full local Docker smoke: control plane healthy, all 17 site ports HTTP 200, and TED reset instance/seed MD5s identical; evidence is [`full-env-smoke.txt`](full-env-smoke.txt). -- Source image rebuild was previously affected by unrelated asset locks; the existing local review image completed the full-environment smoke test. -- Raw trajectories, screenshots, and SQLite snapshots remain in the local review archive and are intentionally excluded from this public PR. - -See [`review-reports/FINAL-BY-TASK.md`](review-reports/FINAL-BY-TASK.md), [`review-reports/MAIN-JUDGE-REVIEW.md`](review-reports/MAIN-JUDGE-REVIEW.md), [`VERIFIER-LOGIC-REVIEW.md`](VERIFIER-LOGIC-REVIEW.md), and [`review-reports/INDEPENDENT-CLAUDE-RESULTS.md`](review-reports/INDEPENDENT-CLAUDE-RESULTS.md). diff --git a/README.md b/README.md index acf7bf0e..28457c4e 100644 --- a/README.md +++ b/README.md @@ -36,17 +36,17 @@ WebHarbor takes a different approach. We leverage coding agent (e.g., Claude Cod - **Deep features unlocked** — carts, checkouts, accounts, all fully testable - **Evolving** — harder tasks drive richer mirrors; the environment grows with agents - **RL-ready** — sub-second database resets between rollouts -- **Community-driven** — 19 sites today, scaling to 100+ together +- **Community-driven** — 20 sites today, scaling to 100+ together ## 🚀 Quickstart One command to run all web environments: ```bash -docker run -p 8101:8101 -p 40000-40018:40000-40018 battalion7244/webharbor:latest +docker run -p 8101:8101 -p 40000-40019:40000-40019 battalion7244/webharbor:latest ``` -Then point your agent at `http://localhost:40000` through `http://localhost:40018` to explore 19 local mirrors of webvoyager sites: `Allrecipes, Amazon, Apple, ArXiv, BBC News, Booking, GitHub, Google Flights, Google Maps, Google Search, Hugging Face, Wolfram Alpha, Cambridge Dictionary, Coursera, ESPN, Merriam-Webster, IKEA, Phys.org, and Target`. +Then point your agent at `http://localhost:40000` through `http://localhost:40019` to explore 20 local mirrors of webvoyager sites: `Allrecipes, Amazon, Apple, ArXiv, BBC News, Booking, GitHub, Google Flights, Google Maps, Google Search, Hugging Face, Wolfram Alpha, Cambridge Dictionary, Coursera, ESPN, Merriam-Webster, IKEA, Phys.org, Target, and TED`. For sub-second reset between rollouts, expose the control plane and call `/reset/`: @@ -65,7 +65,7 @@ git clone https://github.com/aiming-lab/WebHarbor && cd WebHarbor ## 🤝 Contribute -We have built 18 high-quality mirrors covering the [WebVoyager](https://github.com/MinorJerry/WebVoyager) benchmark. The next goal is **100+ sites**, covering everything in [Online-Mind2Web](https://huggingface.co/datasets/osunlp/Online-Mind2Web). We are inviting the community to build this together. +We have built 20 high-quality mirrors covering the [WebVoyager](https://github.com/MinorJerry/WebVoyager) benchmark. The next goal is **100+ sites**, covering everything in [Online-Mind2Web](https://huggingface.co/datasets/osunlp/Online-Mind2Web). We are inviting the community to build this together. There are two ways to join the author list: diff --git a/VERIFIER-LOGIC-REVIEW.md b/VERIFIER-LOGIC-REVIEW.md deleted file mode 100644 index 85647d5e..00000000 --- a/VERIFIER-LOGIC-REVIEW.md +++ /dev/null @@ -1,35 +0,0 @@ -# TED PR 65 — Verifier 逻辑审查 - -日期:2026-09-06。每个 verifier 均根据对应任务评分标准完成审查,并在最终干净运行和仅访问主页的空操作运行中进行验证。事实依据仍保留在 verifier 代码中;任务条目仅包含问题、verifier 路径和评分标准。 - -## 矩阵 - -| Verifier | 契约审查 | 结果 | -|---:|---|---| -| 0 | 准确导航至 Anil 详情页,时长为 15,且答案非空。 | **PASS** | -| 1 | Waymo 导航、Alice 收藏、准确备注、种子状态中不存在该记录,且答案非空。 | **PASS** | -| 2 | 准确匹配 Debbie 单人演讲详情页和 8 分钟时长;排除合作演讲。 | **PASS** | -| 3 | Climate 播放列表以及符合条件的 Summit 2025 演讲标题;仅回答演讲者不能通过。 | **PASS** | -| 4 | 登录/账户导航,以及已持久化的 conservation 主题。 | **PASS** | -| 5 | Malala 详情页导航和准确标题。 | **PASS** | -| 6 | Kimiko 详情页导航和准确活动。 | **PASS** | -| 7 | 活动/登录导航,以及新增的 TED2026 注册记录。 | **PASS** | -| 8 | 两个准确详情页,以及说明 Alexi 更短的答案。 | **PASS** | -| 9 | 搜索/详情页/登录,以及已持久化的 Joy 收藏和非空公共健康备注。 | **PASS** | -| 10 | 准确播放列表和 Neal Katyal 演讲/标题。 | **PASS** | -| 11 | 准确的 `/talks` 列表路径,包含 `event=TED2026` 和 `max_minutes=20`,然后进入 Maya 详情页。 | **PASS** | -| 12 | 恰好移除一个非 AI 收藏演讲,同时保留 OpenClaw。 | **PASS** | -| 13 | 准确导航至品酒详情页,并准确匹配演讲者 Qian Janice Wang。 | **PASS** | -| 14 | 搜索/详情页导航,以及演讲者 Riyad Joucka。 | **PASS** | -| 15 | 两个准确的音乐详情页,以及关于 Turkana 的比较答案。 | **PASS** | -| 16 | 注册、准确的 `/talks` 列表路径、OpenClaw 详情页/账户导航,以及非种子收藏记录。 | **PASS** | -| 17 | 活动导航,以及答案中同时包含 November 和 2025 标记。 | **PASS** | -| 18 | 准确的 TED2026/AI/max20 列表、两个详情页、准确的界面计数,以及算术答案。 | **PASS** | -| 19 | 准确的 TEDNext/culture/max10 列表、两个详情页、准确的界面计数,以及算术答案。 | **PASS** | - -## 空操作与正向对照 - -- 20 次仅访问主页且答案为空的运行均未改变种子数据库,并且每个 verifier 均返回 `pass: false` / 退出码 1。见 [`noop-verifier-results-20.txt`](noop-verifier-results-20.txt)。 -- 最终干净证据中每个 verifier 均返回 `pass: true` / 退出码 0。见 [`final-verifier-results.txt`](final-verifier-results.txt)。 -- 有状态 verifier 比较明确的 SQLite 前后文件;只读 verifier 要求导航至目标页面并检查答案。 -- 此前在 Verifier 3、11、13、17 和 16 中发现的问题已收紧逻辑并重新运行。 diff --git a/agent_demo/README.md b/agent_demo/README.md index 2b775eac..a8a1a5c2 100644 --- a/agent_demo/README.md +++ b/agent_demo/README.md @@ -19,7 +19,7 @@ export OPENAI_BASE_URL=https://api.openai.com/v1 # or your Azure / vLLM endpoi ## Run a task -WebHarbor must already be running locally (`docker run -p 8101:8101 -p 40000-40018:40000-40018 battalion7244/webharbor:latest`). +WebHarbor must already be running locally (`docker run -p 8101:8101 -p 40000-40019:40000-40019 battalion7244/webharbor:latest`). Run a single task from a site's `tasks.jsonl`: diff --git a/final-verifier-results.txt b/final-verifier-results.txt deleted file mode 100644 index 8bf55979..00000000 --- a/final-verifier-results.txt +++ /dev/null @@ -1,256 +0,0 @@ -=== task-00 === -{ - "task_id": "TED--0", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_anil_seth: navigated=True", - "[PASS] answer_duration_15: final='15 minutes' ints=[15]", - "[SKIP] answer_duration_llm (--no-llm)" - ] -} -rc=0 -=== task-01 === -{ - "task_id": "TED--1", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] final_answer_nonempty: final=\"Saved Waymo's case for a driverless future to Alice Johnson's TED account with the note mobility planning.\"", - "[PASS] nav_waymo: navigated=True", - "[PASS] db_waymo_saved_by_alice: note='mobility planning'", - "[PASS] db_note_mobility_planning: note='mobility planning'", - "[PASS] db_absent_in_seed: initial_saved=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']" - ] -} -rc=0 -=== task-02 === -{ - "task_id": "TED--2", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_debbie_millman: navigated=True", - "[PASS] answer_duration_8: final='8 minutes' ints=[8]", - "[SKIP] answer_duration_llm (--no-llm)" - ] -} -rc=0 -=== task-03 === -{ - "task_id": "TED--3", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_climate_playlist: navigated=True", - "[PASS] answer_names_summit_talk_title: final='Conservation: a love story'", - "[PASS] final_answer_nonempty: final='Conservation: a love story'" - ] -} -rc=0 -=== task-04 === -{ - "task_id": "TED--4", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] final_answer_nonempty: final='Changed Alice Johnson newsletter topic to conservation.'", - "[PASS] nav_login: navigated=True", - "[PASS] nav_account: navigated=True", - "[PASS] db_newsletter_conservation: newsletter_topic='conservation'" - ] -} -rc=0 -=== task-05 === -{ - "task_id": "TED--5", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_malala: navigated=True", - "[PASS] answer_exact_title: final='The exact title is \u201cWhat I got wrong about changing the world\u201d.'", - "[SKIP] answer_title_llm (--no-llm)" - ] -} -rc=0 -=== task-06 === -{ - "task_id": "TED--6", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_kimiko: navigated=True", - "[PASS] answer_event: final='TED Countdown Summit 2025'" - ] -} -rc=0 -=== task-07 === -{ - "task_id": "TED--7", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_events: navigated=True", - "[PASS] nav_login: navigated=True", - "[PASS] db_registered_ted2026: after_regs=['TED Countdown Summit 2025', 'TED2026']", - "[PASS] db_not_registered_in_seed: initial_regs=['TED Countdown Summit 2025']" - ] -} -rc=0 -=== task-08 === -{ - "task_id": "TED--8", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_alexi: navigated=True", - "[PASS] nav_debbie: navigated=True", - "[PASS] answer_alexi_shorter: final=\"Alexi Pappas's 'Why I love my bad days' is shorter at 5 minutes, versus Debbie Millman's 8 minutes.\"", - "[SKIP] answer_shorter_llm (--no-llm)" - ] -} -rc=0 -=== task-09 === -{ - "task_id": "TED--9", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_parkinson: navigated=True", - "[PASS] db_parkinson_saved_by_alice: note='public health review'", - "[PASS] db_note_present: note='public health review'", - "[PASS] db_absent_in_seed: initial_saved=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']", - "[SKIP] note_public_health_llm (--no-llm)" - ] -} -rc=0 -=== task-10 === -{ - "task_id": "TED--10", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_ai_society: navigated=True", - "[PASS] answer_supreme_court_talk: final=\"Neal Kumar Katyal's talk, 'What really won the trillion-dollar Supreme Court case.'\"" - ] -} -rc=0 -=== task-11 === -{ - "task_id": "TED--11", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_filtered_ted2026_under20: filtered=True", - "[PASS] nav_maya_higa: navigated=True", - "[PASS] final_answer_nonempty: final='Maya Higa \u2014 The wildlife sanctuary you can visit from anywhere.'" - ] -} -rc=0 -=== task-12 === -{ - "task_id": "TED--12", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_login: navigated=True", - "[PASS] nav_account: navigated=True", - "[PASS] db_exactly_one_removed: initial=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?'] after=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?']", - "[PASS] db_ai_talk_retained: after=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?']", - "[PASS] db_removed_not_ai: removed=['The attack on Iran - why now?']" - ] -} -rc=0 -=== task-13 === -{ - "task_id": "TED--13", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_wine_talk: navigated=True", - "[PASS] answer_speaker_exact: final='Qian Janice Wang'", - "[PASS] final_answer_nonempty: final='Qian Janice Wang'" - ] -} -rc=0 -=== task-14 === -{ - "task_id": "TED--14", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_riyad: navigated=True", - "[PASS] answer_speaker: final='Riyad Joucka'" - ] -} -rc=0 -=== task-15 === -{ - "task_id": "TED--15", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_akoth: navigated=True", - "[PASS] nav_turkana: navigated=True", - "[PASS] answer_turkana_more: final='Turkana Sessions has more views: 4,223 versus 2,781 for Akoth Jumadi and Mr. Lu.'", - "[SKIP] answer_more_views_llm (--no-llm)" - ] -} -rc=0 -=== task-16 === -{ - "task_id": "TED--16", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_register: navigated=True", - "[PASS] nav_talks_listing: listing=True", - "[PASS] nav_openclaw_talk: navigated=True", - "[PASS] nav_account: navigated=True", - "[PASS] db_new_user_created: non_seed_users=['']", - "[PASS] db_new_user_saved_openclaw: non_seed_users=['']" - ] -} -rc=0 -=== task-17 === -{ - "task_id": "TED--17", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_events: navigated=True", - "[PASS] answer_tednext_november_2025: final='TEDNext 2025 is scheduled for November 2025.'", - "[PASS] final_answer_nonempty: final='TEDNext 2025 is scheduled for November 2025.'" - ] -} -rc=0 -=== task-18 === -{ - "task_id": "TED--18", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_filtered_ted2026_ai_under20: urls='http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks http://127.0.0.1:41014/talks?event=TED2026&max_minutes=20&topic=ai http://127.0.0.1:41014/talks?event=TED2026&max_minutes=20 http://127.0.0.1:41014/talks?event=TED2026&max_minutes=20 http://127.0.0.1:41014/talks/peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent http://127.0.0.1:41014/talks/peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent http://127.0.0.1:41014/talks?event=TED2026&max_minutes=20 http://127.0.0.1:41014/talks/anil-seth-why-ai-is-unlikely-to-become-conscious http://127.0.0.1:41014/talks/anil-seth-why-ai-is-unlikely-to-become-conscious'", - "[PASS] visible_exact_view_counts: feedback_has_exact_counts=True", - "[PASS] nav_peter: navigated=True", - "[PASS] nav_anil: navigated=True", - "[PASS] answer_peter_higher_difference: final='Peter OpenClaw has 359,862 more views than Anil Seth.'", - "[PASS] final_answer_nonempty: final='Peter OpenClaw has 359,862 more views than Anil Seth.'" - ] -} -rc=0 -=== task-19 === -{ - "task_id": "TED--19", - "pass": true, - "reason": "", - "evidence": [ - "[PASS] nav_filtered_tednext_culture_under10: urls='http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks?event=TEDNext+2025&max_minutes=10&topic=culture http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs http://127.0.0.1:41014/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs'", - "[PASS] visible_exact_view_counts: feedback_has_exact_counts=True", - "[PASS] nav_nayeema: navigated=True", - "[PASS] nav_kate: navigated=True", - "[PASS] answer_nayeema_higher_difference: final='Nayeema Raza has 351,132 more views than Kate Canales.'", - "[PASS] final_answer_nonempty: final='Nayeema Raza has 351,132 more views than Kate Canales.'" - ] -} -rc=0 diff --git a/full-env-smoke.txt b/full-env-smoke.txt deleted file mode 100644 index 7ee635c7..00000000 --- a/full-env-smoke.txt +++ /dev/null @@ -1,27 +0,0 @@ -# 控制平面健康状态: -{"ok":true,"sites":{"allrecipes":{"alive":true,"pid":43,"port":40000},"amazon":{"alive":true,"pid":44,"port":40001},"apple":{"alive":true,"pid":45,"port":40002},"arxiv":{"alive":true,"pid":46,"port":40003},"bbc_news":{"alive":true,"pid":47,"port":40004},"booking":{"alive":true,"pid":48,"port":40005},"cambridge_dictionary":{"alive":true,"pid":55,"port":40012},"coursera":{"alive":true,"pid":56,"port":40013},"espn":{"alive":true,"pid":57,"port":40014},"github":{"alive":true,"pid":49,"port":40006},"google_flights":{"alive":true,"pid":50,"port":40007},"google_map":{"alive":true,"pid":51,"port":40008},"google_search":{"alive":true,"pid":52,"port":40009},"huggingface":{"alive":true,"pid":53,"port":40010},"merriam_webster":{"alive":true,"pid":58,"port":40015},"ted":{"alive":true,"pid":59,"port":40016},"wolfram_alpha":{"alive":true,"pid":54,"port":40011}}} - -# 站点 HTTP 状态: -42000:200 -42001:200 -42002:200 -42003:200 -42004:200 -42005:200 -42006:200 -42007:200 -42008:200 -42009:200 -42010:200 -42011:200 -42012:200 -42013:200 -42014:200 -42015:200 -42016:200 -# TED 重置: -{"pid":224,"ready":true,"site":"ted"} - -# TED 数据库 MD5: -5fcca409b441876f22b8964ff681be91 /opt/WebSyn/ted/instance/ted.db -5fcca409b441876f22b8964ff681be91 /opt/WebSyn/ted/instance_seed/ted.db diff --git a/hf-revision-check.txt b/hf-revision-check.txt deleted file mode 100644 index abdfe806..00000000 --- a/hf-revision-check.txt +++ /dev/null @@ -1,6 +0,0 @@ -Hugging Face revision check (read-only) -date: 2026-09-06 -repo: ChilleD/WebHarbor -revision: 597623a2f32898afa12e3bbeda15520f559aa7c7 -url: https://huggingface.co/datasets/ChilleD/WebHarbor/commit/597623a2f32898afa12e3bbeda15520f559aa7c7 -http_status: 200 diff --git a/noop-verifier-results-20.txt b/noop-verifier-results-20.txt deleted file mode 100644 index 3b3cff2f..00000000 --- a/noop-verifier-results-20.txt +++ /dev/null @@ -1,256 +0,0 @@ -=== task-00 === -{ - "task_id": "TED--0", - "pass": false, - "reason": "nav_anil_seth", - "evidence": [ - "[FAIL] nav_anil_seth: navigated=False", - "[FAIL] answer_duration_15: final='' ints=[]", - "[SKIP] answer_duration_llm (--no-llm)" - ] -} -rc=1 -=== task-01 === -{ - "task_id": "TED--1", - "pass": false, - "reason": "final_answer_nonempty", - "evidence": [ - "[FAIL] final_answer_nonempty: final=''", - "[FAIL] nav_waymo: navigated=False", - "[FAIL] db_waymo_saved_by_alice: note=None", - "[FAIL] db_note_mobility_planning: note=None", - "[PASS] db_absent_in_seed: initial_saved=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']" - ] -} -rc=1 -=== task-02 === -{ - "task_id": "TED--2", - "pass": false, - "reason": "nav_debbie_millman", - "evidence": [ - "[FAIL] nav_debbie_millman: navigated=False", - "[FAIL] answer_duration_8: final='' ints=[]", - "[SKIP] answer_duration_llm (--no-llm)" - ] -} -rc=1 -=== task-03 === -{ - "task_id": "TED--3", - "pass": false, - "reason": "nav_climate_playlist", - "evidence": [ - "[FAIL] nav_climate_playlist: navigated=False", - "[FAIL] answer_names_summit_talk_title: final=''", - "[FAIL] final_answer_nonempty: final=''" - ] -} -rc=1 -=== task-04 === -{ - "task_id": "TED--4", - "pass": false, - "reason": "final_answer_nonempty", - "evidence": [ - "[FAIL] final_answer_nonempty: final=''", - "[FAIL] nav_login: navigated=False", - "[FAIL] nav_account: navigated=False", - "[FAIL] db_newsletter_conservation: newsletter_topic='ai'" - ] -} -rc=1 -=== task-05 === -{ - "task_id": "TED--5", - "pass": false, - "reason": "nav_malala", - "evidence": [ - "[FAIL] nav_malala: navigated=False", - "[FAIL] answer_exact_title: final=''", - "[SKIP] answer_title_llm (--no-llm)" - ] -} -rc=1 -=== task-06 === -{ - "task_id": "TED--6", - "pass": false, - "reason": "nav_kimiko", - "evidence": [ - "[FAIL] nav_kimiko: navigated=False", - "[FAIL] answer_event: final=''" - ] -} -rc=1 -=== task-07 === -{ - "task_id": "TED--7", - "pass": false, - "reason": "nav_events", - "evidence": [ - "[FAIL] nav_events: navigated=False", - "[FAIL] nav_login: navigated=False", - "[FAIL] db_registered_ted2026: after_regs=['TED Countdown Summit 2025']", - "[PASS] db_not_registered_in_seed: initial_regs=['TED Countdown Summit 2025']" - ] -} -rc=1 -=== task-08 === -{ - "task_id": "TED--8", - "pass": false, - "reason": "nav_alexi", - "evidence": [ - "[FAIL] nav_alexi: navigated=False", - "[FAIL] nav_debbie: navigated=False", - "[FAIL] answer_alexi_shorter: final=''", - "[SKIP] answer_shorter_llm (--no-llm)" - ] -} -rc=1 -=== task-09 === -{ - "task_id": "TED--9", - "pass": false, - "reason": "nav_parkinson", - "evidence": [ - "[FAIL] nav_parkinson: navigated=False", - "[FAIL] db_parkinson_saved_by_alice: note=None", - "[FAIL] db_note_present: note=None", - "[PASS] db_absent_in_seed: initial_saved=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']", - "[SKIP] note_public_health_llm (--no-llm)" - ] -} -rc=1 -=== task-10 === -{ - "task_id": "TED--10", - "pass": false, - "reason": "nav_ai_society", - "evidence": [ - "[FAIL] nav_ai_society: navigated=False", - "[FAIL] answer_supreme_court_talk: final=''" - ] -} -rc=1 -=== task-11 === -{ - "task_id": "TED--11", - "pass": false, - "reason": "nav_filtered_ted2026_under20", - "evidence": [ - "[FAIL] nav_filtered_ted2026_under20: filtered=False", - "[FAIL] nav_maya_higa: navigated=False", - "[FAIL] final_answer_nonempty: final=''" - ] -} -rc=1 -=== task-12 === -{ - "task_id": "TED--12", - "pass": false, - "reason": "nav_login", - "evidence": [ - "[FAIL] nav_login: navigated=False", - "[FAIL] nav_account: navigated=False", - "[FAIL] db_exactly_one_removed: initial=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?'] after=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']", - "[PASS] db_ai_talk_retained: after=['3 habits to practice curiosity - and escape your phone', 'How I created OpenClaw, the breakthrough AI agent', 'Is luck random - or can you cultivate it?', 'The attack on Iran - why now?']", - "[FAIL] db_removed_not_ai: removed=[]" - ] -} -rc=1 -=== task-13 === -{ - "task_id": "TED--13", - "pass": false, - "reason": "nav_wine_talk", - "evidence": [ - "[FAIL] nav_wine_talk: navigated=False", - "[FAIL] answer_speaker_exact: final=''", - "[FAIL] final_answer_nonempty: final=''" - ] -} -rc=1 -=== task-14 === -{ - "task_id": "TED--14", - "pass": false, - "reason": "nav_riyad", - "evidence": [ - "[FAIL] nav_riyad: navigated=False", - "[FAIL] answer_speaker: final=''" - ] -} -rc=1 -=== task-15 === -{ - "task_id": "TED--15", - "pass": false, - "reason": "nav_akoth", - "evidence": [ - "[FAIL] nav_akoth: navigated=False", - "[FAIL] nav_turkana: navigated=False", - "[FAIL] answer_turkana_more: final=''", - "[SKIP] answer_more_views_llm (--no-llm)" - ] -} -rc=1 -=== task-16 === -{ - "task_id": "TED--16", - "pass": false, - "reason": "nav_register", - "evidence": [ - "[FAIL] nav_register: navigated=False", - "[FAIL] nav_talks_listing: listing=False", - "[FAIL] nav_openclaw_talk: navigated=False", - "[FAIL] nav_account: navigated=False", - "[FAIL] db_new_user_created: non_seed_users=[]", - "[FAIL] db_new_user_saved_openclaw: non_seed_users=[]" - ] -} -rc=1 -=== task-17 === -{ - "task_id": "TED--17", - "pass": false, - "reason": "nav_events", - "evidence": [ - "[FAIL] nav_events: navigated=False", - "[FAIL] answer_tednext_november_2025: final=''", - "[FAIL] final_answer_nonempty: final=''" - ] -} -rc=1 -=== task-18 === -{ - "task_id": "TED--18", - "pass": false, - "reason": "nav_filtered_ted2026_ai_under20", - "evidence": [ - "[FAIL] nav_filtered_ted2026_ai_under20: urls='http://127.0.0.1:41014/'", - "[FAIL] visible_exact_view_counts: feedback_has_exact_counts=False", - "[FAIL] nav_peter: navigated=False", - "[FAIL] nav_anil: navigated=False", - "[FAIL] answer_peter_higher_difference: final=''", - "[FAIL] final_answer_nonempty: final=''" - ] -} -rc=1 -=== task-19 === -{ - "task_id": "TED--19", - "pass": false, - "reason": "nav_filtered_tednext_culture_under10", - "evidence": [ - "[FAIL] nav_filtered_tednext_culture_under10: urls='http://127.0.0.1:41014/'", - "[FAIL] visible_exact_view_counts: feedback_has_exact_counts=False", - "[FAIL] nav_nayeema: navigated=False", - "[FAIL] nav_kate: navigated=False", - "[FAIL] answer_nayeema_higher_difference: final=''", - "[FAIL] final_answer_nonempty: final=''" - ] -} -rc=1 diff --git a/remote-pr-check.txt b/remote-pr-check.txt deleted file mode 100644 index 355e4cc3..00000000 --- a/remote-pr-check.txt +++ /dev/null @@ -1,9 +0,0 @@ -GitHub PR metadata check (read-only via Clash 7890) -date: 2026-09-06 -repo: aiming-lab/WebHarbor -pr: 65 -state: OPEN -title: Add TED task verifiers (site by @shanjiaming, verifiers by reviewer) -base_sha: 7269be89c93b72cf1d8596b4fde65ba1c7453c15 -head_sha: 065e39a4e1bf33e61902abdfb3e9d35f1e62428e -url: https://github.com/aiming-lab/WebHarbor/pull/65 diff --git a/review-reports/FINAL-BY-TASK.md b/review-reports/FINAL-BY-TASK.md deleted file mode 100644 index 5ac445e0..00000000 --- a/review-reports/FINAL-BY-TASK.md +++ /dev/null @@ -1,39 +0,0 @@ -# TED PR 65 — 按任务最终报告 - -审查日期:2026-09-06。验收需要通过四道关卡:重置后的干净 Luna Browser Use 运行、该运行的确定性 Verifier PASS、主代理轨迹/截图/数据库审计,以及独立 Claude 盲审 PASS。未执行远程推送。 - -| 任务 | Luna 干净运行 | Verifier | 主审计 | Claude 盲审 | 最终结论 | 证据 / 发现 | -|---:|---|---|---|---|---|---| -| 0 | PASS | PASS | PASS | PASS | **PASS** | 搜索 → Anil Seth 详情页;回答 15 分钟。只读操作;3 种视口。 | -| 1 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “future”(11 个结果)→ Waymo 详情页 → Alice 收藏并添加备注。状态差异仅包含预期的 Waymo 收藏。 | -| 2 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “design”(7 个结果)→ Debbie TEDNext 详情页;8 分钟。选择了正确的单人演讲;排除了合作演讲。 | -| 3 | PASS | PASS | PASS | PASS | **PASS** | Climate/Nature/Conservation 播放列表 → 符合条件的 Summit 演讲标题。Verifier 要求标题中包含符合条件的标记。 | -| 4 | PASS | PASS | PASS | PASS | **PASS** | Alice 登录 → 账户新闻通讯主题 conservation。个人资料更新已持久化到数据库。 | -| 5 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “world”(19 个结果)→ Malala 详情页;标题完全匹配。标题来自详情页。 | -| 6 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “climate”(6 个结果)→ Kimiko 详情页/活动。活动信息有页面依据。 | -| 7 | PASS | PASS | PASS | PASS | **PASS** | Alice 登录 → 活动 → 注册 TED2026。注册记录是在种子状态基础上新增的。 | -| 8 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “change”(27 个结果)找到 Alexi;搜索 “design”(7 个结果)找到 Debbie;进行比较。两者的详情页和时长均已记录。 | -| 9 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “health”(6 个结果)→ Joy 详情页 → Alice 收藏并添加备注。状态差异包含预期备注。 | -| 10 | PASS | PASS | PASS | PASS | **PASS** | AI/Society 播放列表 → Neal Katyal 的最高法院演讲。播放列表和详情页均已打开。 | -| 11 | PASS | PASS | PASS | PASS | **PASS** | 可见演讲列表 → TED2026 + 最长 20 分钟 → Maya 详情页。Verifier 绑定了活动/最长时长查询及准确的列表路径。 | -| 12 | PASS | PASS | PASS | PASS | **PASS** | Alice 账户 → 移除一个非 AI 收藏演讲。恰好移除一个;保留 OpenClaw。 | -| 13 | PASS | PASS | PASS | PASS | **PASS** | Science 主题 → 品酒详情页;Qian Janice Wang。演讲者严格匹配。 | -| 14 | PASS | PASS | PASS | PASS | **PASS** | 搜索 “technology”(17 个结果)→ Riyad 建筑详情页。演讲者信息有页面依据。 | -| 15 | PASS | PASS | PASS | PASS | **PASS** | 两个音乐详情页 → Turkana 的观看次数更多。比较结果以两个页面为依据。 | -| 16 | PASS | PASS | PASS | PASS | **PASS** | 注册新用户 → 可见的 /talks 列表 → 收藏 OpenClaw → 账户。已确认新用户数据库记录和收藏记录。 | -| 17 | PASS | PASS | PASS | PASS | **PASS** | 活动 → TEDNext 2025;2025 年 11 月。回答必须同时包含月份和年份。 | -| 18 | PASS | PASS | PASS | PASS | **PASS** | TED2026 + AI + 最长 20 分钟 → Peter/Anil 详情页;差值准确。界面显示准确观看次数 551,544 和 191,682。 | -| 19 | PASS | PASS | PASS | PASS | **PASS** | TEDNext 2025 + culture + 最长 10 分钟 → Nayeema/Kate 详情页;差值准确。界面显示准确观看次数 554,563 和 203,431。 | - -## 各关卡统计 - -- 清单中的任务:**20** 个,ID 从 `TED--0` 到 `TED--19`,每个任务都有专用 verifier 和评分标准。 -- Luna 干净运行:**20/20**;原始 SQLite 文件、轨迹日志和截图保留在本地审查归档中。 -- 确定性 verifier 矩阵:**20/20 PASS**;输出见 [`final-verifier-results.txt`](../final-verifier-results.txt)。 -- 空操作对照:仅访问主页且答案为空的运行 **20/20 FAIL**;输出见 [`noop-verifier-results-20.txt`](../noop-verifier-results-20.txt)。 -- 独立 Claude 盲审:**20/20 PASS**。其仅收到脱敏后的任务/评分标准、轨迹、公开数据库摘要,没有收到 verifier 或源代码实现。 -- 主代理审计:**20/20 PASS**,审查了轨迹语义、已采集的 1440/390/320 视口截图,以及数据库前后差异。 - -完整环境 smoke 测试在本地 `webharbor:ted-review` 镜像上通过:控制平面 `/health` 状态正常,全部 17 个站点端口均返回 HTTP 200,TED 重置生成了字节级完全相同的 instance/seed MD5。最终 TED 任务运行使用了获授权的独立服务(`/_health` 报告 64 个演讲;`/`、`/talks` 返回 HTTP 200),因此准确计数代码变更得到了直接执行。本次 smoke 测试无需重新构建源代码;此前的源代码构建受到无关资源锁的影响。 - -原始截图、轨迹和 SQLite 快照保留在本地审查归档中,未包含在此公共分支;本报告和聚合日志可公开审查。 diff --git a/review-reports/INDEPENDENT-CLAUDE-RESULTS.md b/review-reports/INDEPENDENT-CLAUDE-RESULTS.md deleted file mode 100644 index dcb3589f..00000000 --- a/review-reports/INDEPENDENT-CLAUDE-RESULTS.md +++ /dev/null @@ -1,28 +0,0 @@ -# 独立 Claude 盲审——最终矩阵 - -日期:2026-09-06。每个评审仅查看对应的任务问题/评分标准、规范化轨迹、公开的前后状态摘要和本地任务包。电子邮件/密码已脱敏;未发送截图及实现/verifier 文件。 - -| 任务 | 判定 | 置信度 | -|---:|---|---| -| 0 | **PASS** | high | -| 1 | **PASS** | 0.97 | -| 2 | **PASS** | high | -| 3 | **PASS** | 0.9 | -| 4 | **PASS** | high | -| 5 | **PASS** | 0.95 | -| 6 | **PASS** | 0.95 | -| 7 | **PASS** | medium-high | -| 8 | **PASS** | high | -| 9 | **PASS** | 0.95 | -| 10 | **PASS** | high | -| 11 | **PASS** | 0.92 | -| 12 | **PASS** | high | -| 13 | **PASS** | 0.95 | -| 14 | **PASS** | 0.88 | -| 15 | **PASS** | 0.98 | -| 16 | **PASS** | high | -| 17 | **PASS** | 0.97 | -| 18 | **PASS** | 0.72 | -| 19 | **PASS** | high | - -20 个任务全部返回 PASS。原始评审包仍保存在仓库之外的 本地审查归档 下;仓库中仅保存这份脱敏后的结果摘要。 diff --git a/review-reports/MAIN-JUDGE-REVIEW.md b/review-reports/MAIN-JUDGE-REVIEW.md deleted file mode 100644 index 0c6851c2..00000000 --- a/review-reports/MAIN-JUDGE-REVIEW.md +++ /dev/null @@ -1,41 +0,0 @@ -# TED PR 65 — Main-agent trajectory and visual audit - -Date: 2026-09-06. I reviewed the final Luna trajectories, every task’s before/after DB, recorded page feedback, and the saved screenshots. The primary audit treats the browser interaction as the source of truth and checks for direct URL shortcuts, incomplete state transitions, answer leaks, missing screenshots, and responsive overflow. - -| Task | Audit result | What was checked | -|---:|---|---| -| 0 | **PASS** | Search → Anil Seth detail; 15-minute answer; Read-only; 3 viewports. | -| 1 | **PASS** | Search “future” (11 results) → Waymo detail → Alice save + note; State delta contains only intended Waymo save. | -| 2 | **PASS** | Search “design” (7 results) → Debbie TEDNext detail; 8 minutes; Correct solo talk selected; co-talk excluded. | -| 3 | **PASS** | Climate/Nature/Conservation playlist → qualifying Summit talk title; Verifier requires a qualifying title token. | -| 4 | **PASS** | Alice login → account newsletter topic conservation; Profile update persisted in DB. | -| 5 | **PASS** | Search “world” (19 results) → Malala detail; exact title; Detail page supplies title. | -| 6 | **PASS** | Search “climate” (6 results) → Kimiko detail/event; Event is page-grounded. | -| 7 | **PASS** | Alice login → Events → TED2026 registration; Registration added from seed state. | -| 8 | **PASS** | Search “change” (27 results) Alexi; “design” (7 results) Debbie; compare; Both details and durations recorded. | -| 9 | **PASS** | Search “health” (6 results) → Joy detail → Alice save + note; State delta contains intended note. | -| 10 | **PASS** | AI/Society playlist → Neal Katyal Supreme Court talk; Playlist and detail both opened. | -| 11 | **PASS** | Visible talks listing → TED2026 + max 20 → Maya detail; Verifier binds event/max query and exact listing path. | -| 12 | **PASS** | Alice account → remove one non-AI saved talk; Exactly one removed; OpenClaw retained. | -| 13 | **PASS** | Science topic → wine-tasting detail; Qian Janice Wang; Exact speaker check. | -| 14 | **PASS** | Search “technology” (17 results) → Riyad architecture detail; Speaker page-grounded. | -| 15 | **PASS** | Both music details → Turkana has more views; Comparison grounded on both pages. | -| 16 | **PASS** | Register new user → visible /talks listing → OpenClaw save → account; New-user DB row and saved row confirmed. | -| 17 | **PASS** | Events → TEDNext 2025; November 2025; Answer requires both month and year. | -| 18 | **PASS** | TED2026 + AI + max 20 → Peter/Anil details; exact difference; UI exposes exact counts 551,544 and 191,682. | -| 19 | **PASS** | TEDNext 2025 + culture + max 10 → Nayeema/Kate details; exact difference; UI exposes exact counts 554,563 and 203,431. | - -## Findings resolved during review - -- Added Tasks 18 and 19 as filtered, two-detail exact view-count comparisons. -- Reworked narrow queries for Tasks 1, 5, 6, 8, 9, and 14 to provide distractors and require selection. -- Task 2’s clean run was redone from seed after an earlier contaminated after-state. -- Task 8 was rerun with visible result selection for both talks after earlier incomplete/wrong-query attempts. -- Task 11 was rerun with an exact click from the filtered TED2026 listing; its verifier now binds event and max-duration query parameters. -- Task 16 was rerun with visible `/talks` listing navigation; its verifier now recognizes the exact listing path without confusing detail URLs. -- Tasks 18 and 19 now record exact comma-separated UI view counts; `views_label` exposes the public integer count needed for arithmetic. -- Earlier attempts remain under each task’s `attempt-*` directory where applicable; the final trajectory and screenshots identify the accepted run. - -## Visual/runtime audit - -The final evidence includes real TED imagery and populated cards/details. Captured viewport widths include 1440, 390, and 320 pixels; screenshots were checked for horizontal overflow using recorded scroll-width feedback and image dimensions. The standalone TED service remained healthy (`/_health`, 64 talks; `/` and `/talks` HTTP 200). A full local Docker smoke run also passed: the control plane was healthy, all 17 site ports returned HTTP 200, and TED reset produced matching instance/seed MD5s. Earlier source rebuild attempts encountered unrelated asset locks; the existing review image supplied the complete environment smoke test. diff --git a/review-reports/PR-65-REVIEW-DRAFT.md b/review-reports/PR-65-REVIEW-DRAFT.md deleted file mode 100644 index 864813f9..00000000 --- a/review-reports/PR-65-REVIEW-DRAFT.md +++ /dev/null @@ -1,69 +0,0 @@ -# Review: TED (PR #65) - -**Recommendation: REQUEST_CHANGES** - -This draft reviews the remote PR head `065e39a4e1bf33e61902abdfb3e9d35f1e62428e`. The local review branch is ahead at `b8d3bc3c2c734dfb649e733fc50051271065b91`; those remediation commits and their evidence have **not** been pushed to GitHub, so they do not change the status of PR #65. The read-only remote metadata is recorded in [`remote-pr-check.txt`](../remote-pr-check.txt). - -## Mechanical checks: PASS locally; remote-head rebuild unverified - -- [x] The existing local review image passed control-plane health, all 17 site-port HTTP-200 checks, TED reset, and byte-identical `instance`/`instance_seed` MD5 checks. See [`full-env-smoke.txt`](../full-env-smoke.txt). -- [x] The local TED service was healthy (`/_health` reported 64 talks; `/` and `/talks` returned HTTP 200). -- [x] The pinned asset revision `597623a2f32898afa12e3bbeda15520f559aa7c7` is present in [`.assets-revision`](../.assets-revision) and its Hugging Face commit page returned HTTP 200. See [`hf-revision-check.txt`](../hf-revision-check.txt). -- [ ] A fresh source-image rebuild from the exact remote PR head was not established in this sandbox. The full smoke result above is for the local review image and must not be treated as a remote-head reproducibility result. - -## Visual fidelity: PASS on the local review run - -- [x] Playwright screenshots cover the homepage, search/listing, detail, auth/account, and responsive 1440/390/320px views. -- [x] No blocking placeholder-image, blank-page, navigation, or responsive-overflow issue was observed in the audited TED flows. -- [x] Evidence is retained per task in the local review archive; this public remediation branch includes only the safe aggregate reports and controls. - -## Functional depth: PASS on the local remediation run - -- [x] Search, topic/playlist, event, detail, login, registration, account update, save/note, remove, and comparison flows were exercised through the visible UI. -- [x] The local run produced 20/20 clean Luna trajectories and 20/20 deterministic verifier passes. See [`FINAL-BY-TASK.md`](FINAL-BY-TASK.md) and [`final-verifier-results.txt`](../final-verifier-results.txt). -- [x] The 20 homepage-only empty-answer controls all failed their verifiers (20/20, exit code 1). See [`noop-verifier-results-20.txt`](../noop-verifier-results-20.txt). - -## Task quality: FAIL on the remote PR head - -The remote PR contains 18 tasks and 18 verifiers, while the reviewed contract requires the complete 20-task suite. The original task set also leaves several quality and grading gaps: - -- Tasks 1, 2, 5, 8, 9, and 14 do not consistently force a sufficiently broad visible search path. Several original queries are narrow or omit search entirely, creating first-result/shortcut risk and failing the distractor standard. -- Task 11 says TED2026 and under 10 minutes, but its remote verifier only checks a `/talks?` visit plus Maya Higa navigation; it does not bind the event and duration query parameters. -- Task 3's remote verifier accepts speaker-only tokens even though the task asks for a talk; the answer contract should require a qualifying talk title or an explicitly complete identification. -- Task 13's task, rubric, and verifier should be aligned on whether the required output is the complete talk identity or the speaker; the remote verifier currently accepts either token without making that contract explicit. -- Stateful tasks should consistently reject an empty final answer and require the visible navigation that establishes the requested action. The remote stateful verifiers for Tasks 1 and 4 lacked that final-answer gate; Task 16 lacked a real `/talks` listing requirement. -- Task 17's remote verifier checks only `November`; it does not require the `TEDNext 2025` event/year, so a month-only answer can pass. - -These are benchmark-quality issues rather than cosmetic preferences: they permit under-navigation, incomplete answers, or a verifier pass without satisfying all task constraints. - -## Grading contract authored in the local remediation branch - -The local reviewer remediation now contains 20 one-to-one task verifiers and rubrics (`TED--0` through `TED--19`), with no `answer` key in `tasks.jsonl`. Ground truth remains in verifier code. The revised contract adds two filtered comparison tasks, broadens the visible search paths, binds exact filter parameters, tightens title/speaker/year checks, requires non-empty final answers, and preserves state-delta checks. - -The local controls are: - -- 20/20 clean Luna runs → deterministic verifier PASS; -- 20/20 homepage-only no-op runs → verifier FAIL; -- 20/20 primary trajectory/screenshot/DB audits → PASS; -- 20/20 sanitized blind Claude judge packets → PASS. - -See [`VERIFIER-LOGIC-REVIEW.md`](../VERIFIER-LOGIC-REVIEW.md), [`MAIN-JUDGE-REVIEW.md`](MAIN-JUDGE-REVIEW.md), and [`INDEPENDENT-CLAUDE-RESULTS.md`](INDEPENDENT-CLAUDE-RESULTS.md). Raw screenshots, trajectories, and database snapshots remain in the local review archive and are intentionally not published. - -## Required fixes before approval - -1. Bring the PR to the complete 20-task contract by adding the two filtered comparison tasks and dedicated verifiers/rubrics. -2. Re-anchor the narrow/underspecified tasks on visible searches with at least six results, near misses, and multiple sub-categories; ensure no task is solvable by the first result alone. -3. Make every verifier enforce every task constraint: exact filter parameters for Task 11, complete talk identification for Task 3/13, TEDNext plus year for Task 17, visible listing navigation for Task 16, and non-empty final answers for stateful tasks. -4. Re-run the clean Luna, deterministic verifier, no-op, primary trajectory, and blind-judge gates from the updated PR head, then attach the resulting screenshots and logs. - -## Local evidence and provenance - -- Local remediation commits: `d5504eb`, `90303bb`, `fbba792`, `654e9f5`, `8d7fcab`, `c38b012`, `fa4a33d`, `b8d3bc3`. -- Local final matrix: [`FINAL-BY-TASK.md`](FINAL-BY-TASK.md). -- Verifier logic audit: [`VERIFIER-LOGIC-REVIEW.md`](../VERIFIER-LOGIC-REVIEW.md). -- Full environment smoke: [`full-env-smoke.txt`](../full-env-smoke.txt). -- This is a public remediation draft; no GitHub review comment has been posted. - - diff --git a/review-reports/PR-85-FINAL-AUDIT.md b/review-reports/PR-85-FINAL-AUDIT.md new file mode 100644 index 00000000..d40702f6 --- /dev/null +++ b/review-reports/PR-85-FINAL-AUDIT.md @@ -0,0 +1,39 @@ +# PR #85 independent review and remediation audit + +## Scope + +This audit reviewed GitHub PR #85 head `18fa53a96b6131af0364f00aa2cbd07609a902c3` against base `90afddb6d4af382935ded9a385f2eead604188cf`. Seven independent review contexts assessed the pristine original head. Their raw reports are retained outside the repository under `/data/zhaoyang-user-projects/websyn/_wh_review_tools/pr85-agents/reports-original-final/`. + +## Review-agent findings and dispositions + +| Review agent | Primary findings on the original head | Verification and disposition | +|---|---|---| +| Security | Hard-coded Flask secret, open redirects after login/save, no CSRF protection, GET logout, and default/weak registration password behavior. | Confirmed directly in the original `sites/ted/app.py` and templates. Fixed with an environment/random secret, strict local-path redirects, Flask-WTF CSRF, POST logout, session rotation, request/field limits, and server-side registration validation. HTTP regression tests cover CSRF, redirect rejection, credential non-disclosure, invalid registration, and safe GET behavior. | +| Tasks and data | Exact duration/view arithmetic and seed account state were correct; TED task URLs were all `40016`; task 12 allowed multiple valid non-AI choices; playlist membership required independent confirmation. | Data facts were verified from the downloaded SQLite seed. The integration review established that TED is site index 19 and therefore port `40019`; all 20 task URLs were corrected. Task 12 now reports the exact removed title while still accepting any one valid non-AI row through a database-bound verifier. Playlist ordering and membership were checked directly. `judge_rubric` is not included in the web-agent prompt: `agent_demo/agent.py` passes only `ques` to `build_messages` and carries the rubric solely into judge input. | +| Verifiers | LLM checks became implicit passes under `--no_llm`; URL checks used substrings without origin/path/query binding; several required search/topic/filter steps were unenforced; multiple answers were unbound or negation-sensitive; state checks were incomplete. | All 20 verifiers and `verify_lib.py` were replaced with deterministic same-origin path/query/order checks, click/submit/input checks, exact task identity, non-empty answers, negation-aware fact binding, complete read-only database comparison, and exact global state-table deltas. Positive, answer-only, wrong-task, external-origin, missing-filter, negated-answer, swapped-value, wrong-removal, unrelated-mutation, and same-table-extra-mutation tests pass. | +| UI, responsive, accessibility | Cards and the lead story hid talk titles; the stacked mobile header remained sticky; controls lacked labels; repeated event buttons lacked event-specific accessible names; talk images had empty alt text; focus styles were absent; footer alignment was poor on mobile. | Talk and lead cards now render titles and speakers, the mobile header is static, filters and note/search fields are labeled, event buttons carry event-specific accessible names, talk images have descriptive alt text, focus-visible styles are present, and mobile footer alignment is corrected. Automated 320 px, 390 px, and 1440 px checks cover 30 route/viewport combinations with no horizontal overflow or broken images. | +| Integration and assets | The current HF main pin did not contain `ted.tar.gz`; all tasks targeted IKEA's `40016`; docs still described 19 sites and ended at `40018`; committed smoke/HF/PR evidence was stale; runtime startup could manufacture a mutable seed and mask missing assets. | `scripts/fetch_assets.sh` now uses immutable TED revision `597623a2f32898afa12e3bbeda15520f559aa7c7` until HF dataset PR #2 merges, while all other assets remain pinned to current HF main. Full 20-site asset fetch and clean Docker build pass. Site registration and docs now use 20 sites and ports `40000-40019`. Runtime fails closed when the TED seed is absent and only copies the authoritative seed into `instance`. Stale PR-65 evidence was removed and replaced by this exact-head audit. | +| Application and data model | Runtime seed creation was nondeterministic and could mutate `instance_seed`; partial seed gates were unsafe; topic matching was case-sensitive; search was brittle for simple morphology; registration accepted invalid/default credentials; CSRF and secret handling were unsafe; legacy SQLAlchemy lookup was used. | Runtime seed generation was removed; startup requires the HF seed. Topic matching is case-insensitive, duration filtering uses exact seconds, and search accepts simple prefixes/plurals. Registration validation, CSRF, secret handling, foreign-key enforcement, unique indexes, duplicate-race handling, and SQLAlchemy 2 lookup are implemented. The TED seed migration is idempotent and adds unique saved-talk and registration indexes. | +| Evidence quality | The PR-authored evidence described PR #65, an older head, 17-site/old-port smoke output, a different HF revision, and a pre-existing image rather than a clean PR #85 source build. | All stale evidence files were removed. Current evidence includes reproducible unit/adversarial tests, actual browser trajectories with initial/after databases and verifier JSON, responsive screenshots/results, immutable asset download logs, a clean local image build, 20/20 site health, TED reset hash identity, and reset-all success. | + +## Task validation + +All 20 tasks were completed through the rendered UI from a fresh seed database. Each generated trajectory was evaluated by its corresponding deterministic verifier using the captured initial and after-state databases. Result: `20/20 PASS`. + +The complete local browser evidence is retained under `/data/zhaoyang-user-projects/websyn/_wh_review_tools/pr85-fixes/e2e/`. Responsive results and screenshots are retained under `/data/zhaoyang-user-projects/websyn/_wh_review_tools/pr85-fixes/responsive/`. + +## Repository and container validation + +- Python compilation, shell syntax, Ruff fatal/undefined-name checks, and `git diff --check`: PASS. +- TED HTTP/app, verifier, migration, and environment regression suite: 27 tests PASS. +- All TED templates and all 64 talk details render successfully: PASS. +- Immutable TED asset fetch plus all-site asset fetch: PASS; 20 tarballs extracted. +- TED migration: creates two unique indexes on first application and zero on the second application. +- Clean Docker build from the remediated source tree: PASS (`sha256:2dc842e93de6aa95c66239250c016f3251509ea7eb8ab312097b6d3a1b67a9bb`). +- Control-plane health and all 20 site roots: PASS. +- `/reset/ted`: PASS and runtime/seed SHA-256 values match. +- `/reset-all`: PASS for all 20 sites. + +## Remaining external dependency + +Hugging Face dataset PR #2 remains open. The reviewed code uses its immutable commit directly for TED while keeping the repository-wide asset pin on current HF main. Once HF PR #2 is merged, the repository-wide asset pin should be advanced to that merge commit and the temporary TED-specific override removed. diff --git a/scripts/fetch_assets.sh b/scripts/fetch_assets.sh index 613a5315..e9b10016 100755 --- a/scripts/fetch_assets.sh +++ b/scripts/fetch_assets.sh @@ -22,6 +22,9 @@ REPO=$(awk '/^repo:/ {print $2}' .assets-revision) REVISION="${ASSETS_REVISION:-$(awk '/^revision:/ {print $2}' .assets-revision)}" ONLY_SITE="${1:-}" CACHE_DIR="sites/.cache/tarballs" +# TED's asset is currently in ChilleD/WebHarbor dataset PR #2 rather than the +# pinned main revision. Keep this immutable per-site pin until that HF PR lands. +TED_ASSETS_REVISION="${TED_ASSETS_REVISION:-597623a2f32898afa12e3bbeda15520f559aa7c7}" if ! command -v hf >/dev/null 2>&1; then echo "fetch_assets: 'hf' CLI not found. Install with: pip install -U \"huggingface_hub[cli]\"" >&2 @@ -33,14 +36,21 @@ echo "[fetch] huggingface.co/datasets/$REPO @ $REVISION -> sites/" if [[ -n "$ONLY_SITE" ]]; then INCLUDE="$ONLY_SITE.tar.gz" - echo "[fetch] scope: $ONLY_SITE only" + DOWNLOAD_REVISION="$REVISION" + if [[ "$ONLY_SITE" == "ted" ]]; then + DOWNLOAD_REVISION="$TED_ASSETS_REVISION" + fi + echo "[fetch] scope: $ONLY_SITE only @ $DOWNLOAD_REVISION" + hf download "$REPO" --repo-type dataset --revision "$DOWNLOAD_REVISION" \ + --include "$INCLUDE" --local-dir "$CACHE_DIR" else - INCLUDE="*.tar.gz" + hf download "$REPO" --repo-type dataset --revision "$REVISION" \ + --include "*.tar.gz" --local-dir "$CACHE_DIR" + echo "[fetch] TED asset override @ $TED_ASSETS_REVISION" + hf download "$REPO" --repo-type dataset --revision "$TED_ASSETS_REVISION" \ + --include "ted.tar.gz" --local-dir "$CACHE_DIR" fi -hf download "$REPO" --repo-type dataset --revision "$REVISION" \ - --include "$INCLUDE" --local-dir "$CACHE_DIR" - shopt -s nullglob extracted=0 for tarball in "$CACHE_DIR"/*.tar.gz; do diff --git a/sites/ted/app.py b/sites/ted/app.py index 65b2aa2b..cba94e57 100644 --- a/sites/ted/app.py +++ b/sites/ted/app.py @@ -2,27 +2,43 @@ import json import os import re +import secrets import shutil from datetime import datetime from pathlib import Path +from urllib.parse import urlparse from flask import Flask, abort, flash, redirect, render_template, request, session, url_for from flask_sqlalchemy import SQLAlchemy +from flask_wtf.csrf import CSRFProtect +from sqlalchemy import event as sqlalchemy_event +from sqlalchemy.engine import Engine +from sqlalchemy.exc import IntegrityError from werkzeug.security import check_password_hash, generate_password_hash -from seed_data import EVENTS, PLAYLISTS, TALKS - BASE_DIR = Path(__file__).resolve().parent DB_PATH = BASE_DIR / "instance" / "ted.db" SEED_DB_PATH = BASE_DIR / "instance_seed" / "ted.db" +SITE_PORT = 40019 app = Flask(__name__) -app.config["SECRET_KEY"] = "webharbor-ted-dev-key" +app.config["SECRET_KEY"] = os.environ.get("TED_SECRET_KEY") or secrets.token_hex(32) app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{DB_PATH}" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False +app.config["MAX_CONTENT_LENGTH"] = 64 * 1024 +app.config["SESSION_COOKIE_HTTPONLY"] = True +app.config["SESSION_COOKIE_SAMESITE"] = "Lax" BASE_DIR.joinpath("instance").mkdir(exist_ok=True) db = SQLAlchemy(app) +csrf = CSRFProtect(app) + + +@sqlalchemy_event.listens_for(Engine, "connect") +def enable_sqlite_foreign_keys(connection, _record): + cursor = connection.cursor() + cursor.execute("PRAGMA foreign_keys=ON") + cursor.close() class User(db.Model): @@ -75,8 +91,14 @@ def views_label(self): return f"{self.views // 1000}K" return str(self.views) + @property + def exact_views_label(self): + return f"{self.views:,}" + class SavedTalk(db.Model): + __table_args__ = (db.UniqueConstraint("user_id", "talk_id", name="uq_saved_talk_user_talk"),) + id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) talk_id = db.Column(db.Integer, db.ForeignKey("talk.id"), nullable=False) @@ -112,6 +134,8 @@ class Event(db.Model): class Registration(db.Model): + __table_args__ = (db.UniqueConstraint("user_id", "event_id", name="uq_registration_user_event"),) + id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) event_id = db.Column(db.Integer, db.ForeignKey("event.id"), nullable=False) @@ -120,6 +144,16 @@ class Registration(db.Model): STOP_WORDS = {"the", "a", "an", "and", "or", "of", "to", "for", "in", "on", "with", "by", "my", "is"} +EMAIL_PATTERN = re.compile(r"[^@\s]+@[^@\s]+\.[^@\s]+") + + +def safe_next(target, fallback): + if not target or "\\" in target: + return fallback + parsed = urlparse(target) + if parsed.scheme or parsed.netloc or not target.startswith("/") or target.startswith("//"): + return fallback + return target def current_user(): @@ -127,10 +161,10 @@ def current_user(): return db.session.get(User, uid) if uid else None -def require_login(): +def require_login(next_url=None): if not current_user(): flash("Please sign in to continue.", "info") - return redirect(url_for("login", next=request.path)) + return redirect(url_for("login", next=next_url or request.path)) return None @@ -159,88 +193,35 @@ def scored_talks(query, talks): for talk in talks: text = " ".join([talk.title, talk.speaker, talk.event, talk.description, talk.transcript, " ".join(talk.topics)]) text_tokens = set(tokenize(text)) - score = sum(1 for token in tokens if token in text_tokens) + score = sum( + 1 + for token in tokens + if any( + token == candidate + or (len(token) >= 4 and candidate.startswith(token)) + or (len(candidate) >= 4 and token.startswith(candidate)) + for candidate in text_tokens + ) + ) if score: ranked.append((score, talk.views, talk)) return [talk for _, _, talk in sorted(ranked, key=lambda item: (-item[0], -item[1]))] -def seed_database(): - if Talk.query.count() > 0: - return - talks_by_topic = {} - for row in TALKS: - talk = Talk( - source_id=row["source_id"], - slug=row["slug"], - title=row["title"], - speaker=row["speaker"], - event=row["event"], - talk_type=row["talk_type"], - duration_seconds=row["duration_seconds"], - published_at=row["published_at"], - recorded_on=row["recorded_on"], - views=row["views"], - image=row["image"], - canonical_url=row["canonical_url"], - description=row["description"], - transcript=row["transcript"], - topics_json=json.dumps(row["topics"]), - recommended_json=json.dumps(row["recommended_for"]), - ) - db.session.add(talk) - db.session.flush() - for topic in row["topics"]: - talks_by_topic.setdefault(topic.lower(), []).append(talk.id) - - for row in PLAYLISTS: - playlist = Playlist(**row) - db.session.add(playlist) - db.session.flush() - topic_terms = [term.strip().lower() for term in row["topic"].split("|") if term.strip()] - ids = [] - for term in topic_terms: - for talk_id in talks_by_topic.get(term, []): - if talk_id not in ids: - ids.append(talk_id) - ids = ids[:8] - if len(ids) < 4: - ids = [talk.id for talk in Talk.query.order_by(Talk.views.desc()).limit(8)] - for position, talk_id in enumerate(ids, start=1): - db.session.add(PlaylistTalk(playlist_id=playlist.id, talk_id=talk_id, position=position)) - - for row in EVENTS: - db.session.add(Event(**row)) - db.session.commit() +def available_topics(): + return sorted({topic for talk in Talk.query.all() for topic in talk.topics}, key=str.casefold) -def seed_users(): - if User.query.filter_by(email="alice.j@test.com").first(): - return - users = [ - ("alice_j", "alice.j@test.com", "Alice Johnson", "Product manager", "Seattle", "AI"), - ("bob_c", "bob.c@test.com", "Bob Chen", "Graduate student", "Boston", "science"), - ("carol_d", "carol.d@test.com", "Carol Davis", "Workshop facilitator", "Austin", "design"), - ("david_k", "david.k@test.com", "David Kim", "Climate researcher", "San Francisco", "climate change"), - ] - talks = Talk.query.order_by(Talk.views.desc()).limit(12).all() - events = Event.query.all() - for index, (username, email, name, role, city, topic) in enumerate(users): - user = User( - username=username, - email=email, - display_name=name, - role=role, - city=city, - newsletter_topic=topic.lower(), - password_hash=generate_password_hash("TestPass123!"), - ) - db.session.add(user) - db.session.flush() - for talk in talks[index:index + 4]: - db.session.add(SavedTalk(user_id=user.id, talk_id=talk.id, note=f"Review for {topic} discussion")) - db.session.add(Registration(user_id=user.id, event_id=events[index % len(events)].id, status="confirmed")) - db.session.commit() +def filtered_talks(topic="", event="", max_minutes=None): + query = Talk.query + if event: + query = query.filter(Talk.event == event) + if max_minutes is not None: + query = query.filter(Talk.duration_seconds <= max_minutes * 60) + items = query.order_by(Talk.published_at.desc(), Talk.id.asc()).all() + if topic: + items = [talk for talk in items if topic.casefold() in {value.casefold() for value in talk.topics}] + return items @app.route("/") @@ -253,19 +234,28 @@ def index(): @app.route("/talks") def talks(): - topic = request.args.get("topic", "").lower() - event = request.args.get("event", "") - max_minutes = request.args.get("max_minutes", type=int) - query = Talk.query - if event: - query = query.filter(Talk.event == event) - items = query.order_by(Talk.published_at.desc()).all() - if topic: - items = [talk for talk in items if topic in talk.topics] - if max_minutes: - items = [talk for talk in items if talk.minutes <= max_minutes] + topic = request.args.get("topic", "").strip().lower() + event = request.args.get("event", "").strip() + raw_max_minutes = request.args.get("max_minutes", "").strip() + max_minutes = None + if raw_max_minutes: + try: + max_minutes = int(raw_max_minutes) + except ValueError: + max_minutes = None + if max_minutes is not None and not 1 <= max_minutes <= 180: + max_minutes = None + items = filtered_talks(topic, event, max_minutes) events = [row[0] for row in db.session.query(Talk.event).distinct().order_by(Talk.event).all()] - return render_template("talks.html", talks=items, topic=topic, event=event, max_minutes=max_minutes, events=events) + return render_template( + "talks.html", + talks=items, + topic=topic, + event=event, + max_minutes=max_minutes, + events=events, + topics=available_topics(), + ) @app.route("/search") @@ -297,8 +287,7 @@ def topics(): @app.route("/topics/") def topic_detail(topic): - talks = [talk for talk in Talk.query.order_by(Talk.views.desc()).all() if topic.lower() in talk.topics] - return render_template("talks.html", talks=talks, topic=topic.lower(), event="", max_minutes=None, events=[]) + return redirect(url_for("talks", topic=topic.lower())) @app.route("/playlists") @@ -317,40 +306,57 @@ def playlist_detail(slug): @app.route("/events", methods=["GET", "POST"]) def events(): if request.method == "POST": - login_redirect = require_login() + login_redirect = require_login(url_for("events")) if login_redirect: return login_redirect - event = Event.query.filter_by(slug=request.form.get("event_slug")).first_or_404() + event_slug = request.form.get("event_slug", "").strip() + event = Event.query.filter_by(slug=event_slug).first_or_404() user = current_user() existing = Registration.query.filter_by(user_id=user.id, event_id=event.id).first() if not existing: db.session.add(Registration(user_id=user.id, event_id=event.id, status="waitlisted")) - db.session.commit() - flash(f"Registration saved for {event.name}.", "success") + try: + db.session.commit() + flash(f"Registration saved for {event.name}.", "success") + except IntegrityError: + db.session.rollback() + flash(f"You are already registered for {event.name}.", "info") + else: + flash(f"You are already registered for {event.name}.", "info") return redirect(url_for("account")) - return render_template("events.html", events=Event.query.order_by(Event.month.desc()).all()) + event_items = Event.query.all() + event_items.sort(key=lambda item: datetime.strptime(item.month, "%B %Y"), reverse=True) + return render_template("events.html", events=event_items) @app.route("/save/", methods=["POST"]) def save_talk(slug): - login_redirect = require_login() + login_redirect = require_login(url_for("talk_detail", slug=slug)) if login_redirect: return login_redirect talk = Talk.query.filter_by(slug=slug).first_or_404() user = current_user() - if not SavedTalk.query.filter_by(user_id=user.id, talk_id=talk.id).first(): - db.session.add(SavedTalk(user_id=user.id, talk_id=talk.id, note=request.form.get("note", ""))) - db.session.commit() - flash("Talk saved.", "success") - return redirect(request.referrer or url_for("talk_detail", slug=slug)) + existing = SavedTalk.query.filter_by(user_id=user.id, talk_id=talk.id).first() + if not existing: + note = request.form.get("note", "").strip()[:240] + db.session.add(SavedTalk(user_id=user.id, talk_id=talk.id, note=note)) + try: + db.session.commit() + flash("Talk saved.", "success") + except IntegrityError: + db.session.rollback() + flash("This talk is already saved.", "info") + else: + flash("This talk is already saved.", "info") + return redirect(safe_next(request.form.get("next"), url_for("talk_detail", slug=slug))) @app.route("/unsave/", methods=["POST"]) def unsave_talk(saved_id): - login_redirect = require_login() + login_redirect = require_login(url_for("account")) if login_redirect: return login_redirect - saved = SavedTalk.query.get_or_404(saved_id) + saved = db.get_or_404(SavedTalk, saved_id) if saved.user_id != current_user().id: abort(403) db.session.delete(saved) @@ -366,10 +372,10 @@ def account(): return login_redirect user = current_user() if request.method == "POST": - user.display_name = request.form.get("display_name", user.display_name).strip() or user.display_name - user.role = request.form.get("role", user.role).strip() or user.role - user.city = request.form.get("city", user.city).strip() - user.newsletter_topic = request.form.get("newsletter_topic", user.newsletter_topic).strip().lower() + user.display_name = (request.form.get("display_name", user.display_name).strip() or user.display_name)[:120] + user.role = (request.form.get("role", user.role).strip() or user.role)[:120] + user.city = request.form.get("city", user.city).strip()[:120] + user.newsletter_topic = (request.form.get("newsletter_topic", user.newsletter_topic).strip().lower() or user.newsletter_topic)[:80] db.session.commit() flash("Profile updated.", "success") return redirect(url_for("account")) @@ -380,40 +386,61 @@ def account(): @app.route("/login", methods=["GET", "POST"]) def login(): + if current_user(): + return redirect(url_for("account")) if request.method == "POST": - email = request.form.get("email", "").lower().strip() + email = request.form.get("email", "").lower().strip()[:160] + password = request.form.get("password", "")[:256] user = User.query.filter_by(email=email).first() - if user and check_password_hash(user.password_hash, request.form.get("password", "")): + if user and check_password_hash(user.password_hash, password): + session.clear() session["user_id"] = user.id flash("Signed in.", "success") - return redirect(request.args.get("next") or url_for("account")) + return redirect(safe_next(request.args.get("next"), url_for("account"))) flash("Invalid email or password.", "error") return render_template("login.html") @app.route("/register", methods=["GET", "POST"]) def register(): + if current_user(): + return redirect(url_for("account")) if request.method == "POST": - email = request.form.get("email", "").lower().strip() + email = request.form.get("email", "").lower().strip()[:160] username = re.sub(r"[^a-z0-9_]+", "", request.form.get("username", "").lower())[:40] - if User.query.filter((User.email == email) | (User.username == username)).first(): - flash("That email or username already exists.", "error") - else: - user = User( - email=email, - username=username, - display_name=request.form.get("display_name", username).strip() or username, - password_hash=generate_password_hash(request.form.get("password", "TestPass123!")), - ) - db.session.add(user) - db.session.commit() - session["user_id"] = user.id - flash("Account created.", "success") - return redirect(url_for("account")) + display_name = request.form.get("display_name", "").strip()[:120] + password = request.form.get("password", "")[:256] + errors = [] + if not username: + errors.append("Enter a username containing letters, numbers, or underscores.") + if not EMAIL_PATTERN.fullmatch(email): + errors.append("Enter a valid email address.") + if not display_name: + errors.append("Enter your name.") + if len(password) < 8: + errors.append("Password must contain at least 8 characters.") + if email and username and User.query.filter((User.email == email) | (User.username == username)).first(): + errors.append("Unable to create an account with the supplied details.") + if errors: + for message in errors: + flash(message, "error") + return render_template("register.html"), 400 + user = User( + email=email, + username=username, + display_name=display_name, + password_hash=generate_password_hash(password), + ) + db.session.add(user) + db.session.commit() + session.clear() + session["user_id"] = user.id + flash("Account created.", "success") + return redirect(url_for("account")) return render_template("register.html") -@app.route("/logout") +@app.route("/logout", methods=["POST"]) def logout(): session.clear() flash("Signed out.", "success") @@ -425,15 +452,20 @@ def health(): return {"ok": True, "site": "ted", "talks": Talk.query.count()} +def initialize_database(): + if not SEED_DB_PATH.exists(): + raise RuntimeError( + f"Missing TED seed database at {SEED_DB_PATH}. Run scripts/fetch_assets.sh ted before starting the site." + ) + if not DB_PATH.exists(): + DB_PATH.parent.mkdir(exist_ok=True) + shutil.copy2(SEED_DB_PATH, DB_PATH) + + with app.app_context(): - db.create_all() - seed_database() - seed_users() - if not SEED_DB_PATH.exists() and DB_PATH.exists(): - SEED_DB_PATH.parent.mkdir(exist_ok=True) - shutil.copy2(DB_PATH, SEED_DB_PATH) + initialize_database() if __name__ == "__main__": - port = int(os.environ.get("PORT", 5000)) + port = int(os.environ.get("PORT", SITE_PORT)) app.run(host="0.0.0.0", port=port, debug=False) diff --git a/sites/ted/migrate_seed.py b/sites/ted/migrate_seed.py new file mode 100644 index 00000000..de8cb199 --- /dev/null +++ b/sites/ted/migrate_seed.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +"""Apply idempotent integrity constraints to the downloaded TED seed database.""" +from __future__ import annotations +import argparse +import sqlite3 +from pathlib import Path + +BASE_DIR=Path(__file__).resolve().parent +DEFAULT_DB=BASE_DIR/'instance_seed'/'ted.db' +INDEXES={ + 'uq_saved_talk_user_talk':'CREATE UNIQUE INDEX uq_saved_talk_user_talk ON saved_talk(user_id,talk_id)', + 'uq_registration_user_event':'CREATE UNIQUE INDEX uq_registration_user_event ON registration(user_id,event_id)', +} + +def migrate_database(database_path: str|Path=DEFAULT_DB)->int: + con=sqlite3.connect(database_path) + try: + existing={row[0] for row in con.execute("SELECT name FROM sqlite_master WHERE type='index'")};created=0 + for name,statement in INDEXES.items(): + if name not in existing:con.execute(statement);created+=1 + con.commit();return created + finally:con.close() + +def main()->None: + parser=argparse.ArgumentParser();parser.add_argument('database',nargs='?',default=str(DEFAULT_DB));args=parser.parse_args();created=migrate_database(args.database);print(f'TED seed migration complete: {created} indexes created.') +if __name__=='__main__':main() diff --git a/sites/ted/requirements.txt b/sites/ted/requirements.txt index fb675a95..ce9fbfc8 100644 --- a/sites/ted/requirements.txt +++ b/sites/ted/requirements.txt @@ -1,2 +1,3 @@ Flask Flask-SQLAlchemy +Flask-WTF diff --git a/sites/ted/scraped_data/.gitkeep b/sites/ted/scraped_data/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/sites/ted/static/css/main.css b/sites/ted/static/css/main.css index f4a9f66b..8d599c05 100644 --- a/sites/ted/static/css/main.css +++ b/sites/ted/static/css/main.css @@ -9,8 +9,9 @@ body { margin: 0; font-family: Arial, Helvetica, sans-serif; color: var(--ink); background: #fff; } a { color: inherit; text-decoration: none; } img { display: block; width: 100%; object-fit: cover; } -button, .button { border: 0; background: #111; color: #fff; padding: 11px 16px; font-weight: 700; cursor: pointer; } +button, .button { border: 1px solid #111; background: #111; color: #fff; padding: 11px 16px; font-weight: 700; cursor: pointer; } input, select { border: 1px solid var(--line); padding: 11px 12px; font: inherit; width: 100%; } +a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible { outline: 3px solid #2f6fed; outline-offset: 2px; } .topbar { position: sticky; top: 0; z-index: 5; display: grid; grid-template-columns: auto auto minmax(240px, 1fr) auto; gap: 24px; align-items: center; padding: 0 28px; min-height: 64px; background: #fff; border-bottom: 1px solid var(--line); } .brand { display: flex; align-items: baseline; gap: 12px; } @@ -18,6 +19,8 @@ input, select { border: 1px solid var(--line); padding: 11px 12px; font: inherit .brand small { color: var(--muted); font-size: 13px; white-space: nowrap; } nav, .auth { display: flex; gap: 18px; align-items: center; font-size: 13px; font-weight: 700; text-transform: uppercase; } .join { color: var(--red); } +.logout-form { margin: 0; } +.logout-form button { border: 0; padding: 0; background: transparent; color: var(--ink); font: inherit; text-transform: uppercase; } .quick-search { display: flex; gap: 8px; } .quick-search button { background: var(--red); } .flashes { max-width: 1180px; margin: 16px auto 0; padding: 0 24px; } @@ -57,10 +60,12 @@ main { min-height: 68vh; } .split { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; } .list { display: grid; gap: 8px; } .row-link { display: grid; gap: 4px; min-width: 0; padding: 14px 0; border-bottom: 1px solid var(--line); } +.row-link > a { display: grid; gap: 4px; min-width: 0; } .row-link span { color: var(--muted); line-height: 1.35; } .page-head { display: grid; gap: 14px; border-bottom: 1px solid var(--line); } .page-head p { max-width: 720px; color: var(--muted); } -.filters { display: grid; grid-template-columns: minmax(220px, 1fr) 180px auto; gap: 12px; max-width: 720px; } +.filters { display: grid; grid-template-columns: minmax(150px, 1fr) minmax(170px, 1fr) minmax(180px, 1fr) auto; gap: 12px; max-width: 940px; align-items: end; } +.filters label { display: grid; gap: 6px; color: var(--muted); font-size: 13px; font-weight: 700; } .detail-hero { display: grid; grid-template-columns: minmax(360px, 1.08fr) minmax(300px, 0.92fr); gap: 38px; align-items: start; } .detail-hero img { aspect-ratio: 16 / 9; } @@ -71,6 +76,7 @@ main { min-height: 68vh; } .stats dt { color: var(--muted); font-size: 12px; text-transform: uppercase; } .stats dd { margin: 4px 0 0; font-weight: 800; } .save-form { display: grid; grid-template-columns: 1fr auto; gap: 10px; } +.saved-status { padding: 12px 14px; border-left: 4px solid #138a37; background: #effaf2; font-weight: 700; } .topic-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; } .topic-grid a, .topic-grid article { display: grid; gap: 8px; min-width: 0; min-height: 130px; padding: 20px; background: var(--soft); border-top: 3px solid var(--red); } @@ -87,12 +93,13 @@ main { min-height: 68vh; } .topic-strip a { color: #fff; border: 1px solid #555; padding: 7px 9px; } @media (max-width: 900px) { - .topbar { grid-template-columns: 1fr; gap: 12px; padding: 14px 18px; } + .topbar { position: static; grid-template-columns: 1fr; gap: 12px; padding: 14px 18px; } nav, .auth { flex-wrap: wrap; } .hero, .split, .detail-hero { grid-template-columns: 1fr; } .grid, .topic-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .filters, .save-form { grid-template-columns: 1fr; } .footer { display: grid; } + .topic-strip { justify-content: flex-start; max-width: none; } } @media (max-width: 560px) { .grid, .topic-grid, .stats { grid-template-columns: 1fr; } diff --git a/sites/ted/tasks.jsonl b/sites/ted/tasks.jsonl index 86090768..fcfceaea 100644 --- a/sites/ted/tasks.jsonl +++ b/sites/ted/tasks.jsonl @@ -1,20 +1,20 @@ -{"web_name": "TED", "id": "TED--0", "ques": "Search for talks about AI and open the Anil Seth talk. What is the talk duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_0.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Anil Seth's talk 'Why AI is unlikely to become conscious'. (2) The reported duration MUST be 15 minutes. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the duration is not 15; empty answer."} -{"web_name": "TED", "id": "TED--1", "ques": "Use the TED2026 event filter or search for TED2026 talks, then find the talk about driverless cars and save it to Alice Johnson's account (email: alice.j@test.com, password: TestPass123!) with the note 'mobility planning'.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_1.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST open the TED2026 driverless-cars talk (Waymo, Tekedra Mawakana & Sal Khan). (3) The talk MUST be saved to Alice's account with a note containing 'mobility planning'. (4) Final answer non-empty. FAIL if: no login; the Waymo talk was not saved; the note does not mention 'mobility planning'; empty answer."} -{"web_name": "TED", "id": "TED--2", "ques": "Search the TED site for 'design', then open Debbie Millman's TEDNext 2025 talk that is shorter than 10 minutes. What is its duration in minutes?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_2.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Debbie Millman's TEDNext 2025 talk shorter than 10 minutes ('You got what you wanted. Now what?'). (2) The reported duration MUST be 8 minutes. (3) Final answer non-empty. FAIL if: the correct talk detail page was never opened; the duration is not 8; the 18-minute co-talk was reported instead; empty answer."} -{"web_name": "TED", "id": "TED--3", "ques": "Open the climate and nature playlist and name one talk recorded at the TED Countdown Summit 2025.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_3.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the Climate, Nature, and Conservation playlist. (2) The final answer MUST name a talk title (not only a speaker) that is recorded at TED Countdown Summit 2025 and appears in that playlist. (3) Final answer non-empty. FAIL if the playlist was never opened, only a speaker is named, or the title is not a qualifying talk."} -{"web_name": "TED", "id": "TED--4", "ques": "Log in with the demo account (email: alice.j@test.com, password: TestPass123!) and change the newsletter topic to conservation.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_4.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!) — /login visited. (2) After the run Alice's newsletter topic MUST be 'conservation' (set via /account). (3) Final answer non-empty. FAIL if: no login; the newsletter topic is not 'conservation'; /account never visited; empty answer."} -{"web_name": "TED", "id": "TED--5", "ques": "Find the talk by Malala Yousafzai. What is the exact title of the talk?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_5.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Malala Yousafzai's talk detail page (listing cards show only the speaker, so the detail page must be opened to read the title). (2) The reported title MUST be 'What I got wrong about changing the world'. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the title is wrong or missing; empty answer."} -{"web_name": "TED", "id": "TED--6", "ques": "Search for 'clean energy' and open the result by Kimiko Hirata. What event is it from?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_6.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open Kimiko Hirata's talk 'A cheat sheet for accelerating clean energy'. (2) The reported event MUST be 'TED Countdown Summit 2025'. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the event is wrong; empty answer."} -{"web_name": "TED", "id": "TED--7", "ques": "Register interest in the TED2026 event while logged in as Alice Johnson (email: alice.j@test.com, password: TestPass123!).", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_7.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST register Alice for the TED2026 event via the events page (/events). (3) After the run Alice MUST hold a registration for TED2026 (she was not registered for it initially). (4) Final answer non-empty. FAIL if: no login; Alice is not registered for TED2026 after the run; /events never visited; empty answer."} -{"web_name": "TED", "id": "TED--8", "ques": "Compare Alexi Pappas's \"Why I love my bad days\" with Debbie Millman's \"You got what you wanted. Now what?\" Which one is shorter?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_8.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open BOTH Alexi Pappas's 'Why I love my bad days' and Debbie Millman's 'You got what you wanted. Now what?'. (2) The answer MUST identify Alexi Pappas's talk (5 minutes) as the shorter one. (3) Final answer non-empty. FAIL if: either talk detail page was not opened; the answer names the wrong talk as shorter; empty answer."} -{"web_name": "TED", "id": "TED--9", "ques": "Find a talk about Parkinson's and save it to Alice Johnson's account (email: alice.j@test.com, password: TestPass123!) with a note for public health review.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_9.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!). (2) The agent MUST open Joy Milne's Parkinson's talk ('The nurse who can smell Parkinson's'). (3) The talk MUST be saved to Alice's account with a non-empty note related to public health review. (4) Final answer non-empty. FAIL if: no login; the Parkinson's talk was not saved; the note is empty/unrelated; empty answer."} -{"web_name": "TED", "id": "TED--10", "ques": "Open the AI, Society, and the Future playlist. Which included talk discusses a Supreme Court case?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_10.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the 'AI, Society, and the Future' playlist. (2) The named talk MUST be Neal Kumar Katyal's 'What really won the trillion-dollar Supreme Court case'. (3) Final answer non-empty. FAIL if: the playlist was never opened; the wrong talk is named; empty answer."} -{"web_name": "TED", "id": "TED--11", "ques": "Use filters to find TED2026 talks under 10 minutes and open the talk by Maya Higa.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_11.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST use the talks listing filters with event TED2026 and maximum duration 10 minutes. (2) The agent MUST open Maya Higa's talk 'The wildlife sanctuary you can visit from anywhere'. (3) Final answer non-empty. FAIL if either filter is missing, the listing was not used, or Maya's detail page was not opened."} -{"web_name": "TED", "id": "TED--12", "ques": "Log in with the demo account (email: alice.j@test.com, password: TestPass123!) and remove one saved talk that is not about AI from the account page.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_12.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST log in as Alice (alice.j@test.com / TestPass123!) — /login visited. (2) The agent MUST remove exactly one saved talk that is NOT about AI from /account. (3) After the run Alice MUST have exactly 3 saved talks, with the AI talk ('How I created OpenClaw...') retained and the removed talk not being the AI one. (4) Final answer non-empty. FAIL if: no login; the AI talk was removed; not exactly one talk removed; /account never visited; empty answer."} -{"web_name": "TED", "id": "TED--13", "ques": "Find the science topic page and identify the TEDx talk specifically about wine tasting.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_13.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST reach the wine-tasting talk via the science topic. (2) The final answer MUST identify the speaker Qian Janice Wang. (3) Final answer non-empty. FAIL if the detail page was never opened or only the title is reported without the speaker."} -{"web_name": "TED", "id": "TED--14", "ques": "Search for 'architecture 3D printing' and open the talk about traditional architecture. Who is the speaker?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_14.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST search 'architecture 3D printing' and open the traditional-architecture talk. (2) The reported speaker MUST be Riyad Joucka. (3) Final answer non-empty. FAIL if: the talk detail page was never opened; the speaker is wrong (e.g. Kate Canales); empty answer."} -{"web_name": "TED", "id": "TED--15", "ques": "Find the music topic talks by Akoth Jumadi and Mr. Lu and by Turkana Sessions. Which one has more views?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_15.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open BOTH music talks — Akoth Jumadi and Mr. Lu, and Turkana Sessions. (2) The answer MUST identify Turkana Sessions as having more views. (3) Final answer non-empty. FAIL if: either talk detail page was not opened; the answer names the wrong talk; empty answer."} -{"web_name": "TED", "id": "TED--16", "ques": "Create a new account, save the Peter Steinberger AI agent talk, then confirm it appears under saved talks.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_16.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST register a new account (/register). (2) The agent MUST save Peter Steinberger's talk 'How I created OpenClaw, the breakthrough AI agent'. (3) The agent MUST confirm it on the account page (/account), and the new (non-seed) user MUST have that talk saved. (4) Final answer non-empty. FAIL if: no new account created; the OpenClaw talk not saved by the new user; /account never visited; empty answer."} -{"web_name": "TED", "id": "TED--17", "ques": "Open events and identify the month scheduled for the TEDNext 2025 event.", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_17.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST open the events page (/events). (2) The final answer MUST state that TEDNext 2025 is scheduled for November 2025. (3) Final answer non-empty. FAIL if the event is not identified or either November/2025 is missing."} -{"web_name": "TED", "id": "TED--18", "ques": "Use the talks filters to find TED2026 AI talks under 20 minutes. Open both Peter Steinberger's 'How I created OpenClaw, the breakthrough AI agent' and Anil Seth's 'Why AI is unlikely to become conscious'. Which talk has more views, and by exactly how many views?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_18.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST use the talks listing with TED2026, AI, and under-20-minute filters. (2) The agent MUST open both specified talk detail pages. (3) It MUST compare the visible view counts and identify Peter Steinberger's OpenClaw talk as higher by exactly 359862 views. (4) Final answer non-empty. FAIL if any filter/detail/comparison step is missing or the arithmetic is wrong."} -{"web_name": "TED", "id": "TED--19", "ques": "Use the talks filters to find TEDNext 2025 culture talks under 10 minutes. Open Nayeema Raza's '3 habits to practice curiosity - and escape your phone' and Kate Canales's 'The accidental brilliance of makeshift signs'. Which has more views, and what is the exact difference?", "web": "http://localhost:40016/", "upstream_url": "https://www.ted.com/", "verifier_path": "sites/ted/verify/verify_19.py", "judge_rubric": "FACT CHECKPOINTS: (1) The agent MUST use the talks listing with TEDNext 2025, culture, and under-10-minute filters. (2) The agent MUST open both specified talk detail pages. (3) It MUST identify Nayeema Raza's talk as higher and report the exact visible-count difference of 351132 views. (4) Final answer non-empty. FAIL if filters/details/comparison/arithmetic are missing or incorrect."} +{"web_name":"TED","id":"TED--0","ques":"Search for 'AI', open Anil Seth's 'Why AI is unlikely to become conscious', and report its duration in minutes.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_0.py","judge_rubric":"FACT CHECKPOINTS: (1) A same-origin /search?q=AI visit must precede a click to Anil Seth's exact detail page. (2) The answer must affirmatively report 15 minutes. (3) The complete database must remain unchanged. FAIL on missing navigation, an off-origin URL, a negated/wrong duration, an empty answer, or any database mutation."} +{"web_name":"TED","id":"TED--1","ques":"Sign in as Alice Johnson (email: alice.j@test.com, password: TestPass123!). Use the talks event filter for TED2026, open the driverless-cars talk by Tekedra Mawakana and Sal Khan, and save it with the exact note 'mobility planning'. Confirm the save.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_1.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must submit Alice's login and visit /talks with event=TED2026 before opening the exact Waymo detail page and submitting Save. (2) Alice's after-state must equal her initial saved list plus exactly that talk with note exactly 'mobility planning'. (3) No table except saved_talk may change and the answer must be non-empty. FAIL on a wrong user, missing filter/detail/action, wrong note, extra state change, or empty answer."} +{"web_name":"TED","id":"TED--2","ques":"Search the TED site for 'design', open Debbie Millman's TEDNext 2025 talk 'You got what you wanted. Now what?', and report its duration in minutes.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_2.py","judge_rubric":"FACT CHECKPOINTS: (1) A same-origin /search?q=design visit must precede a click to Debbie Millman's exact detail page. (2) The answer must affirmatively report 8 minutes. (3) The complete database must remain unchanged. FAIL on missing navigation, the 18-minute co-talk, a wrong/negated answer, or any database mutation."} +{"web_name":"TED","id":"TED--3","ques":"Open the Climate, Nature, and Conservation playlist. Open its talks in playlist order until you find the first one recorded at TED Countdown Summit 2025, then report its exact title.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_3.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must open Playlists, the Climate, Nature, and Conservation playlist, and the first three playlist talks in order through visible links. (2) The answer must report the first qualifying title exactly: 'Conservation: a love story'. (3) The complete database must remain unchanged. FAIL on skipped/out-of-order navigation, speaker-only or wrong title, or any database mutation."} +{"web_name":"TED","id":"TED--4","ques":"Sign in as Alice Johnson (email: alice.j@test.com, password: TestPass123!), open the account page, change the newsletter topic to 'conservation', and confirm the update.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_4.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must submit Alice's login and submit the account form. (2) The after-state user table must equal the initial table except Alice's newsletter_topic becomes 'conservation'. (3) No other table may change and the answer must be non-empty. FAIL on wrong identity, missing actions, extra profile/state changes, or empty answer."} +{"web_name":"TED","id":"TED--5","ques":"Search for 'Malala Yousafzai', open her talk, and report its exact title.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_5.py","judge_rubric":"FACT CHECKPOINTS: (1) A same-origin search for Malala Yousafzai must precede a click to her exact detail page. (2) The answer must affirmatively contain the exact title 'What I got wrong about changing the world'. (3) The complete database must remain unchanged. FAIL on missing navigation, wrong/negated title, or state mutation."} +{"web_name":"TED","id":"TED--6","ques":"Search for 'clean energy', open Kimiko Hirata's talk, and report its event.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_6.py","judge_rubric":"FACT CHECKPOINTS: (1) A same-origin /search?q=clean energy visit must precede a click to Kimiko Hirata's exact detail page. (2) The answer must affirmatively report 'TED Countdown Summit 2025'. (3) The complete database must remain unchanged. FAIL on missing navigation, wrong/negated event, or state mutation."} +{"web_name":"TED","id":"TED--7","ques":"Sign in as Alice Johnson (email: alice.j@test.com, password: TestPass123!), open Events, register interest in TED2026, and confirm the registration.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_7.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must submit Alice's login, open Events, submit a registration, and reach Account. (2) Alice's registrations must gain exactly one TED2026 waitlisted row while all existing rows remain. (3) Only registration may change and the answer must be non-empty. FAIL on wrong identity/event, no or extra state delta, missing actions, or empty answer."} +{"web_name":"TED","id":"TED--8","ques":"Search for and open both Alexi Pappas's 'Why I love my bad days' and Debbie Millman's 'You got what you wanted. Now what?'. Report both durations and identify the shorter talk.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_8.py","judge_rubric":"FACT CHECKPOINTS: (1) Both exact talk details must be opened from visible search-result links. (2) The answer must bind 5 minutes to Alexi Pappas, 8 minutes to Debbie Millman, and affirmatively identify Alexi as shorter. (3) The complete database must remain unchanged. FAIL on a missing detail, swapped/unbound/negated values, wrong result, or state mutation."} +{"web_name":"TED","id":"TED--9","ques":"Sign in as Alice Johnson (email: alice.j@test.com, password: TestPass123!). Search for 'Parkinson', open Joy Milne's talk, and save it with the exact note 'public health review'. Confirm the save.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_9.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must submit Alice's login, search for Parkinson, click Joy Milne's exact detail, and submit Save. (2) Alice's saved list must gain exactly that talk with note exactly 'public health review'. (3) Only saved_talk may change and the answer must be non-empty. FAIL on wrong user/talk/note, missing actions, extra state changes, or empty answer."} +{"web_name":"TED","id":"TED--10","ques":"Open the AI, Society, and the Future playlist, then open the included talk that discusses a Supreme Court case. Report the exact talk title and speaker.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_10.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must open Playlists, the exact AI, Society, and the Future playlist, and the exact Neal Kumar Katyal talk through visible links. (2) The answer must affirmatively bind the exact title to Neal Kumar Katyal. (3) The complete database must remain unchanged. FAIL on missing navigation, a speaker-only/wrong answer, or state mutation."} +{"web_name":"TED","id":"TED--11","ques":"Use the talks listing filters for event TED2026 and a maximum duration of 10 minutes, then open Maya Higa's talk. Confirm the exact title.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_11.py","judge_rubric":"FACT CHECKPOINTS: (1) One same-origin /talks URL must contain event=TED2026 and max_minutes=10 together before Maya Higa's exact detail is clicked from the listing. (2) The answer must affirmatively contain the exact title. (3) The complete database must remain unchanged. FAIL on split/missing filters, direct navigation, wrong title, or state mutation."} +{"web_name":"TED","id":"TED--12","ques":"Sign in as Alice Johnson (email: alice.j@test.com, password: TestPass123!), open the account page, remove exactly one saved talk that is not about AI, and report the exact title you removed.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_12.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must submit Alice's login and submit one Remove action from Account. (2) Exactly one initial saved talk whose topics do not include AI must be removed; every other saved row must remain. (3) The answer must report the exact removed title and only saved_talk may change. FAIL on removing OpenClaw, wrong/extra state changes, or an unbound/empty answer."} +{"web_name":"TED","id":"TED--13","ques":"Open Topics, select science, then open the TEDx talk specifically about wine tasting. Report its exact title and speaker.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_13.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must open Topics, click science to reach /talks?topic=science, then click the exact wine-tasting detail. (2) The answer must affirmatively report both 'The art and science of wine tasting' and Qian Janice Wang. (3) The complete database must remain unchanged. FAIL on skipped/direct navigation, missing title/speaker, or state mutation."} +{"web_name":"TED","id":"TED--14","ques":"Search for 'architecture 3D printing', open the talk about traditional architecture, and report its speaker.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_14.py","judge_rubric":"FACT CHECKPOINTS: (1) A same-origin search for 'architecture 3D printing' must precede a click to Riyad Joucka's exact detail page. (2) The answer must affirmatively report Riyad Joucka. (3) The complete database must remain unchanged. FAIL on selecting the distractor, direct navigation, wrong/negated speaker, or state mutation."} +{"web_name":"TED","id":"TED--15","ques":"Open Topics and select music. Open the talks by Akoth Jumadi and Mr. Lu and by Turkana Sessions. Report both exact view counts and identify which has more views.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_15.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must open Topics, click music, and click both exact talk details from the filtered listing. (2) The answer must bind 2,781 views to Akoth Jumadi and Mr. Lu, 4,223 to Turkana Sessions, and affirmatively identify Turkana as higher. (3) The complete database must remain unchanged. FAIL on missing navigation, swapped/unbound counts, wrong comparison, or state mutation."} +{"web_name":"TED","id":"TED--16","ques":"Create a new account, search for 'OpenClaw', open Peter Steinberger's AI-agent talk, save it, then open the account page and report the exact saved-talk title.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_16.py","judge_rubric":"FACT CHECKPOINTS: (1) The trajectory must submit Register, reach Account, search OpenClaw, click Peter Steinberger's exact detail, submit Save, and return to Account. (2) Exactly one non-seed user must be added and that user must have exactly the OpenClaw saved row. (3) Only user and saved_talk may change; the answer must report the exact saved title. FAIL on use of a seed user, missing actions, wrong/extra state, or empty answer."} +{"web_name":"TED","id":"TED--17","ques":"Open Events and report the scheduled month and year for TEDNext 2025.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_17.py","judge_rubric":"FACT CHECKPOINTS: (1) The same-origin Events page must be visited. (2) The answer must affirmatively bind TEDNext 2025 to November 2025. (3) The complete database must remain unchanged. FAIL on missing navigation, incomplete/negated date, or state mutation."} +{"web_name":"TED","id":"TED--18","ques":"Use the talks listing filters for event TED2026, topic AI, and a maximum duration of 20 minutes. Open both Peter Steinberger's 'How I created OpenClaw, the breakthrough AI agent' and Anil Seth's 'Why AI is unlikely to become conscious'. Report both exact view counts, identify the talk with more views, and give the exact difference.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_18.py","judge_rubric":"FACT CHECKPOINTS: (1) One same-origin /talks URL must contain event=TED2026, topic=ai, and max_minutes=20 together before both exact details are clicked from that listing. (2) The answer must bind 551,544 views to Peter and 191,682 to Anil, affirmatively identify Peter as higher, and report difference 359,862. (3) The complete database must remain unchanged. FAIL on missing/split filters, direct navigation, swapped/unbound counts, wrong arithmetic, negation, or state mutation."} +{"web_name":"TED","id":"TED--19","ques":"Use the talks listing filters for event TEDNext 2025, topic culture, and a maximum duration of 10 minutes. Open Nayeema Raza's '3 habits to practice curiosity - and escape your phone' and Kate Canales's 'The accidental brilliance of makeshift signs'. Report both exact view counts, identify the talk with more views, and give the exact difference.","web":"http://localhost:40019/","upstream_url":"https://www.ted.com/","verifier_path":"sites/ted/verify/verify_19.py","judge_rubric":"FACT CHECKPOINTS: (1) One same-origin /talks URL must contain event=TEDNext 2025, topic=culture, and max_minutes=10 together before both exact details are clicked from that listing. (2) The answer must bind 554,563 views to Nayeema and 203,431 to Kate, affirmatively identify Nayeema as higher, and report difference 351,132. (3) The complete database must remain unchanged. FAIL on missing/split filters, direct navigation, swapped/unbound counts, wrong arithmetic, negation, or state mutation."} diff --git a/sites/ted/templates/_talk_card.html b/sites/ted/templates/_talk_card.html index c85ac151..3709d900 100644 --- a/sites/ted/templates/_talk_card.html +++ b/sites/ted/templates/_talk_card.html @@ -1,10 +1,10 @@ diff --git a/sites/ted/templates/account.html b/sites/ted/templates/account.html index 0ab7441e..abcd5025 100644 --- a/sites/ted/templates/account.html +++ b/sites/ted/templates/account.html @@ -6,11 +6,12 @@

{{ user.display_name }}

+

Profile

- - - - + + + +
@@ -28,7 +29,10 @@

Event registrations

{% for saved_item in saved %} {% else %}

No saved talks yet.

diff --git a/sites/ted/templates/base.html b/sites/ted/templates/base.html index 17822b5f..310495ad 100644 --- a/sites/ted/templates/base.html +++ b/sites/ted/templates/base.html @@ -16,13 +16,16 @@ Attend
{% if current_user %} {{ current_user.display_name }} - Log out +
+ + +
{% else %} Log in Join diff --git a/sites/ted/templates/events.html b/sites/ted/templates/events.html index f52cd9be..5f3ac7cf 100644 --- a/sites/ted/templates/events.html +++ b/sites/ted/templates/events.html @@ -11,8 +11,9 @@

Events

{{ event.city }} - {{ event.month }} - {{ event.track }}

{{ event.capacity }} seats

+ - +
{% endfor %} diff --git a/sites/ted/templates/index.html b/sites/ted/templates/index.html index b8f68679..07b33a9e 100644 --- a/sites/ted/templates/index.html +++ b/sites/ted/templates/index.html @@ -12,10 +12,10 @@

Ideas change everything

{% set lead = featured[0] %} - + {{ lead.speaker }} speaking at {{ lead.event }} {{ lead.talk_type }} -

{{ lead.speaker }}

-

{{ lead.published_at|date_label }}

+

{{ lead.title }}

+

{{ lead.speaker }} · {{ lead.published_at|date_label }}

diff --git a/sites/ted/templates/login.html b/sites/ted/templates/login.html index 151cafd2..cdeaa96b 100644 --- a/sites/ted/templates/login.html +++ b/sites/ted/templates/login.html @@ -2,9 +2,10 @@ {% block content %}
+

Log in

- - + +
diff --git a/sites/ted/templates/register.html b/sites/ted/templates/register.html index 60f1412e..2b52d7df 100644 --- a/sites/ted/templates/register.html +++ b/sites/ted/templates/register.html @@ -2,11 +2,12 @@ {% block content %}
+

Create account

- - - - + + + +
diff --git a/sites/ted/templates/talk_detail.html b/sites/ted/templates/talk_detail.html index 223145a5..83233623 100644 --- a/sites/ted/templates/talk_detail.html +++ b/sites/ted/templates/talk_detail.html @@ -2,7 +2,7 @@ {% block title %}{{ talk.title }} | TED{% endblock %} {% block content %}
- + {{ talk.speaker }} speaking at {{ talk.event }}

{{ talk.event }} - {{ talk.talk_type }}

{{ talk.title }}

@@ -11,12 +11,18 @@

{{ talk.title }}

Duration
{{ talk.minutes }} minutes
Published
{{ talk.published_at|date_label }}
-
Views
{{ talk.views_label }}
+
Views
{{ talk.exact_views_label }}
-
- - -
+ {% if saved %} +

This talk is saved to your account.

+ {% else %} +
+ + + + +
+ {% endif %}
diff --git a/sites/ted/templates/talks.html b/sites/ted/templates/talks.html index 14e23a19..8f710e98 100644 --- a/sites/ted/templates/talks.html +++ b/sites/ted/templates/talks.html @@ -5,15 +5,26 @@

Watch

{% if topic %}Talks about {{ topic }}{% else %}TED Talks{% endif %}

+ + + +
diff --git a/sites/ted/verify/test_app.py b/sites/ted/verify/test_app.py new file mode 100644 index 00000000..8e23fb31 --- /dev/null +++ b/sites/ted/verify/test_app.py @@ -0,0 +1,66 @@ +"""HTTP-level regression tests for the TED mirror.""" +from __future__ import annotations +import importlib +import os +import re +import shutil +import sqlite3 +import sys +import unittest +from pathlib import Path + +SITE_DIR=Path(__file__).resolve().parents[1] +SEED=SITE_DIR/'instance_seed'/'ted.db' +RUNTIME=SITE_DIR/'instance'/'ted.db' + +def csrf_token(response)->str: + match=re.search(rb'name="csrf_token" value="([^"]+)"',response.data) + if not match:raise AssertionError(f'CSRF token missing from {response.request.path}') + return match.group(1).decode() + +class AppTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + shutil.rmtree(SITE_DIR/'instance',ignore_errors=True);(SITE_DIR/'instance').mkdir();shutil.copy2(SEED,RUNTIME) + os.environ['TED_SECRET_KEY']='test-only-secret' + sys.path.insert(0,str(SITE_DIR));cls.module=importlib.import_module('app');cls.app=cls.module.app;cls.app.config.update(TESTING=True) + @classmethod + def tearDownClass(cls): + with cls.app.app_context():cls.module.db.session.remove() + shutil.rmtree(SITE_DIR/'instance',ignore_errors=True) + def setUp(self):self.client=self.app.test_client() + def login(self,email='alice.j@test.com',next_url=None): + route='/login'+(f'?next={next_url}' if next_url else '');page=self.client.get(route);return self.client.post(route,data={'csrf_token':csrf_token(page),'email':email,'password':'TestPass123!'},follow_redirects=False) + def snapshot(self): + con=sqlite3.connect(RUNTIME) + try: + tables=[r[0] for r in con.execute("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name")];return {table:con.execute(f'SELECT * FROM "{table}" ORDER BY rowid').fetchall() for table in tables} + finally:con.close() + def test_all_get_templates_render(self): + paths=['/','/talks','/talks?topic=ai&event=TED2026&max_minutes=20','/search?q=AI','/topics','/playlists','/events','/login','/register','/_health'] + with self.app.app_context(): + paths += [f'/talks/{row.slug}' for row in self.module.Talk.query.all()];paths += [f'/playlists/{row.slug}' for row in self.module.Playlist.query.all()];paths += [f'/topics/{topic}' for topic in self.module.available_topics()] + for route in paths: + with self.subTest(route=route):self.assertEqual(self.client.get(route,follow_redirects=True).status_code,200) + def test_csrf_and_logout_method(self): + self.assertEqual(self.client.get('/logout').status_code,405) + for route in ('/logout','/events','/account','/save/anil-seth-why-ai-is-unlikely-to-become-conscious'): + with self.subTest(route=route):self.assertEqual(self.client.post(route).status_code,400) + def test_external_login_redirect_is_rejected(self): + response=self.login(next_url='//evil.invalid');self.assertEqual(response.status_code,302);self.assertEqual(response.headers['Location'],'/account') + def test_login_page_does_not_disclose_credentials(self): + body=self.client.get('/login').get_data(as_text=True);self.assertNotIn('alice.j@test.com',body);self.assertNotIn('TestPass123!',body) + def test_combined_filters_and_exact_view_counts(self): + body=self.client.get('/talks?topic=ai&event=TED2026&max_minutes=20').get_data(as_text=True);self.assertIn('Peter Steinberger',body);self.assertIn('Anil Seth',body) + detail=self.client.get('/talks/peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent').get_data(as_text=True);self.assertIn('551,544',detail) + def test_search_handles_simple_morphology(self): + body=self.client.get('/search?q=architectures').get_data(as_text=True);self.assertIn('Riyad Joucka',body) + def test_oversized_registration_is_rejected(self): + response=self.client.post('/register',data=b'x'*(65*1024),content_type='application/x-www-form-urlencoded');self.assertEqual(response.status_code,413) + def test_get_routes_leave_database_unchanged(self): + before=self.snapshot() + for route in ('/','/talks','/talks?topic=ai&event=TED2026&max_minutes=20','/search?q=AI','/topics','/events'):self.assertEqual(self.client.get(route).status_code,200) + self.assertEqual(before,self.snapshot()) + def test_invalid_registration_is_rejected_without_state_change(self): + before=self.snapshot();page=self.client.get('/register');response=self.client.post('/register',data={'csrf_token':csrf_token(page),'display_name':'','username':'!!!','email':'bad','password':'short'});self.assertEqual(response.status_code,400);self.assertEqual(before,self.snapshot()) +if __name__=='__main__':unittest.main() diff --git a/sites/ted/verify/test_environment_quality.py b/sites/ted/verify/test_environment_quality.py new file mode 100644 index 00000000..45b6e96a --- /dev/null +++ b/sites/ted/verify/test_environment_quality.py @@ -0,0 +1,52 @@ +"""Regression checks for the reviewed TED mirror.""" +from __future__ import annotations +import hashlib +import json +import shutil +import sqlite3 +import subprocess +import sys +import tempfile +import unittest +from pathlib import Path + +SITE_DIR=Path(__file__).resolve().parents[1] +ROOT=SITE_DIR.parents[1] +SEED=SITE_DIR/'instance_seed'/'ted.db' + +class EnvironmentQualityTests(unittest.TestCase): + def test_site_registration_and_task_port(self): + startup=(ROOT/'websyn_start.sh').read_text();control=(ROOT/'control_server.py').read_text();docker=(ROOT/'Dockerfile').read_text() + self.assertIn('target ted)',startup);self.assertIn("'target', 'ted'",control);self.assertIn('40000-40019',docker) + rows=[json.loads(line) for line in (SITE_DIR/'tasks.jsonl').read_text().splitlines() if line.strip()];self.assertEqual(len(rows),20) + for i,row in enumerate(rows):self.assertEqual(row['id'],f'TED--{i}');self.assertEqual(row['web'],'http://localhost:40019/');self.assertEqual(row['verifier_path'],f'sites/ted/verify/verify_{i}.py');self.assertNotIn('answer',row) + def test_asset_override_points_to_live_ted_revision(self): + script=(ROOT/'scripts/fetch_assets.sh').read_text();self.assertIn('TED_ASSETS_REVISION="${TED_ASSETS_REVISION:-597623a2f32898afa12e3bbeda15520f559aa7c7}"',script);self.assertTrue(SEED.is_file()) + def test_seed_ground_truth(self): + con=sqlite3.connect(SEED) + try: + self.assertEqual(con.execute('select count(*) from talk').fetchone()[0],64);self.assertEqual(con.execute('select count(*) from user').fetchone()[0],4) + facts={r[0]:(r[1],r[2],r[3]) for r in con.execute("select slug,duration_seconds,views,event from talk where slug in ('anil-seth-why-ai-is-unlikely-to-become-conscious','peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent','nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone','kate-canales-the-accidental-brilliance-of-makeshift-signs')")} + self.assertEqual(facts['anil-seth-why-ai-is-unlikely-to-become-conscious'],(897,191682,'TED2026'));self.assertEqual(facts['peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent'],(1055,551544,'TED2026'));self.assertEqual(551544-191682,359862);self.assertEqual(554563-203431,351132) + finally:con.close() + def test_migration_is_idempotent(self): + with tempfile.TemporaryDirectory(prefix='ted-migration-') as temp: + database=Path(temp)/'ted.db';shutil.copy2(SEED,database);con=sqlite3.connect(database) + try: + con.execute('DROP INDEX uq_saved_talk_user_talk');con.execute('DROP INDEX uq_registration_user_event');con.commit() + finally:con.close() + command=[sys.executable,str(SITE_DIR/'migrate_seed.py'),str(database)];first=subprocess.run(command,capture_output=True,text=True,check=True);first_hash=hashlib.sha256(database.read_bytes()).hexdigest();second=subprocess.run(command,capture_output=True,text=True,check=True);second_hash=hashlib.sha256(database.read_bytes()).hexdigest();self.assertIn('2 indexes created',first.stdout);self.assertIn('0 indexes created',second.stdout);self.assertEqual(first_hash,second_hash) + def test_post_forms_have_csrf_tokens(self): + missing=[] + for template in (SITE_DIR/'templates').glob('*.html'): + lines=template.read_text().splitlines() + for i,line in enumerate(lines): + if ' Neal Kumar Katyal, 'What really won the trillion-dollar -Supreme Court case'. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav ai-and-society playlist | answer names Neal Katyal / the Supreme Court talk -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - +from verify_lib import Judge, check_common, check_read_only, clicked_transition, contains_all, final_answer, load_run, parse_args, visited_in_order +TASK_ID="TED--10";PLAYLIST="/playlists/ai-and-society";PATH="/talks/neal-kumar-katyal-what-really-won-the-trillion-dollar-supreme-court-case" def main(): - a = parse_args() - j = Judge('TED--10', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_ai_society", navigated_to(t, "playlists/ai-and-society"), - f"navigated={navigated_to(t, 'playlists/ai-and-society')}") - j.check("answer_supreme_court_talk", - contains_any(fa, ["Neal Kumar Katyal", "Neal Katyal", - "What really won the trillion-dollar Supreme Court case"]), - f"final={fa!r}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("ordered_playlist_to_talk",visited_in_order(t,[("/playlists",{}),(PLAYLIST,{}),(PATH,{})]),"playlists, named playlist, detail");j.check("clicked_playlist_and_talk",clicked_transition(t,"/playlists",PLAYLIST) and clicked_transition(t,PLAYLIST,PATH),"visible links used");j.check("answer_title_and_speaker",contains_all(answer,("What really won the trillion-dollar Supreme Court case","Neal Kumar Katyal")),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_11.py b/sites/ted/verify/verify_11.py index 91b65e05..17a1b6cc 100644 --- a/sites/ted/verify/verify_11.py +++ b/sites/ted/verify/verify_11.py @@ -1,14 +1,6 @@ #!/usr/bin/env python3 -"""Verifier for TED--11 filtered TED2026 under-10 navigation.""" -import os,sys -from urllib.parse import parse_qs,urlparse -sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) -from verify_lib import load_run,navigated_to,final_answer,Judge,parse_args -SLUG='maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere' +from verify_lib import Judge, check_common, check_read_only, clicked_transition, contains_all, final_answer, load_run, parse_args, visited_in_order, visited_query +TASK_ID="TED--11";PATH="/talks/maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere";FILTERS={"event":"TED2026","max_minutes":"10"} def main(): - a=parse_args(); j=Judge('TED--11',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); ok=False - for s in t.get('steps',[]): - u=s.get('url',''); q=parse_qs(urlparse(u).query) - if urlparse(u).path=='/talks' and q.get('event')==['TED2026'] and q.get('max_minutes')==['10']: ok=True; break - j.check('nav_filtered_ted2026_under10',ok,f'filtered={ok}'); j.check('nav_maya_higa',navigated_to(t,SLUG),f'navigated={navigated_to(t,SLUG)}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() -if __name__=='__main__': main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("exact_listing_filters",visited_query(t,"/talks",FILTERS),repr(FILTERS));j.check("ordered_filter_to_detail",visited_in_order(t,[("/talks",FILTERS),(PATH,{})]),"filtered listing before detail");j.check("clicked_maya_result",clicked_transition(t,"/talks",PATH),"detail opened from listing");j.check("answer_exact_title",contains_all(answer,("The wildlife sanctuary you can visit from anywhere",)),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_12.py b/sites/ted/verify/verify_12.py index d8569915..6bd8e870 100644 --- a/sites/ted/verify/verify_12.py +++ b/sites/ted/verify/verify_12.py @@ -1,47 +1,13 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--12. - -Log in as Alice and remove one saved talk that is NOT about AI. Seed baseline: -4 saved talks, exactly one about AI ('How I created OpenClaw, the breakthrough -AI agent'). A correct run removes one non-AI talk, leaving 3 with OpenClaw kept. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav /login,/account | DB after: exactly one talk removed, OpenClaw retained, removed talk is not the AI one -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -EMAIL = "alice.j@test.com" -AI_MARKER = "openclaw" - +import json +from verify_lib import Judge, changed_tables, check_common, contains_all, final_answer, load_run, login_submitted_as, parse_args, resolve_db, saved_snapshot, submitted_from_path, table_snapshot, visited_in_order +TASK_ID="TED--12";EMAIL="alice.j@test.com" def main(): - a = parse_args() - j = Judge('TED--12', a.no_llm) - t = load_run(a.run_dir) - after = resolve_db(a.after_db, a.container, "instance") - init = resolve_db(a.initial_db, a.container, "instance_seed") - after_titles = saved_titles_for(after, EMAIL) - init_titles = saved_titles_for(init, EMAIL) - removed = ([] if (after_titles is None or init_titles is None) - else [x for x in init_titles if norm(x) not in {norm(y) for y in after_titles}]) - j.check("nav_login", navigated_to(t, "/login"), f"navigated={navigated_to(t, '/login')}") - j.check("nav_account", navigated_to(t, "/account"), f"navigated={navigated_to(t, '/account')}") - j.check("db_exactly_one_removed", - after_titles is not None and init_titles is not None - and len(after_titles) == len(init_titles) - 1, - f"initial={init_titles} after={after_titles}") - j.check("db_ai_talk_retained", - after_titles is not None and any(AI_MARKER in norm(x) for x in after_titles), - f"after={after_titles}") - j.check("db_removed_not_ai", - len(removed) == 1 and AI_MARKER not in norm(removed[0]), f"removed={removed}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("login_as_alice",login_submitted_as(t,EMAIL),EMAIL);j.check("ordered_account_flow",visited_in_order(t,[("/login",{}),("/account",{})]),"login then account");j.check("remove_submitted",submitted_from_path(t,"/account","/account"),"remove form submitted") + initial=resolve_db(a.initial_db,a.container,"instance_seed");after=resolve_db(a.after_db,a.container,"instance");j.check("databases_readable",bool(initial and after),f"initial={initial} after={after}") + if initial and after: + before=saved_snapshot(initial,EMAIL);now=saved_snapshot(after,EMAIL);now_ids={r['id'] for r in now};removed=[r for r in before if r['id'] not in now_ids] + before_all=table_snapshot(initial,"saved_talk");after_all=table_snapshot(after,"saved_talk") + non_ai=len(removed)==1 and "ai" not in {v.casefold() for v in json.loads(removed[0]['topics_json'])};j.check("one_non_ai_talk_removed",non_ai and len(now)==len(before)-1 and all(r in before for r in now),repr(removed));j.check("complete_saved_table_delta",len(after_all)==len(before_all)-1 and all(row in before_all for row in after_all),f"before={len(before_all)} after={len(after_all)}");j.check("answer_removed_title",len(removed)==1 and contains_all(answer,(removed[0]['title'],)),repr(answer));j.check("only_saved_talk_changed",changed_tables(initial,after)=={"saved_talk"},repr(changed_tables(initial,after))) + j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_13.py b/sites/ted/verify/verify_13.py index 2f4990f6..b819d40b 100644 --- a/sites/ted/verify/verify_13.py +++ b/sites/ted/verify/verify_13.py @@ -1,9 +1,6 @@ #!/usr/bin/env python3 -"""Verifier for TED--13 science wine-tasting speaker.""" -import os,sys -sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) -from verify_lib import load_run,navigated_to,final_answer,contains_all,Judge,parse_args -SLUG='qian-janice-wang-the-art-and-science-of-wine-tasting' +from verify_lib import Judge, check_common, check_read_only, clicked_transition, contains_all, final_answer, load_run, parse_args, visited_in_order +TASK_ID="TED--13";PATH="/talks/qian-janice-wang-the-art-and-science-of-wine-tasting" def main(): - a=parse_args(); j=Judge('TED--13',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); j.check('nav_wine_talk',navigated_to(t,SLUG),f'navigated={navigated_to(t,SLUG)}'); j.check('answer_speaker_exact',contains_all(fa,['Qian Janice Wang']),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() -if __name__=='__main__': main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("ordered_science_topic_flow",visited_in_order(t,[("/topics",{}),("/talks",{"topic":"science"}),(PATH,{})]),"topics, science listing, detail");j.check("clicked_science_and_talk",clicked_transition(t,"/topics","/talks") and clicked_transition(t,"/talks",PATH),"visible links used");j.check("answer_title_and_speaker",contains_all(answer,("The art and science of wine tasting","Qian Janice Wang")),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_14.py b/sites/ted/verify/verify_14.py index b72acfc1..6f428ec8 100644 --- a/sites/ted/verify/verify_14.py +++ b/sites/ted/verify/verify_14.py @@ -1,32 +1,6 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--14. - -Search 'architecture 3D printing', open the talk about traditional architecture, -report the speaker. -> Riyad Joucka ('Reimagining traditional architecture for -modern needs'). Kate Canales's makeshift-signs talk is the near-miss distractor. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav Riyad Joucka talk detail | answer names the speaker Riyad Joucka -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -SLUG = "riyad-joucka-reimagining-traditional-architecture-for-modern-needs" - +from verify_lib import Judge, check_common, check_read_only, clicked_transition, contains_all, final_answer, load_run, parse_args, visited_in_order +TASK_ID="TED--14";PATH="/talks/riyad-joucka-reimagining-traditional-architecture-for-modern-needs" def main(): - a = parse_args() - j = Judge('TED--14', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_riyad", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") - j.check("answer_speaker", contains_all(fa, ["Riyad Joucka"]), f"final={fa!r}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("ordered_architecture_search",visited_in_order(t,[("/search",{"q":"architecture 3D printing"}),(PATH,{})]),"search before detail");j.check("clicked_riyad_result",clicked_transition(t,"/search",PATH),"detail opened from search");j.check("answer_speaker",contains_all(answer,("Riyad Joucka",)),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_15.py b/sites/ted/verify/verify_15.py index 0cbbedca..317bd6d3 100644 --- a/sites/ted/verify/verify_15.py +++ b/sites/ted/verify/verify_15.py @@ -1,38 +1,6 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--15. - -Among the music-topic talks by Akoth Jumadi and Mr. Lu vs Turkana Sessions, -which has more views? -> Turkana Sessions (4,223 views vs 2,781). - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav both talk details | answer names Turkana Sessions as having more views -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -AKOTH = "akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap" -TURKANA = "turkana-sessions-a-musical-journey-through-turkana" - +from verify_lib import Judge, affirmative_contains, check_common, check_read_only, clicked_transition, contains_any, final_answer, load_run, number_bound_in_comparison, parse_args, visited_in_order +TASK_ID="TED--15";A="/talks/akoth-jumadi-and-mr-lu-east-african-sound-meets-cosmic-trap";T="/talks/turkana-sessions-a-musical-journey-through-turkana" def main(): - a = parse_args() - j = Judge('TED--15', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_akoth", navigated_to(t, AKOTH), f"navigated={navigated_to(t, AKOTH)}") - j.check("nav_turkana", navigated_to(t, TURKANA), f"navigated={navigated_to(t, TURKANA)}") - j.check("answer_turkana_more", - contains_any(fa, ["Turkana Sessions", "A musical journey through Turkana"]), - f"final={fa!r}") - ok, ev = llm_text_match(fa, "Turkana Sessions ('A musical journey through Turkana') has more views", - "Which talk has more views: Akoth Jumadi and Mr. Lu, or Turkana Sessions?") - j.check("answer_more_views_llm", ok, ev, llm=True) - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("ordered_music_topic_flow",visited_in_order(t,[("/topics",{}),("/talks",{"topic":"music"}),(A,{}),(T,{})]),"music listing and both details");j.check("clicked_both_music_talks",clicked_transition(t,"/topics","/talks") and clicked_transition(t,"/talks",A) and clicked_transition(t,"/talks",T),"visible links used");j.check("akoth_views_bound",number_bound_in_comparison(answer,2781,("Akoth","Mr. Lu","East African")),repr(answer));j.check("turkana_views_bound",number_bound_in_comparison(answer,4223,("Turkana",)),repr(answer));j.check("turkana_identified_higher",affirmative_contains(answer,"Turkana") and contains_any(answer,("more views","higher")),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_16.py b/sites/ted/verify/verify_16.py index 5284b540..8dfd2af1 100644 --- a/sites/ted/verify/verify_16.py +++ b/sites/ted/verify/verify_16.py @@ -1,43 +1,14 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--16. - -Create a new account, save Peter Steinberger's AI-agent talk ('How I created -OpenClaw, the breakthrough AI agent'), then confirm it appears under saved talks. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav /register + Peter Steinberger talk detail + /account | DB after: a NON-seed user exists with the OpenClaw talk saved -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -SLUG = "peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent" -OPENCLAW = "openclaw" - +from verify_lib import SEED_EMAILS, Judge, changed_tables, check_common, clicked_transition, contains_all, final_answer, load_run, parse_args, resolve_db, row_dicts, submitted_from_path, table_snapshot, user_snapshot, visited_in_order +TASK_ID="TED--16";SLUG="peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent";PATH=f"/talks/{SLUG}";TITLE="How I created OpenClaw, the breakthrough AI agent" def main(): - a = parse_args() - j = Judge('TED--16', a.no_llm) - t = load_run(a.run_dir) - after = resolve_db(a.after_db, a.container, "instance") - emails = user_emails(after) - new_emails = [e for e in (emails or []) if e not in SEED_EMAILS] - saved_by_new = False - for e in new_emails: - titles = saved_titles_for(after, e) or [] - if any(OPENCLAW in norm(x) for x in titles): - saved_by_new = True - break - j.check("nav_register", navigated_to(t, "/register"), f"navigated={navigated_to(t, '/register')}") - j.check("nav_openclaw_talk", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") - j.check("nav_account", navigated_to(t, "/account"), f"navigated={navigated_to(t, '/account')}") - j.check("db_new_user_created", bool(new_emails), f"non_seed_users={new_emails}") - j.check("db_new_user_saved_openclaw", saved_by_new, f"non_seed_users={new_emails}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("ordered_register_save_confirm",visited_in_order(t,[("/register",{}),("/account",{}),("/search",{"q":"OpenClaw"}),(PATH,{}),("/account",{})]),"register, search, detail, account");j.check("registration_submitted",submitted_from_path(t,"/register","/account"),"registration form submitted");j.check("clicked_openclaw_result",clicked_transition(t,"/search",PATH),"detail opened from search");j.check("save_submitted",submitted_from_path(t,PATH,PATH),"save submitted") + initial=resolve_db(a.initial_db,a.container,"instance_seed");after=resolve_db(a.after_db,a.container,"instance");j.check("databases_readable",bool(initial and after),f"initial={initial} after={after}") + if initial and after: + before=user_snapshot(initial);now=user_snapshot(after);before_ids={r['id'] for r in before};new_users=[r for r in now if r['id'] not in before_ids] + saved=[] + if len(new_users)==1:saved=row_dicts(after,"SELECT t.slug,t.title,s.note FROM saved_talk s JOIN talk t ON t.id=s.talk_id WHERE s.user_id=?",(new_users[0]['id'],)) + before_saved=table_snapshot(initial,"saved_talk");after_saved=table_snapshot(after,"saved_talk") + j.check("one_new_nonseed_user",len(new_users)==1 and new_users[0]['email'] not in SEED_EMAILS and len(now)==len(before)+1 and all(r in now for r in before),repr(new_users));j.check("new_user_saved_only_openclaw",len(saved)==1 and saved[0]['slug']==SLUG and len(after_saved)==len(before_saved)+1 and all(row in after_saved for row in before_saved),repr(saved));j.check("only_user_and_saved_changed",changed_tables(initial,after)=={"user","saved_talk"},repr(changed_tables(initial,after)));j.check("answer_exact_saved_title",contains_all(answer,(TITLE,)),repr(answer)) + j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_17.py b/sites/ted/verify/verify_17.py index 240e5178..c396359d 100644 --- a/sites/ted/verify/verify_17.py +++ b/sites/ted/verify/verify_17.py @@ -1,8 +1,6 @@ #!/usr/bin/env python3 -"""Verifier for TED--17 TEDNext 2025 month.""" -import os,sys -sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) -from verify_lib import load_run,navigated_to,final_answer,contains_all,Judge,parse_args +from verify_lib import Judge, check_common, check_read_only, contains_all, final_answer, load_run, parse_args, visited_path +TASK_ID="TED--17" def main(): - a=parse_args(); j=Judge('TED--17',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); j.check('nav_events',navigated_to(t,'/events'),f'navigated={navigated_to(t,"/events")}'); j.check('answer_tednext_november_2025',contains_all(fa,['november','2025']),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() -if __name__=='__main__': main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("opened_events",visited_path(t,"/events"),"events page visited");j.check("answer_event_month_year",contains_all(answer,("TEDNext 2025","November 2025")),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_18.py b/sites/ted/verify/verify_18.py index dc796c11..a6fe1c90 100644 --- a/sites/ted/verify/verify_18.py +++ b/sites/ted/verify/verify_18.py @@ -1,14 +1,6 @@ #!/usr/bin/env python3 -"""Verifier for TED--18: filtered TED2026 AI view-count comparison.""" -import os,sys -sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) -from verify_lib import load_run,navigated_to,final_answer,contains_all,extract_ints,Judge,parse_args -PETER='peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent' -ANIL='anil-seth-why-ai-is-unlikely-to-become-conscious' +from verify_lib import Judge, affirmative_contains, check_common, check_read_only, clicked_transition, contains_any, final_answer, has_number, load_run, number_bound_in_comparison, parse_args, visited_in_order, visited_query +TASK_ID="TED--18";P="/talks/peter-steinberger-how-i-created-openclaw-the-breakthrough-ai-agent";A="/talks/anil-seth-why-ai-is-unlikely-to-become-conscious";FILTERS={"event":"TED2026","topic":"ai","max_minutes":"20"} def main(): - a=parse_args(); j=Judge('TED--18',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url') or s.get('url_after') or s.get('url_before') or '' for s in t.get('steps',[])) - j.check('nav_filtered_ted2026_ai_under20', '/talks?' in urls and 'event=TED2026' in urls and 'topic=ai' in urls and 'max_minutes=20' in urls, f'urls={urls!r}') - j.check('nav_peter',navigated_to(t,PETER),f'navigated={navigated_to(t,PETER)}'); j.check('nav_anil',navigated_to(t,ANIL),f'navigated={navigated_to(t,ANIL)}') - j.check('answer_peter_higher_difference',contains_all(fa,['Peter']) and ('359862' in fa.replace(',','') ),f'final={fa!r}') - j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() -if __name__=='__main__': main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("exact_combined_filters",visited_query(t,"/talks",FILTERS),repr(FILTERS));j.check("filtered_listing_precedes_both",visited_in_order(t,[("/talks",FILTERS),(P,{})]) and visited_in_order(t,[("/talks",FILTERS),(A,{})]),"filtered listing before both details");j.check("clicked_both_results",clicked_transition(t,"/talks",P) and clicked_transition(t,"/talks",A),"both links opened from filtered listing");j.check("peter_views_bound",number_bound_in_comparison(answer,551544,("Peter","OpenClaw")),repr(answer));j.check("anil_views_bound",number_bound_in_comparison(answer,191682,("Anil","conscious")),repr(answer));j.check("exact_difference",has_number(answer,359862),repr(answer));j.check("peter_identified_higher",affirmative_contains(answer,"Peter") and contains_any(answer,("more views","higher")),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_19.py b/sites/ted/verify/verify_19.py index aca6d37c..f239d6fe 100644 --- a/sites/ted/verify/verify_19.py +++ b/sites/ted/verify/verify_19.py @@ -1,13 +1,6 @@ #!/usr/bin/env python3 -"""Verifier for TED--19: filtered TEDNext culture view-count comparison.""" -import os,sys -sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) -from verify_lib import load_run,navigated_to,final_answer,contains_all,Judge,parse_args -NAYEEMA='nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone' -KATE='kate-canales-the-accidental-brilliance-of-makeshift-signs' +from verify_lib import Judge, affirmative_contains, check_common, check_read_only, clicked_transition, contains_any, final_answer, has_number, load_run, number_bound_in_comparison, parse_args, visited_in_order, visited_query +TASK_ID="TED--19";N="/talks/nayeema-raza-3-habits-to-practice-curiosity-and-escape-your-phone";K="/talks/kate-canales-the-accidental-brilliance-of-makeshift-signs";FILTERS={"event":"TEDNext 2025","topic":"culture","max_minutes":"10"} def main(): - a=parse_args(); j=Judge('TED--19',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); urls=' '.join(s.get('url') or s.get('url_after') or s.get('url_before') or '' for s in t.get('steps',[])) - j.check('nav_filtered_tednext_culture_under10','/talks?' in urls and 'event=TEDNext' in urls and 'topic=culture' in urls and 'max_minutes=10' in urls,f'urls={urls!r}') - j.check('nav_nayeema',navigated_to(t,NAYEEMA),f'navigated={navigated_to(t,NAYEEMA)}'); j.check('nav_kate',navigated_to(t,KATE),f'navigated={navigated_to(t,KATE)}') - j.check('answer_nayeema_higher_difference',contains_all(fa,['Nayeema']) and ('351132' in fa.replace(',','') ),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() -if __name__=='__main__': main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("exact_combined_filters",visited_query(t,"/talks",FILTERS),repr(FILTERS));j.check("filtered_listing_precedes_both",visited_in_order(t,[("/talks",FILTERS),(N,{})]) and visited_in_order(t,[("/talks",FILTERS),(K,{})]),"filtered listing before both details");j.check("clicked_both_results",clicked_transition(t,"/talks",N) and clicked_transition(t,"/talks",K),"both links opened from filtered listing");j.check("nayeema_views_bound",number_bound_in_comparison(answer,554563,("Nayeema","curiosity")),repr(answer));j.check("kate_views_bound",number_bound_in_comparison(answer,203431,("Kate","makeshift")),repr(answer));j.check("exact_difference",has_number(answer,351132),repr(answer));j.check("nayeema_identified_higher",affirmative_contains(answer,"Nayeema") and contains_any(answer,("more views","higher")),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_2.py b/sites/ted/verify/verify_2.py index 24972e1f..4e4f538f 100644 --- a/sites/ted/verify/verify_2.py +++ b/sites/ted/verify/verify_2.py @@ -1,34 +1,8 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--2. - -Browse the design topic, open Debbie Millman's TEDNext 2025 talk shorter than -10 minutes, report its duration in minutes. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav Debbie Millman 'You got what you wanted' detail | answer duration == 8 minutes -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -SLUG = "debbie-millman-you-got-what-you-wanted-now-what" - +from verify_lib import Judge, check_common, check_read_only, clicked_transition, contains_any, final_answer, has_number, load_run, parse_args, visited_in_order +TASK_ID="TED--2";PATH="/talks/debbie-millman-you-got-what-you-wanted-now-what" def main(): - a = parse_args() - j = Judge('TED--2', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_debbie_millman", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") - j.check("answer_duration_8", 8 in extract_ints(fa), f"final={fa!r} ints={extract_ints(fa)}") - ok, ev = llm_text_match(fa, "8 minutes", - "What is the duration in minutes of Debbie Millman's talk 'You got what you wanted. Now what?'") - j.check("answer_duration_llm", ok, ev, llm=True) - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID) + j.check("ordered_design_search_to_talk",visited_in_order(t,[("/search",{"q":"design"}),(PATH,{})]),"design search before detail");j.check("clicked_debbie_result",clicked_transition(t,"/search",PATH),"detail opened from search") + j.check("answer_duration",has_number(answer,8) and contains_any(answer,("minute","minutes")),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_3.py b/sites/ted/verify/verify_3.py index d32ade19..6610a158 100644 --- a/sites/ted/verify/verify_3.py +++ b/sites/ted/verify/verify_3.py @@ -1,9 +1,9 @@ #!/usr/bin/env python3 -"""Verifier for TED--3 playlist title answer.""" -import os,sys -sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) -from verify_lib import load_run,navigated_to,final_answer,contains_any,Judge,parse_args -TITLES=['Conservation: a love story','A cheat sheet for accelerating clean energy','How to make transportation quieter, cleaner and cheaper','What China can teach the world about scaling clean energy','The controversial climate tool funding real change'] +from verify_lib import Judge, check_common, check_read_only, clicked_transition, contains_all, final_answer, load_run, parse_args, visited_in_order +TASK_ID="TED--3";PLAYLIST="/playlists/climate-nature-conservation";MAYA="/talks/maya-higa-the-wildlife-sanctuary-you-can-visit-from-anywhere";ROSE="/talks/rose-b-simpson-debbie-millman-how-to-invite-creativity-into-your-life";TARGET="/talks/elsaphan-njora-conservation-a-love-story" def main(): - a=parse_args(); j=Judge('TED--3',a.no_llm); t=load_run(a.run_dir); fa=final_answer(t); j.check('nav_climate_playlist',navigated_to(t,'playlists/climate-nature-conservation'),f'navigated={navigated_to(t,"playlists/climate-nature-conservation")}'); j.check('answer_names_summit_talk_title',contains_any(fa,TITLES),f'final={fa!r}'); j.check('final_answer_nonempty',bool(fa),f'final={fa!r}'); j.emit() -if __name__=='__main__': main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID) + j.check("ordered_playlist_inspection",visited_in_order(t,[("/playlists",{}),(PLAYLIST,{}),(MAYA,{}),(ROSE,{}),(TARGET,{})]),"playlist and first three details in order") + j.check("clicked_playlist_and_talks",clicked_transition(t,"/playlists",PLAYLIST) and all(clicked_transition(t,PLAYLIST,p) for p in (MAYA,ROSE,TARGET)),"visible playlist links used") + j.check("answer_exact_title",contains_all(answer,("Conservation: a love story",)),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_4.py b/sites/ted/verify/verify_4.py index 91fbe05c..c49fffae 100644 --- a/sites/ted/verify/verify_4.py +++ b/sites/ted/verify/verify_4.py @@ -1,35 +1,13 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--4. - -Log in as Alice and change the newsletter topic to conservation. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav /login,/account | DB after: alice newsletter_topic == 'conservation' (seed was 'ai') -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -EMAIL = "alice.j@test.com" - +from verify_lib import Judge, changed_tables, check_common, load_run, login_submitted_as, parse_args, resolve_db, submitted_from_path, user_snapshot, visited_in_order +TASK_ID="TED--4";EMAIL="alice.j@test.com" def main(): - a = parse_args() - j = Judge('TED--4', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("final_answer_nonempty", bool(fa.strip()), f"final={fa!r}") - after = resolve_db(a.after_db, a.container, "instance") - topic = newsletter_topic_for(after, EMAIL) - j.check("nav_login", navigated_to(t, "/login"), f"navigated={navigated_to(t, '/login')}") - j.check("nav_account", navigated_to(t, "/account"), f"navigated={navigated_to(t, '/account')}") - j.check("db_newsletter_conservation", topic is not None and norm(topic) == "conservation", - f"newsletter_topic={topic!r}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);check_common(j,t,TASK_ID);j.check("login_as_alice",login_submitted_as(t,EMAIL),EMAIL);j.check("ordered_account_flow",visited_in_order(t,[("/login",{}),("/account",{})]),"login then account");j.check("profile_submitted",submitted_from_path(t,"/account","/account"),"account form submitted") + initial=resolve_db(a.initial_db,a.container,"instance_seed");after=resolve_db(a.after_db,a.container,"instance");j.check("databases_readable",bool(initial and after),f"initial={initial} after={after}") + if initial and after: + before=user_snapshot(initial);now=user_snapshot(after);expected=[dict(r) for r in before] + for row in expected: + if row['email']==EMAIL:row['newsletter_topic']='conservation' + j.check("only_requested_profile_field_changed",now==expected,f"before={before} after={now}");j.check("only_user_table_changed",changed_tables(initial,after)=={"user"},repr(changed_tables(initial,after))) + j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_5.py b/sites/ted/verify/verify_5.py index b2c86bc4..497dd9be 100644 --- a/sites/ted/verify/verify_5.py +++ b/sites/ted/verify/verify_5.py @@ -1,35 +1,6 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--5. - -Find Malala Yousafzai's talk and report its exact title. (Re-anchored from the -original 'list two topics', which a model could answer from prior knowledge; the -title is on-page only — listing cards show the speaker, not the title.) - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav Malala talk detail | answer contains the exact title -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -SLUG = "malala-yousafzai-what-i-got-wrong-about-changing-the-world" -TITLE = "What I got wrong about changing the world" - +from verify_lib import Judge, check_common, check_read_only, clicked_transition, contains_all, final_answer, load_run, parse_args, visited_in_order +TASK_ID="TED--5";PATH="/talks/malala-yousafzai-what-i-got-wrong-about-changing-the-world";TITLE="What I got wrong about changing the world" def main(): - a = parse_args() - j = Judge('TED--5', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_malala", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") - j.check("answer_exact_title", contains_all(fa, [TITLE]), f"final={fa!r}") - ok, ev = llm_text_match(fa, TITLE, "What is the exact title of Malala Yousafzai's talk?") - j.check("answer_title_llm", ok, ev, llm=True) - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("ordered_malala_search",visited_in_order(t,[("/search",{"q":"Malala Yousafzai"}),(PATH,{})]),"search before detail");j.check("clicked_malala_result",clicked_transition(t,"/search",PATH),"detail opened from search");j.check("answer_exact_title",contains_all(answer,(TITLE,)),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_6.py b/sites/ted/verify/verify_6.py index ceaf6182..d84977e2 100644 --- a/sites/ted/verify/verify_6.py +++ b/sites/ted/verify/verify_6.py @@ -1,31 +1,6 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--6. - -Search 'clean energy', open Kimiko Hirata's result, report which event it is from. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav Kimiko Hirata talk detail | answer names 'TED Countdown Summit 2025' -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -SLUG = "kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy" - +from verify_lib import Judge, check_common, check_read_only, clicked_transition, contains_all, final_answer, load_run, parse_args, visited_in_order +TASK_ID="TED--6";PATH="/talks/kimiko-hirata-a-cheat-sheet-for-accelerating-clean-energy" def main(): - a = parse_args() - j = Judge('TED--6', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_kimiko", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") - j.check("answer_event", contains_any(fa, ["TED Countdown Summit 2025", "Countdown Summit 2025"]), - f"final={fa!r}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("ordered_clean_energy_search",visited_in_order(t,[("/search",{"q":"clean energy"}),(PATH,{})]),"search before detail");j.check("clicked_kimiko_result",clicked_transition(t,"/search",PATH),"detail opened from search");j.check("answer_exact_event",contains_all(answer,("TED Countdown Summit 2025",)),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_7.py b/sites/ted/verify/verify_7.py index 279b03c7..bf2d7fcd 100644 --- a/sites/ted/verify/verify_7.py +++ b/sites/ted/verify/verify_7.py @@ -1,42 +1,12 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--7. - -Register interest in the TED2026 event while logged in as Alice. (Re-anchored -from 'TED Countdown Summit 2025', which Alice is already seed-registered for — -that made the task a no-op and the after-state indistinguishable from doing -nothing. Alice is NOT seed-registered for TED2026, so a registration is a -genuine, verifiable state change.) - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav /events + /login | DB after: alice registered for TED2026, not registered in seed -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -EMAIL = "alice.j@test.com" -EVENT = "TED2026" - +from verify_lib import Judge, changed_tables, check_common, load_run, login_submitted_as, parse_args, registration_snapshot, resolve_db, submitted_from_path, table_snapshot, visited_in_order +TASK_ID="TED--7";EMAIL="alice.j@test.com";EVENT="ted2026" def main(): - a = parse_args() - j = Judge('TED--7', a.no_llm) - t = load_run(a.run_dir) - after = resolve_db(a.after_db, a.container, "instance") - init = resolve_db(a.initial_db, a.container, "instance_seed") - after_regs = registered_events_for(after, EMAIL) - init_regs = registered_events_for(init, EMAIL) - j.check("nav_events", navigated_to(t, "/events"), f"navigated={navigated_to(t, '/events')}") - j.check("nav_login", navigated_to(t, "/login"), f"navigated={navigated_to(t, '/login')}") - j.check("db_registered_ted2026", - after_regs is not None and EVENT in after_regs, f"after_regs={after_regs}") - j.check("db_not_registered_in_seed", - init_regs is not None and EVENT not in init_regs, f"initial_regs={init_regs}") - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);check_common(j,t,TASK_ID);j.check("login_as_alice",login_submitted_as(t,EMAIL),EMAIL);j.check("ordered_events_flow",visited_in_order(t,[("/login",{}),("/events",{}),("/account",{})]),"login, events, account");j.check("registration_submitted",submitted_from_path(t,"/events","/account"),"events form submitted") + initial=resolve_db(a.initial_db,a.container,"instance_seed");after=resolve_db(a.after_db,a.container,"instance");j.check("databases_readable",bool(initial and after),f"initial={initial} after={after}") + if initial and after: + before=registration_snapshot(initial,EMAIL);now=registration_snapshot(after,EMAIL);before_ids={r['id'] for r in before};added=[r for r in now if r['id'] not in before_ids] + before_all=table_snapshot(initial,"registration");after_all=table_snapshot(after,"registration") + j.check("exact_registration_delta",len(added)==1 and added[0]['slug']==EVENT and added[0]['status']=='waitlisted' and len(now)==len(before)+1 and all(r in now for r in before),repr(added));j.check("complete_registration_table_delta",len(after_all)==len(before_all)+1 and all(row in after_all for row in before_all),f"before={len(before_all)} after={len(after_all)}");j.check("only_registration_changed",changed_tables(initial,after)=={"registration"},repr(changed_tables(initial,after))) + j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_8.py b/sites/ted/verify/verify_8.py index c2b505af..13a9aba4 100644 --- a/sites/ted/verify/verify_8.py +++ b/sites/ted/verify/verify_8.py @@ -1,38 +1,6 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--8. - -Compare Alexi Pappas's 'Why I love my bad days' (5 min) with Debbie Millman's -'You got what you wanted. Now what?' (8 min) — which is shorter? -> Alexi Pappas. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav both talk details | answer names Alexi Pappas / 'Why I love my bad days' as shorter -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -ALEXI = "alexi-pappas-why-i-love-my-bad-days" -DEBBIE = "debbie-millman-you-got-what-you-wanted-now-what" - +from verify_lib import Judge, affirmative_contains, check_common, check_read_only, clicked_transition, contains_any, final_answer, load_run, number_bound_in_comparison, parse_args, visited_path +TASK_ID="TED--8";A="/talks/alexi-pappas-why-i-love-my-bad-days";D="/talks/debbie-millman-you-got-what-you-wanted-now-what" def main(): - a = parse_args() - j = Judge('TED--8', a.no_llm) - t = load_run(a.run_dir) - fa = final_answer(t) - j.check("nav_alexi", navigated_to(t, ALEXI), f"navigated={navigated_to(t, ALEXI)}") - j.check("nav_debbie", navigated_to(t, DEBBIE), f"navigated={navigated_to(t, DEBBIE)}") - j.check("answer_alexi_shorter", - contains_any(fa, ["Alexi Pappas", "Why I love my bad days"]), f"final={fa!r}") - ok, ev = llm_text_match(fa, "Alexi Pappas's 'Why I love my bad days' (5 minutes) is the shorter talk", - "Which talk is shorter: Alexi Pappas's 'Why I love my bad days' or Debbie Millman's " - "'You got what you wanted. Now what?'") - j.check("answer_shorter_llm", ok, ev, llm=True) - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);answer=final_answer(t);check_common(j,t,TASK_ID);j.check("opened_both_from_search",visited_path(t,A) and visited_path(t,D) and clicked_transition(t,"/search",A) and clicked_transition(t,"/search",D),"both detail links opened from searches");j.check("alexi_duration_bound",number_bound_in_comparison(answer,5,("Alexi","bad days")),repr(answer));j.check("debbie_duration_bound",number_bound_in_comparison(answer,8,("Debbie","wanted")),repr(answer));j.check("alexi_identified_shorter",affirmative_contains(answer,"Alexi") and contains_any(answer,("shorter","less time")),repr(answer));check_read_only(j,a);j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_9.py b/sites/ted/verify/verify_9.py index b6be216c..4e936662 100644 --- a/sites/ted/verify/verify_9.py +++ b/sites/ted/verify/verify_9.py @@ -1,45 +1,12 @@ #!/usr/bin/env python3 -"""Deterministic verifier for TED task TED--9. - -Find a talk about Parkinson's and save it to Alice's account with a note for -public health review. Ground truth: Joy Milne, 'The nurse who can smell -Parkinson's'. - -Checks (deterministic first; LLM utilities anchored on ground truth): -nav Joy Milne talk detail + /login | DB after: talk saved by alice with a non-empty note, absent in seed -Input/Output: see verify_lib.parse_args / Judge.emit. -""" -import os, sys -sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from verify_lib import (load_run, navigated_to, navigated_any, final_answer, last_shot, - norm, contains_all, contains_any, answer_equals, extract_ints, - resolve_db, saved_talks_for, saved_titles_for, note_for_saved, - newsletter_topic_for, registered_events_for, user_emails, - SEED_EMAILS, llm_text_match, llm_screenshot_shows, Judge, parse_args) - -SLUG = "joy-milne-the-nurse-who-can-smell-parkinson-s" -TITLE_SUB = "smell Parkinson" -EMAIL = "alice.j@test.com" - +from verify_lib import Judge, changed_tables, check_common, clicked_transition, load_run, login_submitted_as, parse_args, resolve_db, saved_snapshot, submitted_from_path, table_snapshot, visited_in_order +TASK_ID="TED--9";EMAIL="alice.j@test.com";SLUG="joy-milne-the-nurse-who-can-smell-parkinson-s";PATH=f"/talks/{SLUG}" def main(): - a = parse_args() - j = Judge('TED--9', a.no_llm) - t = load_run(a.run_dir) - after = resolve_db(a.after_db, a.container, "instance") - init = resolve_db(a.initial_db, a.container, "instance_seed") - note = note_for_saved(after, EMAIL, TITLE_SUB) - init_titles = saved_titles_for(init) - j.check("nav_parkinson", navigated_to(t, SLUG), f"navigated={navigated_to(t, SLUG)}") - j.check("db_parkinson_saved_by_alice", note is not None, f"note={note!r}") - j.check("db_note_present", bool(note and note.strip()), f"note={note!r}") - j.check("db_absent_in_seed", - init_titles is not None and not any(norm(TITLE_SUB) in norm(x) for x in init_titles), - f"initial_saved={init_titles}") - # The note text is free-form; confirm it reads as a public-health review note (anchored). - ok, ev = llm_text_match(note or "", "a note about public health / public health review", - "Is this saved-talk note a note for public health review?") - j.check("note_public_health_llm", ok, ev, llm=True) - j.emit() - -if __name__ == "__main__": - main() + a=parse_args();t=load_run(a.run_dir);j=Judge(TASK_ID);check_common(j,t,TASK_ID);j.check("login_as_alice",login_submitted_as(t,EMAIL),EMAIL);j.check("ordered_parkinson_save_flow",visited_in_order(t,[("/login",{}),("/search",{"q":"Parkinson"}),(PATH,{})]),"login, search, detail");j.check("clicked_parkinson_result",clicked_transition(t,"/search",PATH),"detail opened from search");j.check("save_submitted",submitted_from_path(t,PATH,PATH),"save form submitted") + initial=resolve_db(a.initial_db,a.container,"instance_seed");after=resolve_db(a.after_db,a.container,"instance");j.check("databases_readable",bool(initial and after),f"initial={initial} after={after}") + if initial and after: + before=saved_snapshot(initial,EMAIL);now=saved_snapshot(after,EMAIL);before_ids={r['id'] for r in before};added=[r for r in now if r['id'] not in before_ids] + before_all=table_snapshot(initial,"saved_talk");after_all=table_snapshot(after,"saved_talk") + j.check("exact_saved_delta",len(added)==1 and added[0]['slug']==SLUG and added[0]['note']=="public health review" and len(now)==len(before)+1 and all(r in now for r in before),repr(added));j.check("complete_saved_table_delta",len(after_all)==len(before_all)+1 and all(row in after_all for row in before_all),f"before={len(before_all)} after={len(after_all)}");j.check("only_saved_talk_changed",changed_tables(initial,after)=={"saved_talk"},repr(changed_tables(initial,after))) + j.emit() +if __name__=="__main__":main() diff --git a/sites/ted/verify/verify_lib.py b/sites/ted/verify/verify_lib.py index ade708fb..13dec233 100644 --- a/sites/ted/verify/verify_lib.py +++ b/sites/ted/verify/verify_lib.py @@ -1,293 +1,375 @@ #!/usr/bin/env python3 -"""verify_lib.py — shared deterministic + LLM utilities for TED task verification. - -Philosophy: DETERMINISTIC FIRST. - 1. Trajectory navigation check (anti knowledge-shortcut): the agent MUST have - opened the relevant on-site page; a correct answer with no matching navigation - is a memory-recall shortcut = FAIL. - 2. Answer check: exact / regex / token-containment against frozen ground truth. - 3. DB after-state check (stateful tasks): query the SQLite instance DB directly — - the strongest deterministic signal (saved-talk row, registration row, - newsletter topic, newly registered user). - 4. LLM utilities (text match, screenshot-contains) are used ONLY where exact - matching is brittle, and are ALWAYS anchored on ground truth: the model - verifies *presence* of given content, it never supplies knowledge. One call each. - -Input signature (per task): - --run_dir DIR agent trajectory dir: trajectory.json + screenshots/step_NNN.png - --initial_db PATH initial-state SQLite DB (default: fetched instance_seed from container) - --after_db PATH after-state SQLite DB (default: fetched live instance DB from container) - --container NAME docker container to fetch DBs from (default: $WH_CONTAINER or wh-review) - --no_llm skip LLM-based checks (run deterministic-only) -Output: JSON {task_id, pass, reason, evidence[]} to stdout; exit 0 on PASS, 1 on FAIL. -""" -import base64, json, os, re, sqlite3, subprocess, sys, tempfile, urllib.request -from pathlib import Path +"""Shared deterministic helpers for TED task verifiers.""" + +from __future__ import annotations + +import argparse +import ipaddress +import json +import os +import re +import sqlite3 +import subprocess +import tempfile +import unicodedata from dataclasses import dataclass +from pathlib import Path +from typing import Any, Iterable, Sequence +from urllib.parse import parse_qs, urlparse SITE = "ted" +DEFAULT_CONTAINER = os.environ.get("WH_CONTAINER", "wh-review") +SEED_EMAILS = {"alice.j@test.com", "bob.c@test.com", "carol.d@test.com", "david.k@test.com"} + + +@dataclass(frozen=True) +class VerifyArgs: + run_dir: str + initial_db: str | None + after_db: str | None + container: str + no_llm: bool + + +def _bool_value(value: str) -> bool: + return str(value).casefold() in {"1", "true", "yes", "on"} + + +def parse_args() -> VerifyArgs: + parser = argparse.ArgumentParser() + parser.add_argument("--run_dir", required=True) + parser.add_argument("--initial_db") + parser.add_argument("--after_db") + parser.add_argument("--container", default=DEFAULT_CONTAINER) + parser.add_argument("--no_llm", nargs="?", const=True, default=False, type=_bool_value) + args = parser.parse_args() + run_dir = Path(args.run_dir) + initial_snapshot = run_dir / "initial.db" + after_snapshot = run_dir / "after.db" + return VerifyArgs( + run_dir=args.run_dir, + initial_db=args.initial_db or (str(initial_snapshot) if initial_snapshot.is_file() else None), + after_db=args.after_db or (str(after_snapshot) if after_snapshot.is_file() else None), + container=args.container, + no_llm=bool(args.no_llm), + ) + + +def load_run(run_dir: str | os.PathLike[str]) -> dict[str, Any]: + trajectory = json.loads((Path(run_dir) / "trajectory.json").read_text(encoding="utf-8")) + if not isinstance(trajectory, dict): + raise ValueError("trajectory.json must contain a JSON object") + return trajectory + + +def normalize_text(value: Any) -> str: + text = unicodedata.normalize("NFKC", str(value or "")) + text = text.replace("’", "'").replace("“", '"').replace("”", '"').replace("–", "-").replace("—", "-") + return re.sub(r"\s+", " ", text).strip().casefold() + + +def final_answer(trajectory: dict[str, Any]) -> str: + return str(trajectory.get("final_answer") or "").strip() + + +def trajectory_urls(trajectory: dict[str, Any]) -> list[str]: + urls: list[str] = [] + if trajectory.get("start_url"): + urls.append(str(trajectory["start_url"])) + for step in trajectory.get("steps") or []: + if not isinstance(step, dict): + continue + for key in ("url_before", "url", "url_after"): + value = str(step.get(key) or "") + if value and (not urls or value != urls[-1]): + urls.append(value) + final_url = str(trajectory.get("final_url") or "") + if final_url and (not urls or final_url != urls[-1]): + urls.append(final_url) + return urls + + +def _loopback(hostname: str) -> bool: + if hostname.casefold() == "localhost": + return True + try: + return ipaddress.ip_address(hostname).is_loopback + except ValueError: + return False + + +def is_site_url(url: str, trajectory: dict[str, Any]) -> bool: + parsed = urlparse(str(url or "")) + start = urlparse(str(trajectory.get("start_url") or "")) + return bool( + parsed.scheme in {"http", "https"} + and parsed.hostname + and start.hostname + and _loopback(parsed.hostname) + and _loopback(start.hostname) + and parsed.scheme == start.scheme + and parsed.port == start.port + ) + + +def normalized_path(url: str) -> str: + path = urlparse(str(url or "")).path or "/" + return path.rstrip("/") or "/" + + +def query_matches(url: str, expected: dict[str, str]) -> bool: + params = parse_qs(urlparse(url).query) + return all(normalize_text((params.get(key) or [""])[0]) == normalize_text(value) for key, value in expected.items()) + + +def visited_path(trajectory: dict[str, Any], path: str) -> bool: + expected = normalized_path(path) + return any(is_site_url(url, trajectory) and normalized_path(url) == expected for url in trajectory_urls(trajectory)) + + +def visited_query(trajectory: dict[str, Any], path: str, expected: dict[str, str]) -> bool: + return any( + is_site_url(url, trajectory) + and normalized_path(url) == normalized_path(path) + and query_matches(url, expected) + for url in trajectory_urls(trajectory) + ) + + +def visited_in_order(trajectory: dict[str, Any], requirements: list[tuple[str, dict[str, str]]]) -> bool: + urls = trajectory_urls(trajectory) + cursor = 0 + for path, query in requirements: + found = False + for index in range(cursor, len(urls)): + url = urls[index] + if is_site_url(url, trajectory) and normalized_path(url) == normalized_path(path) and query_matches(url, query): + cursor = index + 1 + found = True + break + if not found: + return False + return True + + +def transition_pairs(trajectory: dict[str, Any]): + steps = trajectory.get("steps") or [] + for index, step in enumerate(steps): + if not isinstance(step, dict): + continue + current = str(step.get("url") or step.get("url_before") or "") + if not is_site_url(current, trajectory): + continue + following = str(step.get("url_after") or "") + if not following and index + 1 < len(steps) and isinstance(steps[index + 1], dict): + following = str(steps[index + 1].get("url") or steps[index + 1].get("url_after") or "") + if following and is_site_url(following, trajectory): + yield normalize_text(step.get("action")), current, following + + +def clicked_transition(trajectory: dict[str, Any], from_path: str, to_path: str) -> bool: + return any( + action == "click" + and normalized_path(current) == normalized_path(from_path) + and normalized_path(following) == normalized_path(to_path) + for action, current, following in transition_pairs(trajectory) + ) + + +def submitted_from_path(trajectory: dict[str, Any], path: str, destination: str | None = None) -> bool: + for action, current, following in transition_pairs(trajectory): + if action != "click" or normalized_path(current) != normalized_path(path): + continue + if destination is None or normalized_path(following) == normalized_path(destination): + return True + return False -# The four benchmark users seeded by seed_users() in sites/ted/app.py. Used by -# "create a new account" tasks to tell a freshly-registered user apart from seed rows. -SEED_EMAILS = ["alice.j@test.com", "bob.c@test.com", "carol.d@test.com", "david.k@test.com"] -# ---------------------------------------------------------------- trajectory -def load_run(run_dir): - d = Path(run_dir) - traj = json.loads((d / "trajectory.json").read_text()) - traj["_run_dir"] = d - traj["_shots"] = {p.name: p for p in sorted((d / "screenshots").glob("step_*.png"))} - return traj +def input_values(trajectory: dict[str, Any], path: str | None = None) -> list[str]: + values: list[str] = [] + for step in trajectory.get("steps") or []: + if not isinstance(step, dict) or normalize_text(step.get("action")) not in {"input", "fill", "type", "select"}: + continue + url = str(step.get("url") or step.get("url_before") or "") + if not is_site_url(url, trajectory) or (path and normalized_path(url) != normalized_path(path)): + continue + params = step.get("params") or {} + value = params.get("text", params.get("value", params.get("option", params.get("label")))) if isinstance(params, dict) else None + if value is not None: + values.append(str(value)) + return values -def step_urls(traj): - return [s.get("url") or s.get("url_after") or s.get("url_before") or "" for s in traj.get("steps", [])] -def navigated_to(traj, substr, times=1): - """Deterministic: at least `times` trajectory steps have a URL containing substr.""" - return sum(1 for u in step_urls(traj) if substr in u) >= times +def entered_text(trajectory: dict[str, Any], expected: str, path: str | None = None) -> bool: + expected_value = normalize_text(expected) + return any(normalize_text(value) == expected_value for value in input_values(trajectory, path)) -def navigated_any(traj, substrs): - return any(navigated_to(traj, s) for s in substrs) -def final_answer(traj): - return (traj.get("final_answer") or "").strip() +def last_entered_email(trajectory: dict[str, Any], path: str = "/login") -> str: + emails = [normalize_text(value) for value in input_values(trajectory, path) if re.fullmatch(r"[^@\s]+@[^@\s]+\.[^@\s]+", value.strip())] + return emails[-1] if emails else "" -def _shot(traj, name): - if not name: - return None - p = traj["_shots"].get(Path(name).name) - return p if (p and p.exists()) else None - -def shot_after_url(traj, substr): - """screenshot_after path of the first step whose URL contains substr.""" - for s in traj.get("steps", []): - if substr in s.get("url", ""): - p = _shot(traj, s.get("screenshot_after")) - if p: - return p - return None - -def last_shot(traj): - for s in reversed(traj.get("steps", [])): - p = _shot(traj, s.get("screenshot_after")) or _shot(traj, s.get("screenshot_before")) - if p: - return p - shots = sorted(traj["_shots"].values()) - return shots[-1] if shots else None - -# ---------------------------------------------------------------- deterministic answer match -def norm(s): - return re.sub(r"\s+", " ", (s or "").strip()).casefold() - -def answer_equals(final, expected): - return norm(final) == norm(expected) - -def contains_all(final, tokens): - f = norm(final) - return all(norm(t) in f for t in tokens) - -def contains_any(final, tokens): - f = norm(final) - return any(norm(t) in f for t in tokens) - -def extract_years(text): - return re.findall(r"\b(1[5-9]\d{2}|20\d{2})\b", text or "") - -def extract_ints(text): - # \b word boundaries so e.g. "15" is not matched inside "15k" or "2015". - return [int(n) for n in re.findall(r"\b\d+\b", text or "")] - -# ---------------------------------------------------------------- DB state -def fetch_db(container, kind): - """kind: 'instance' (after-state) or 'instance_seed' (initial-state). docker cp -> temp file.""" - src = f"{container}:/opt/WebSyn/{SITE}/{kind}/{SITE}.db" - fd, path = tempfile.mkstemp(suffix=".db") - os.close(fd) - r = subprocess.run(["docker", "cp", src, path], capture_output=True, text=True) - if r.returncode != 0: - try: - os.unlink(path) - except OSError: - pass - raise RuntimeError(f"docker cp {src} failed: {r.stderr.strip()}") - return path - -def resolve_db(arg, container, kind): - if arg: - return arg + +def login_submitted_as(trajectory: dict[str, Any], email: str) -> bool: + return visited_path(trajectory, "/login") and last_entered_email(trajectory) == normalize_text(email) and submitted_from_path(trajectory, "/login") + + +NEGATIONS = {"not", "no", "never", "without", "isn't", "isnt", "wasn't", "wasnt", "doesn't", "doesnt", "didn't", "didnt"} + + +def _negated_before(text: str, start: int) -> bool: + clause = re.split(r"[.!?;:\n]+|\b(?:and|but|however|instead)\b", text[:start])[-1] + words = re.findall(r"[a-z0-9]+(?:'[a-z]+)?", clause) + return any(word in NEGATIONS for word in words) + + +def _negated_after(text: str, end: int) -> bool: + suffix = re.sub(r"^\s*[-,:;!?]*\s*", "", text[end:]) + return re.match(r"(?:(?:is|was|does|did|are|were)\s+)?(?:not|never|no)\b|(?:isn't|isnt|wasn't|wasnt|doesn't|doesnt|didn't|didnt|aren't|arent|weren't|werent)\b", suffix) is not None + + +def affirmative_contains(text: Any, expected: Any) -> bool: + normalized = normalize_text(text) + needle = normalize_text(expected) + matches = list(re.finditer(re.escape(needle), normalized)) + if not needle or not matches: + return False + match = matches[-1] + return not _negated_before(normalized, match.start()) and not _negated_after(normalized, match.end()) + + +def contains_all(text: Any, expected: Iterable[Any]) -> bool: + return all(affirmative_contains(text, value) for value in expected) + + +def contains_any(text: Any, expected: Iterable[Any]) -> bool: + return any(affirmative_contains(text, value) for value in expected) + + +def number_matches(text: Any, value: int | float, tolerance: float = 0.001) -> list[re.Match[str]]: + normalized = normalize_text(text) + matches = [] + for match in re.finditer(r"(? bool: + return bool(number_matches(text, value)) + + +def number_bound_to(text: Any, value: int | float, labels: Sequence[str], distance: int = 140) -> bool: + normalized = normalize_text(text) + for match in number_matches(normalized, value): + window = normalized[max(0, match.start() - distance):min(len(normalized), match.end() + distance)] + if any(normalize_text(label) in window for label in labels): + return True + return False + + +def number_bound_in_comparison(text: Any, value: int | float, labels: Sequence[str]) -> bool: + normalized = normalize_text(text) + segments = re.split(r"\b(?:versus|vs\.?|while|compared (?:with|to))\b|[;\n]", normalized) + return any(has_number(segment, value) and any(normalize_text(label) in segment for label in labels) for segment in segments) + + +def fetch_db(container: str, kind: str) -> str: + if kind not in {"instance", "instance_seed"}: + raise ValueError(f"unsupported database kind: {kind}") + handle, destination = tempfile.mkstemp(prefix=f"ted_{kind}_", suffix=".db") + os.close(handle) + source = f"{container}:/opt/WebSyn/{SITE}/{kind}/{SITE}.db" + result = subprocess.run(["docker", "cp", source, destination], capture_output=True, text=True, check=False) + if result.returncode: + Path(destination).unlink(missing_ok=True) + raise RuntimeError(result.stderr.strip() or f"could not copy {source}") + return destination + + +def resolve_db(explicit: str | None, container: str, kind: str) -> str | None: + if explicit: + return explicit if Path(explicit).is_file() else None try: return fetch_db(container, kind) - except Exception: - return None # caller treats None as "unavailable" and FAILs that check + except (OSError, RuntimeError): + return None -def db_query(db_path, sql, params=()): - con = sqlite3.connect(db_path) + +def db_query(path: str, sql: str, params: Sequence[Any] = ()) -> list[sqlite3.Row]: + connection = sqlite3.connect(path) + connection.row_factory = sqlite3.Row try: - return con.execute(sql, params).fetchall() + return connection.execute(sql, params).fetchall() finally: - con.close() + connection.close() -def saved_talks_for(db_path, email="alice.j@test.com"): - """List of (talk_title, note) saved by the user, or None if db unavailable.""" - if not db_path: - return None - rows = db_query(db_path, - "SELECT t.title, s.note FROM saved_talk s JOIN user u ON u.id=s.user_id " - "JOIN talk t ON t.id=s.talk_id WHERE u.email=? ORDER BY t.title", (email,)) - return [(r[0], r[1] or "") for r in rows] - -def saved_titles_for(db_path, email="alice.j@test.com"): - st = saved_talks_for(db_path, email) - return None if st is None else [title for title, _ in st] - -def note_for_saved(db_path, email, title_substr): - """Note text of the saved talk whose title contains title_substr; None if not saved.""" - st = saved_talks_for(db_path, email) - if st is None: - return None - for title, note in st: - if norm(title_substr) in norm(title): - return note - return None -def newsletter_topic_for(db_path, email="alice.j@test.com"): - if not db_path: - return None - rows = db_query(db_path, "SELECT newsletter_topic FROM user WHERE email=?", (email,)) - return rows[0][0] if rows else None +def row_dicts(path: str, sql: str, params: Sequence[Any] = ()) -> list[dict[str, Any]]: + return [dict(row) for row in db_query(path, sql, params)] -def registered_events_for(db_path, email="alice.j@test.com"): - """Event names the user holds a registration row for, or None if db unavailable.""" - if not db_path: - return None - rows = db_query(db_path, - "SELECT e.name FROM registration r JOIN user u ON u.id=r.user_id " - "JOIN event e ON e.id=r.event_id WHERE u.email=?", (email,)) - return [r[0] for r in rows] -def user_emails(db_path): - if not db_path: - return None - return [r[0] for r in db_query(db_path, "SELECT email FROM user ORDER BY id")] +def database_tables(path: str) -> list[str]: + return [str(row["name"]) for row in db_query(path, "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name")] -# ---------------------------------------------------------------- shared LLM utilities (anchored) -# Unified LLM config, same env vars as agent.py / eval_judge.py: -# OPENAI_API_KEY, OPENAI_BASE_URL, JUDGE_MODEL -import simpleArgParser as sap -# When --no_llm is set (via Judge), the llm_* helpers short-circuit so verifiers -# that call them directly (before j.check(llm=True)) still make ZERO LLM calls. -_NO_LLM = False +def table_snapshot(path: str, table: str) -> list[tuple[Any, ...]]: + return [tuple(row) for row in db_query(path, f'SELECT * FROM "{table}" ORDER BY rowid')] -def _llm_config(): - """Resolve (api_key, api_base, model) from env once per process.""" - key = os.environ.get("OPENAI_API_KEY", "") - base = os.environ.get("OPENAI_BASE_URL", "") - model = os.environ.get("JUDGE_MODEL", "") - return key, base, model +def changed_tables(initial_db: str, after_db: str) -> set[str]: + initial_tables = database_tables(initial_db) + if initial_tables != database_tables(after_db): + return {""} + return {table for table in initial_tables if table_snapshot(initial_db, table) != table_snapshot(after_db, table)} -def _chat(messages, max_tokens=1024): - """One LLM call against the configured OpenAI-compatible endpoint. Returns text or None.""" - if _NO_LLM: - return None - key, base, model = _llm_config() - if not (key and base and model): - return None # no LLM configured -> callers treat as non-PASS - payload = {"model": model, "messages": messages, - "max_tokens": max_tokens, "temperature": 1.0} - req = urllib.request.Request(base, - data=json.dumps(payload).encode(), - headers={"Content-Type": "application/json", - "Authorization": f"Bearer {key}"}) - try: - data = json.loads(urllib.request.urlopen(req, timeout=180).read()) - except Exception: - return None # caller treats None as a non-PASS; never raises - try: - return data["choices"][0]["message"]["content"] - except Exception: - return None +def database_unchanged(initial_db: str | None, after_db: str | None) -> bool: + return bool(initial_db and after_db and not changed_tables(initial_db, after_db)) + + +def saved_snapshot(path: str, email: str) -> list[dict[str, Any]]: + return row_dicts(path, "SELECT s.id,t.slug,t.title,t.topics_json,s.note,s.saved_at FROM saved_talk s JOIN user u ON u.id=s.user_id JOIN talk t ON t.id=s.talk_id WHERE lower(u.email)=lower(?) ORDER BY s.id", (email,)) + + +def registration_snapshot(path: str, email: str) -> list[dict[str, Any]]: + return row_dicts(path, "SELECT r.id,e.slug,e.name,r.status FROM registration r JOIN user u ON u.id=r.user_id JOIN event e ON e.id=r.event_id WHERE lower(u.email)=lower(?) ORDER BY r.id", (email,)) + + +def user_snapshot(path: str) -> list[dict[str, Any]]: + return row_dicts(path, "SELECT * FROM user ORDER BY id") + + +def check_common(judge: "Judge", trajectory: dict[str, Any], task_id: str) -> None: + judge.check("task_id_matches", str(trajectory.get("task_id") or "") == task_id, f"observed={trajectory.get('task_id')!r}") + judge.check("final_answer_nonempty", bool(final_answer(trajectory)), repr(final_answer(trajectory))) + judge.check("start_url_is_site", is_site_url(str(trajectory.get("start_url") or ""), trajectory), f"start_url={trajectory.get('start_url')!r}") + + +def check_read_only(judge: "Judge", args: VerifyArgs) -> tuple[str | None, str | None]: + initial = resolve_db(args.initial_db, args.container, "instance_seed") + after = resolve_db(args.after_db, args.container, "instance") + judge.check("databases_readable", bool(initial and after), f"initial={initial} after={after}") + judge.check("read_only_database_unchanged", database_unchanged(initial, after), "complete database comparison") + return initial, after + -def _verdict(out): - """Normalize an LLM reply to (pass_bool, text). None/empty -> (False, '').""" - if not out: - return False, "" - s = out.strip() - return s.upper().startswith("PASS"), s - -def llm_text_match(agent_answer, ground_truth, question): - """One LLM call: does agent_answer correctly answer question AND stay consistent - with the frozen ground truth? The model is given the ground truth as an anchor - and is told NOT to use its own knowledge.""" - if _NO_LLM: - return False, "[skipped: --no_llm]" - out = _chat([{"role": "user", "content": - f"You are a STRICT binary grader.\nQuestion: {question}\n" - f"Ground-truth answer (ANCHOR — judge against THIS, never use your own knowledge): {ground_truth}\n" - f"Agent's answer: {agent_answer}\n" - f"Decide PASS or FAIL ignoring case/punctuation/word order/surrounding prose. " - f"PASS only if the agent's answer is consistent with the ground truth AND actually answers the question. " - f"Line 1: PASS or FAIL. Line 2: one-sentence reason."}]) - return _verdict(out) - -def llm_screenshot_shows(shot_path, must_show, question=""): - """One vision LLM call: does this screenshot visibly render text answering/containing - `must_show`? The model judges pixels only, anchored on the expected content.""" - if _NO_LLM: - return False, "[skipped: --no_llm]" - b64 = base64.b64encode(Path(shot_path).read_bytes()).decode() - out = _chat([{"role": "user", "content": [ - {"type": "text", "text": - f"You are a STRICT binary grader. Only what is VISIBLY rendered in this screenshot counts.\n" - f"Question the page should answer: {question}\n" - f"Expected content to verify PRESENCE of: {must_show}\n" - f"PASS only if the expected content (or a semantically equivalent on-screen answer) is visibly shown. " - f"Do NOT use prior knowledge — judge only the rendered pixels.\n" - f"Line 1: PASS or FAIL. Line 2: quote the visible evidence."}, - {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}}]}]) - return _verdict(out) - -# ---------------------------------------------------------------- judge harness + CLI class Judge: - def __init__(self, task_id, no_llm=False): - global _NO_LLM - _NO_LLM = bool(no_llm) # gate the llm_* helpers at the source + def __init__(self, task_id: str, no_llm: bool = False): self.task_id = task_id - self.no_llm = no_llm - self.ok = True + self.passed = True self.reason = "" - self.evidence = [] + self.evidence: list[str] = [] - def check(self, name, cond, evidence="", llm=False): - if llm and self.no_llm: - self.evidence.append(f"[SKIP] {name} (--no-llm)") - return True - if cond: - self.evidence.append(f"[PASS] {name}: {evidence}") - else: - self.ok = False + def check(self, name: str, condition: bool, evidence: str = "", llm: bool = False) -> bool: + self.evidence.append(f"[{'PASS' if condition else 'FAIL'}] {name}: {evidence}") + if not condition: + self.passed = False if not self.reason: - self.reason = name # record the FIRST failing check - self.evidence.append(f"[FAIL] {name}: {evidence}") - return bool(cond) - - def emit(self): - print(json.dumps({"task_id": self.task_id, "pass": self.ok, - "reason": self.reason, "evidence": self.evidence}, indent=2)) - sys.exit(0 if self.ok else 1) - -def parse_args(): - @dataclass - class VerifyArgs: - run_dir: str = "" - initial_db: str = "" - after_db: str = "" - container: str = os.environ.get("WH_CONTAINER", "wh-review") - no_llm: bool = False - - def post_process(self): - if not self.run_dir: - raise SystemExit("--run_dir is required") - return sap.parse_args(VerifyArgs) + self.reason = name + return bool(condition) + + def emit(self) -> None: + print(json.dumps({"task_id": self.task_id, "pass": self.passed, "reason": self.reason, "evidence": self.evidence}, ensure_ascii=False, indent=2)) + raise SystemExit(0 if self.passed else 1) From 3dc7554375fb2934f1f3316bca7bace8647edae4 Mon Sep 17 00:00:00 2001 From: raibows Date: Mon, 7 Sep 2026 07:53:48 -0700 Subject: [PATCH 15/15] chore: pin merged TED asset revision --- .assets-revision | 2 +- review-reports/PR-85-FINAL-AUDIT.md | 8 ++++---- scripts/fetch_assets.sh | 20 +++++--------------- sites/ted/verify/test_environment_quality.py | 5 +++-- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/.assets-revision b/.assets-revision index 35808cfa..29bb8fc6 100644 --- a/.assets-revision +++ b/.assets-revision @@ -5,4 +5,4 @@ # is a git revision (branch name like `main`, a tag, or a specific commit # sha). Override at runtime with the ASSETS_REVISION env var. repo: ChilleD/WebHarbor -revision: 8d8e4069588ef55594622fee1ab9fa51c2011d07 +revision: 480c892e976bada6c0ea3f5a66e2b9efda65525d diff --git a/review-reports/PR-85-FINAL-AUDIT.md b/review-reports/PR-85-FINAL-AUDIT.md index d40702f6..5830b7a3 100644 --- a/review-reports/PR-85-FINAL-AUDIT.md +++ b/review-reports/PR-85-FINAL-AUDIT.md @@ -12,7 +12,7 @@ This audit reviewed GitHub PR #85 head `18fa53a96b6131af0364f00aa2cbd07609a902c3 | Tasks and data | Exact duration/view arithmetic and seed account state were correct; TED task URLs were all `40016`; task 12 allowed multiple valid non-AI choices; playlist membership required independent confirmation. | Data facts were verified from the downloaded SQLite seed. The integration review established that TED is site index 19 and therefore port `40019`; all 20 task URLs were corrected. Task 12 now reports the exact removed title while still accepting any one valid non-AI row through a database-bound verifier. Playlist ordering and membership were checked directly. `judge_rubric` is not included in the web-agent prompt: `agent_demo/agent.py` passes only `ques` to `build_messages` and carries the rubric solely into judge input. | | Verifiers | LLM checks became implicit passes under `--no_llm`; URL checks used substrings without origin/path/query binding; several required search/topic/filter steps were unenforced; multiple answers were unbound or negation-sensitive; state checks were incomplete. | All 20 verifiers and `verify_lib.py` were replaced with deterministic same-origin path/query/order checks, click/submit/input checks, exact task identity, non-empty answers, negation-aware fact binding, complete read-only database comparison, and exact global state-table deltas. Positive, answer-only, wrong-task, external-origin, missing-filter, negated-answer, swapped-value, wrong-removal, unrelated-mutation, and same-table-extra-mutation tests pass. | | UI, responsive, accessibility | Cards and the lead story hid talk titles; the stacked mobile header remained sticky; controls lacked labels; repeated event buttons lacked event-specific accessible names; talk images had empty alt text; focus styles were absent; footer alignment was poor on mobile. | Talk and lead cards now render titles and speakers, the mobile header is static, filters and note/search fields are labeled, event buttons carry event-specific accessible names, talk images have descriptive alt text, focus-visible styles are present, and mobile footer alignment is corrected. Automated 320 px, 390 px, and 1440 px checks cover 30 route/viewport combinations with no horizontal overflow or broken images. | -| Integration and assets | The current HF main pin did not contain `ted.tar.gz`; all tasks targeted IKEA's `40016`; docs still described 19 sites and ended at `40018`; committed smoke/HF/PR evidence was stale; runtime startup could manufacture a mutable seed and mask missing assets. | `scripts/fetch_assets.sh` now uses immutable TED revision `597623a2f32898afa12e3bbeda15520f559aa7c7` until HF dataset PR #2 merges, while all other assets remain pinned to current HF main. Full 20-site asset fetch and clean Docker build pass. Site registration and docs now use 20 sites and ports `40000-40019`. Runtime fails closed when the TED seed is absent and only copies the authoritative seed into `instance`. Stale PR-65 evidence was removed and replaced by this exact-head audit. | +| Integration and assets | The original HF main pin did not contain `ted.tar.gz`; all tasks targeted IKEA's `40016`; docs still described 19 sites and ended at `40018`; committed smoke/HF/PR evidence was stale; runtime startup could manufacture a mutable seed and mask missing assets. | HF dataset PR #2 was merged and the repository-wide pin now references merge commit `480c892e976bada6c0ea3f5a66e2b9efda65525d`, which contains all 20 tarballs. The temporary TED override was removed. Full 20-site asset fetch and clean Docker build pass. Site registration and docs now use 20 sites and ports `40000-40019`. Runtime fails closed when the TED seed is absent and only copies the authoritative seed into `instance`. Stale PR-65 evidence was removed and replaced by this exact-head audit. | | Application and data model | Runtime seed creation was nondeterministic and could mutate `instance_seed`; partial seed gates were unsafe; topic matching was case-sensitive; search was brittle for simple morphology; registration accepted invalid/default credentials; CSRF and secret handling were unsafe; legacy SQLAlchemy lookup was used. | Runtime seed generation was removed; startup requires the HF seed. Topic matching is case-insensitive, duration filtering uses exact seconds, and search accepts simple prefixes/plurals. Registration validation, CSRF, secret handling, foreign-key enforcement, unique indexes, duplicate-race handling, and SQLAlchemy 2 lookup are implemented. The TED seed migration is idempotent and adds unique saved-talk and registration indexes. | | Evidence quality | The PR-authored evidence described PR #65, an older head, 17-site/old-port smoke output, a different HF revision, and a pre-existing image rather than a clean PR #85 source build. | All stale evidence files were removed. Current evidence includes reproducible unit/adversarial tests, actual browser trajectories with initial/after databases and verifier JSON, responsive screenshots/results, immutable asset download logs, a clean local image build, 20/20 site health, TED reset hash identity, and reset-all success. | @@ -29,11 +29,11 @@ The complete local browser evidence is retained under `/data/zhaoyang-user-proje - All TED templates and all 64 talk details render successfully: PASS. - Immutable TED asset fetch plus all-site asset fetch: PASS; 20 tarballs extracted. - TED migration: creates two unique indexes on first application and zero on the second application. -- Clean Docker build from the remediated source tree: PASS (`sha256:2dc842e93de6aa95c66239250c016f3251509ea7eb8ab312097b6d3a1b67a9bb`). +- Clean Docker build from the remediated source tree: PASS (`sha256:212755ac90732a0a031cd997dc764eec39879efc97241a8809860f0d8b184e11`). - Control-plane health and all 20 site roots: PASS. - `/reset/ted`: PASS and runtime/seed SHA-256 values match. - `/reset-all`: PASS for all 20 sites. -## Remaining external dependency +## Asset status -Hugging Face dataset PR #2 remains open. The reviewed code uses its immutable commit directly for TED while keeping the repository-wide asset pin on current HF main. Once HF PR #2 is merged, the repository-wide asset pin should be advanced to that merge commit and the temporary TED-specific override removed. +Hugging Face dataset PR #2 was merged as `480c892e976bada6c0ea3f5a66e2b9efda65525d`. The repository-wide asset pin now references that merge commit, which contains all 20 tarballs including `ted.tar.gz`; the temporary TED-specific override has been removed. diff --git a/scripts/fetch_assets.sh b/scripts/fetch_assets.sh index e9b10016..613a5315 100755 --- a/scripts/fetch_assets.sh +++ b/scripts/fetch_assets.sh @@ -22,9 +22,6 @@ REPO=$(awk '/^repo:/ {print $2}' .assets-revision) REVISION="${ASSETS_REVISION:-$(awk '/^revision:/ {print $2}' .assets-revision)}" ONLY_SITE="${1:-}" CACHE_DIR="sites/.cache/tarballs" -# TED's asset is currently in ChilleD/WebHarbor dataset PR #2 rather than the -# pinned main revision. Keep this immutable per-site pin until that HF PR lands. -TED_ASSETS_REVISION="${TED_ASSETS_REVISION:-597623a2f32898afa12e3bbeda15520f559aa7c7}" if ! command -v hf >/dev/null 2>&1; then echo "fetch_assets: 'hf' CLI not found. Install with: pip install -U \"huggingface_hub[cli]\"" >&2 @@ -36,21 +33,14 @@ echo "[fetch] huggingface.co/datasets/$REPO @ $REVISION -> sites/" if [[ -n "$ONLY_SITE" ]]; then INCLUDE="$ONLY_SITE.tar.gz" - DOWNLOAD_REVISION="$REVISION" - if [[ "$ONLY_SITE" == "ted" ]]; then - DOWNLOAD_REVISION="$TED_ASSETS_REVISION" - fi - echo "[fetch] scope: $ONLY_SITE only @ $DOWNLOAD_REVISION" - hf download "$REPO" --repo-type dataset --revision "$DOWNLOAD_REVISION" \ - --include "$INCLUDE" --local-dir "$CACHE_DIR" + echo "[fetch] scope: $ONLY_SITE only" else - hf download "$REPO" --repo-type dataset --revision "$REVISION" \ - --include "*.tar.gz" --local-dir "$CACHE_DIR" - echo "[fetch] TED asset override @ $TED_ASSETS_REVISION" - hf download "$REPO" --repo-type dataset --revision "$TED_ASSETS_REVISION" \ - --include "ted.tar.gz" --local-dir "$CACHE_DIR" + INCLUDE="*.tar.gz" fi +hf download "$REPO" --repo-type dataset --revision "$REVISION" \ + --include "$INCLUDE" --local-dir "$CACHE_DIR" + shopt -s nullglob extracted=0 for tarball in "$CACHE_DIR"/*.tar.gz; do diff --git a/sites/ted/verify/test_environment_quality.py b/sites/ted/verify/test_environment_quality.py index 45b6e96a..a81d8a64 100644 --- a/sites/ted/verify/test_environment_quality.py +++ b/sites/ted/verify/test_environment_quality.py @@ -20,8 +20,9 @@ def test_site_registration_and_task_port(self): self.assertIn('target ted)',startup);self.assertIn("'target', 'ted'",control);self.assertIn('40000-40019',docker) rows=[json.loads(line) for line in (SITE_DIR/'tasks.jsonl').read_text().splitlines() if line.strip()];self.assertEqual(len(rows),20) for i,row in enumerate(rows):self.assertEqual(row['id'],f'TED--{i}');self.assertEqual(row['web'],'http://localhost:40019/');self.assertEqual(row['verifier_path'],f'sites/ted/verify/verify_{i}.py');self.assertNotIn('answer',row) - def test_asset_override_points_to_live_ted_revision(self): - script=(ROOT/'scripts/fetch_assets.sh').read_text();self.assertIn('TED_ASSETS_REVISION="${TED_ASSETS_REVISION:-597623a2f32898afa12e3bbeda15520f559aa7c7}"',script);self.assertTrue(SEED.is_file()) + def test_asset_pin_points_to_merged_ted_revision(self): + revision=next(line.split(':',1)[1].strip() for line in (ROOT/'.assets-revision').read_text().splitlines() if line.startswith('revision:')) + script=(ROOT/'scripts/fetch_assets.sh').read_text();self.assertEqual(revision,'480c892e976bada6c0ea3f5a66e2b9efda65525d');self.assertNotIn('TED_ASSETS_REVISION',script);self.assertTrue(SEED.is_file()) def test_seed_ground_truth(self): con=sqlite3.connect(SEED) try: