From c2001d7dcba92c346df3d5f197490e75544c95d6 Mon Sep 17 00:00:00 2001 From: Superagentic AI <190614718+Superagentic-AI@users.noreply.github.com> Date: Sun, 18 Oct 2026 12:51:51 +0100 Subject: [PATCH] Re-export from site b7c271d: remove the cancelled London voice agents talk --- CHANGELOG.md | 4 + docs/COMMANDS.md | 2 +- docs/SITE-SYNC.md | 7 +- src/agenteng/data/catalogue.json | 137 +++---------------------------- src/agenteng/screens.py | 2 - tests/fixtures/site_commands.tsv | 1 - tests/test_service.py | 4 +- tests/test_talks_gallery.py | 37 ++++++++- 8 files changed, 53 insertions(+), 141 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 462d73e..9b82e5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- Catalogue re-exported from site commit b7c271d: the London 2026 talk "Debugging and Optimizing Voice Agents" did not take place, so it and its speaker card are removed. London now lists 9 talks and 17 speakers across 11 events. The "Who is speaking?", "When and where was the conference?" and "How is this different?" FAQ answers follow the site (nine technical talks). The talk is gone from the agenda, gallery, talks, search and bingo terms, and the website command fixture drops its speaker command. Its old gallery slug returns not_found; the site redirects that page to /london-2026/videos. + ## 0.0.26 - 2026-10-18 - Catalogue re-exported from site commit 1072362: the London 2026 recordings are public. "Will talks be recorded?" now answers "Yes. Recordings are public and published on https://agentengineering.world/london-2026/videos as they become available, starting with the welcome video.", and the day guide's photography and content section says the same. The previous wording limited recordings to ticket holders. diff --git a/docs/COMMANDS.md b/docs/COMMANDS.md index e412952..ef5974e 100644 --- a/docs/COMMANDS.md +++ b/docs/COMMANDS.md @@ -208,7 +208,7 @@ agenteng gallery --city London agenteng gallery london-2026-welcome ``` -The primary command for videos. Order follows [/gallery](https://agentengineering.world/gallery): the [London 2026 recordings](https://agentengineering.world/london-2026/videos) (the welcome video `iTV8VSrVJEk`, then the 10 talks marked "Recording coming soon"), then the Harness Engineering San Francisco event recap (kind `event-recap`, a short recap of the evening, not a talk recording; the old slug `sf-harness-engineering-2026-full-event` still resolves). Each row carries `slug`, `gallery_kind` (`talk`, `event-recording`, `event-recap` or `a2a`), `summary` when the site publishes one, `gallery` (`london`, `san-francisco` or `a2a`), `status` (`recorded`, `recording-coming-soon` or `upcoming`), `status_label`, `youtube_id` and `video_url` when published, and `talk_url` (`/gallery/`). Transcripts are included only when the website publishes one; none are published today. A2A talks keep their AI-generated label and the A2A disclaimer; `agenteng a2a-talks` remains the dedicated view. Over MCP, A2A and REST use `{"operation":"gallery"}` with optional `city`, `event_id`, `topic`, `query`, `speaker_id` and `include_a2a`, or `{"operation":"talk","session_id":""}` for one item. +The primary command for videos. Order follows [/gallery](https://agentengineering.world/gallery): the [London 2026 recordings](https://agentengineering.world/london-2026/videos) (the welcome video `iTV8VSrVJEk`, then the 9 talks marked "Recording coming soon"), then the Harness Engineering San Francisco event recap (kind `event-recap`, a short recap of the evening, not a talk recording; the old slug `sf-harness-engineering-2026-full-event` still resolves). Each row carries `slug`, `gallery_kind` (`talk`, `event-recording`, `event-recap` or `a2a`), `summary` when the site publishes one, `gallery` (`london`, `san-francisco` or `a2a`), `status` (`recorded`, `recording-coming-soon` or `upcoming`), `status_label`, `youtube_id` and `video_url` when published, and `talk_url` (`/gallery/`). Transcripts are included only when the website publishes one; none are published today. A2A talks keep their AI-generated label and the A2A disclaimer; `agenteng a2a-talks` remains the dedicated view. Over MCP, A2A and REST use `{"operation":"gallery"}` with optional `city`, `event_id`, `topic`, `query`, `speaker_id` and `include_a2a`, or `{"operation":"talk","session_id":""}` for one item. ### agenteng talks diff --git a/docs/SITE-SYNC.md b/docs/SITE-SYNC.md index db8c485..d2a500f 100644 --- a/docs/SITE-SYNC.md +++ b/docs/SITE-SYNC.md @@ -4,7 +4,7 @@ Every displayed AgentEng command must be accepted by the CLI. The hero Orchestra Run `python scripts/check-website-commands.py WEBSITE_REPO` against a website checkout with Node dependencies installed. It reads public TypeScript literals using the AST, validates them against the actual CLI, and executes public lookup/setup commands. Server loops and coding sessions are parsed without launching them. Dynamic speaker-profile command rendering is covered by the speaker fixture and website tests. -The fixture contains 97 command locations. Tool CI executes each row and requires success. Update it when website commands change. +The fixture contains 96 command locations. Tool CI executes each row and requires success. Update it when website commands change. | Command | Website source (`src/`) | | --- | --- | @@ -89,7 +89,6 @@ The fixture contains 97 command locations. Tool CI executes each row and require | `agenteng speaker jon-bratseth` | `data/speaker-stack.ts` | | `agenteng speaker meryem-arik` | `data/speaker-stack.ts` | | `agenteng speaker frederic-barthelet` | `data/speaker-stack.ts` | -| `agenteng speaker stas-bichenko` | `data/speaker-stack.ts` | | `agenteng speaker jocelyn-darcy` | `data/speaker-stack.ts` | | `agenteng guide --london` | `pages/Guide.tsx` | | `agenteng event --london` | `pages/London2026.tsx` | @@ -136,14 +135,14 @@ Pages mirrored: | Page | Mirrored by | | --- | --- | | `/london-2026` and `/london-2026/speakers`, `/agenda`, `/guide` | events, speakers, agenda, guide | -| `/london-2026/videos` (welcome video `iTV8VSrVJEk`, then 10 talks marked coming soon) | `agenteng gallery --city London`, `agenteng recordings` | +| `/london-2026/videos` (welcome video `iTV8VSrVJEk`, then 9 talks marked coming soon) | `agenteng gallery --city London`, `agenteng recordings` | | `/gallery` (London and San Francisco tabs) | `agenteng gallery` | | `/gallery/:slug` | `agenteng gallery ` | | `/agenteng` (CLI page) | the commands in the table above | Data files read by `scripts/export-website.mjs`: -- `src/data/talks.ts`: exports `londonVideos` (the London welcome recording, then the 10 London talks), `sfGallery` (the Harness Engineering San Francisco event recap, kind `event-recap`, slug `sf-harness-engineering-2026-recap`, with the site's `summary`; the site redirects the old `/gallery/sf-harness-engineering-2026-full-event` and `agenteng gallery` still accepts the old slug) and `talks` (both, then the A2A talks). `/gallery` shows `londonVideos` and `sfGallery`. Event recaps are their own kind: they are never labelled as talk recordings, and the Harness Engineering San Francisco sessions do not point to the recap as their recording. Each exported row has a `gallery` tab (`london`, `san-francisco` or `a2a`), slug, title, kind, city, event, speaker, topics, `youtube_id`, `transcript`, status, AI-generated flag and its `/gallery/` URL, with one source each. `talks.ts` builds its rows from other data, so the exporter rebuilds them from the same literals (the `londonWelcome` and `sfRecordings` literals, agenda, speakers, `sf-code-engineering.ts` and `agentToAgent.ts`) and fails if the exports, the Gallery page or the mapping change, or if London or Code Engineering talks start publishing a YouTube ID or transcript, so a newly published recording is mirrored deliberately. No transcripts are published today, so none are exported. A2A rows use the `a2a-talks` source kind, so general search leaves them out. +- `src/data/talks.ts`: exports `londonVideos` (the London welcome recording, then the 9 London talks), `sfGallery` (the Harness Engineering San Francisco event recap, kind `event-recap`, slug `sf-harness-engineering-2026-recap`, with the site's `summary`; the site redirects the old `/gallery/sf-harness-engineering-2026-full-event` and `agenteng gallery` still accepts the old slug) and `talks` (both, then the A2A talks). `/gallery` shows `londonVideos` and `sfGallery`. Event recaps are their own kind: they are never labelled as talk recordings, and the Harness Engineering San Francisco sessions do not point to the recap as their recording. Each exported row has a `gallery` tab (`london`, `san-francisco` or `a2a`), slug, title, kind, city, event, speaker, topics, `youtube_id`, `transcript`, status, AI-generated flag and its `/gallery/` URL, with one source each. `talks.ts` builds its rows from other data, so the exporter rebuilds them from the same literals (the `londonWelcome` and `sfRecordings` literals, agenda, speakers, `sf-code-engineering.ts` and `agentToAgent.ts`) and fails if the exports, the Gallery page or the mapping change, or if London or Code Engineering talks start publishing a YouTube ID or transcript, so a newly published recording is mirrored deliberately. No transcripts are published today, so none are exported. A2A rows use the `a2a-talks` source kind, so general search leaves them out. - `codeEngineeringTalks` in `talks.ts` is kept for /san-francisco only: the four Code Engineering San Francisco talks have no gallery page, so they are exported with `gallery: null` and link to `/san-francisco`. - `src/data/sf-code-engineering.ts`: roles, companies and links for the Code Engineering San Francisco (27 October 2026) speakers, checked against the SanFrancisco page roster. - `src/data/events.ts`: next and previous editions (`site_links.next_event` is Agent Engineering San Francisco, April 2027, `/san-francisco`; `site_links.previous_event` is London 2026, `/london-2026`), plus each event's `page_url`. `site_links` also holds `/gallery` and `/london-2026/videos`. The April 2027 conference is announced without a date or venue, so it is a link labelled "coming April 2027", not a catalogue event. The discovery prompt that used to read "Find the next Agent Engineering Conference in London" now follows `site_links.next_event`: "What is the next Agent Engineering event in San Francisco?", answered with the next published San Francisco event and "Agent Engineering San Francisco is coming April 2027". diff --git a/src/agenteng/data/catalogue.json b/src/agenteng/data/catalogue.json index c72b0c8..ba37144 100644 --- a/src/agenteng/data/catalogue.json +++ b/src/agenteng/data/catalogue.json @@ -1,9 +1,9 @@ { "schema_version": 1, - "version": "website-d3c49871fc80", - "published_at": "2026-10-18T11:09:19.364Z", - "source_commit": "4e34c4b4257525dc18d6ab724cc37e2597251af5", - "source_hash": "d3c49871fc80cc4b0cb61392e3bcec13f262466d3d7d2c7e0b49cde81429d859", + "version": "website-3575025765be", + "published_at": "2026-10-18T11:49:06.675Z", + "source_commit": "b7c271d50775a39e6dff4df6431224831d3acc51", + "source_hash": "3575025765be8b66473677c626c3385c1c9ebb98f4fbf808e3774af0c1fe105d", "events": [ { "id": "agenteng-london-2026", @@ -590,57 +590,6 @@ "speaker-frederic-barthelet" ] }, - { - "id": "stas-bichenko", - "name": "Stas Bichenko", - "role": "CEO", - "company": "Recombine", - "company_url": "https://recombine.ai", - "note": null, - "location": { - "city": "London", - "country": "GB" - }, - "links": { - "x": "https://x.com/sbichenko", - "linkedin": "https://www.linkedin.com/in/stas-bichenko/" - }, - "projects": [ - { - "name": "Recombine platform", - "url": "https://recombine.ai/", - "blurb": "Self-hosted voice and text agents, in your own cloud" - }, - { - "name": "Banking & financial services", - "url": "https://recombine.ai/cases/banking.html", - "blurb": "Pre-collection, KYC and support agents for banks" - }, - { - "name": "Mobility & marketplaces", - "url": "https://recombine.ai/cases/mobility.html", - "blurb": "Driver onboarding and partner operations agents" - }, - { - "name": "Telecom", - "url": "https://recombine.ai/cases/telecom.html", - "blurb": "Upsell, churn-prevention and outage-support agents" - } - ], - "announced_on": "2026-09-22", - "disciplines": [ - "eval", - "agentic" - ], - "event_ids": [ - "agenteng-london-2026" - ], - "talk_title": "Debugging and Optimizing Voice Agents", - "abstract": "Stas looks at how to identify problems in voice agents and improve their performance.", - "source_ids": [ - "speaker-stas-bichenko" - ] - }, { "id": "jocelyn-darcy", "name": "Jocelyn D'Arcy", @@ -906,21 +855,6 @@ "london-session-7" ] }, - { - "id": "agenteng-london-2026-8", - "event_id": "agenteng-london-2026", - "title": "Debugging and Optimizing Voice Agents", - "kind": "talk", - "start": "2026-10-16T12:25:00+01:00", - "end": "2026-10-16T12:55:00+01:00", - "speaker_id": "stas-bichenko", - "topics": [ - "voice" - ], - "source_ids": [ - "london-session-8" - ] - }, { "id": "agenteng-london-2026-9", "event_id": "agenteng-london-2026", @@ -1161,7 +1095,7 @@ { "id": "faq-2", "question": "When and where was the conference?", - "answer": "The first Agent Engineering Conference took place in London on 16 October 2026 at Everyman, Canary Wharf, London. It was a one-day, single-track conference of ten 30-minute technical talks.", + "answer": "The first Agent Engineering Conference took place in London on 16 October 2026 at Everyman, Canary Wharf, London. It was a one-day, single-track conference of nine 30-minute technical talks.", "event_id": "agenteng-london-2026", "source_ids": [ "faq-2" @@ -1224,7 +1158,7 @@ { "id": "faq-9", "question": "Who is speaking?", - "answer": "The lineup: Samuel Colvin, Founder & CEO at Pydantic; Andrey Breslav, Founder at CodeSpeak; Ismail Homan Pelaseyed, Co-founder & CTO at Superagent; Tobie Morgan Hitchcock, Founder & CEO at SurrealDB; Alexander Korchagin, Head of Technology Adoption at JetBrains; Jon Bratseth, CEO at Vespa.ai; Meryem Arik, CEO at Doubleword; Frédéric Barthelet, CTO & Co-founder at Alpic; Stas Bichenko, CEO at Recombine; Jocelyn D'Arcy, CEO at Poindexter Labs. See the published speakers page.", + "answer": "The lineup: Samuel Colvin, Founder & CEO at Pydantic; Andrey Breslav, Founder at CodeSpeak; Ismail Homan Pelaseyed, Co-founder & CTO at Superagent; Tobie Morgan Hitchcock, Founder & CEO at SurrealDB; Alexander Korchagin, Head of Technology Adoption at JetBrains; Jon Bratseth, CEO at Vespa.ai; Meryem Arik, CEO at Doubleword; Frédéric Barthelet, CTO & Co-founder at Alpic; Jocelyn D'Arcy, CEO at Poindexter Labs. See the published speakers page.", "event_id": "agenteng-london-2026", "source_ids": [ "faq-9" @@ -1260,7 +1194,7 @@ { "id": "faq-13", "question": "How is this different from other AI conferences?", - "answer": "The conference covers the engineering discipline behind AI agents. It is one track of ten technical talks. Sessions are on systems, architectures, and the trade-offs involved, given by practitioners who build and operate agents themselves.", + "answer": "The conference covers the engineering discipline behind AI agents. It is one track of nine technical talks. Sessions are on systems, architectures, and the trade-offs involved, given by practitioners who build and operate agents themselves.", "event_id": "agenteng-london-2026", "source_ids": [ "faq-13" @@ -2001,36 +1935,6 @@ "talk-london-2026-if-coding-is-solved-what-s-left" ] }, - { - "slug": "london-2026-debugging-and-optimizing-voice-agents", - "title": "Debugging and Optimizing Voice Agents", - "kind": "talk", - "city": "London", - "event_id": "agenteng-london-2026", - "event_name": "Agent Engineering London 2026", - "event_url": "https://agentengineering.world/london-2026", - "date": "2026-10-16", - "speaker": { - "name": "Stas Bichenko", - "role": "CEO", - "company": "Recombine", - "slug": "stas-bichenko" - }, - "topics": [ - "Eval", - "Agentic" - ], - "youtube_id": null, - "transcript": null, - "ai_generated": false, - "status": "recording-coming-soon", - "session_id": "agenteng-london-2026-8", - "gallery": "london", - "url": "https://agentengineering.world/gallery/london-2026-debugging-and-optimizing-voice-agents", - "source_ids": [ - "talk-london-2026-debugging-and-optimizing-voice-agents" - ] - }, { "slug": "london-2026-browser-use-is-the-default-your-ui-is-not-your-agent-api", "title": "Browser Use Is the Default. Your UI Is Not Your Agent API.", @@ -2725,13 +2629,6 @@ "event_id": "agenteng-london-2026", "kind": "speaker" }, - { - "id": "speaker-stas-bichenko", - "url": "https://agentengineering.world/london-2026/speakers#stas-bichenko", - "text": "Stas Bichenko, CEO at Recombine. Debugging and Optimizing Voice Agents. Stas looks at how to identify problems in voice agents and improve their performance.", - "event_id": "agenteng-london-2026", - "kind": "speaker" - }, { "id": "speaker-jocelyn-darcy", "url": "https://agentengineering.world/london-2026/speakers#jocelyn-darcy", @@ -2795,13 +2692,6 @@ "event_id": "agenteng-london-2026", "kind": "session" }, - { - "id": "london-session-8", - "url": "https://agentengineering.world/london-2026/agenda", - "text": "12:25 Debugging and Optimizing Voice Agents. Stas Bichenko. Stas looks at how to identify problems in voice agents and improve their performance.", - "event_id": "agenteng-london-2026", - "kind": "session" - }, { "id": "london-session-9", "url": "https://agentengineering.world/london-2026/agenda", @@ -3001,7 +2891,7 @@ { "id": "faq-2", "url": "https://agentengineering.world/london-2026#faq", - "text": "When and where was the conference?\nThe first Agent Engineering Conference took place in London on 16 October 2026 at Everyman, Canary Wharf, London. It was a one-day, single-track conference of ten 30-minute technical talks.", + "text": "When and where was the conference?\nThe first Agent Engineering Conference took place in London on 16 October 2026 at Everyman, Canary Wharf, London. It was a one-day, single-track conference of nine 30-minute technical talks.", "event_id": "agenteng-london-2026", "kind": "faq" }, @@ -3050,7 +2940,7 @@ { "id": "faq-9", "url": "https://agentengineering.world/london-2026#faq", - "text": "Who is speaking?\nThe lineup: Samuel Colvin, Founder & CEO at Pydantic; Andrey Breslav, Founder at CodeSpeak; Ismail Homan Pelaseyed, Co-founder & CTO at Superagent; Tobie Morgan Hitchcock, Founder & CEO at SurrealDB; Alexander Korchagin, Head of Technology Adoption at JetBrains; Jon Bratseth, CEO at Vespa.ai; Meryem Arik, CEO at Doubleword; Frédéric Barthelet, CTO & Co-founder at Alpic; Stas Bichenko, CEO at Recombine; Jocelyn D'Arcy, CEO at Poindexter Labs. See the published speakers page.", + "text": "Who is speaking?\nThe lineup: Samuel Colvin, Founder & CEO at Pydantic; Andrey Breslav, Founder at CodeSpeak; Ismail Homan Pelaseyed, Co-founder & CTO at Superagent; Tobie Morgan Hitchcock, Founder & CEO at SurrealDB; Alexander Korchagin, Head of Technology Adoption at JetBrains; Jon Bratseth, CEO at Vespa.ai; Meryem Arik, CEO at Doubleword; Frédéric Barthelet, CTO & Co-founder at Alpic; Jocelyn D'Arcy, CEO at Poindexter Labs. See the published speakers page.", "event_id": "agenteng-london-2026", "kind": "faq" }, @@ -3078,7 +2968,7 @@ { "id": "faq-13", "url": "https://agentengineering.world/london-2026#faq", - "text": "How is this different from other AI conferences?\nThe conference covers the engineering discipline behind AI agents. It is one track of ten technical talks. Sessions are on systems, architectures, and the trade-offs involved, given by practitioners who build and operate agents themselves.", + "text": "How is this different from other AI conferences?\nThe conference covers the engineering discipline behind AI agents. It is one track of nine technical talks. Sessions are on systems, architectures, and the trade-offs involved, given by practitioners who build and operate agents themselves.", "event_id": "agenteng-london-2026", "kind": "faq" }, @@ -3383,13 +3273,6 @@ "event_id": "agenteng-london-2026", "kind": "talk" }, - { - "id": "talk-london-2026-debugging-and-optimizing-voice-agents", - "url": "https://agentengineering.world/gallery/london-2026-debugging-and-optimizing-voice-agents", - "text": "Debugging and Optimizing Voice Agents\nStas Bichenko, CEO at Recombine\nAgent Engineering London 2026\nrecording-coming-soon", - "event_id": "agenteng-london-2026", - "kind": "talk" - }, { "id": "talk-london-2026-browser-use-is-the-default-your-ui-is-not-your-agent-api", "url": "https://agentengineering.world/gallery/london-2026-browser-use-is-the-default-your-ui-is-not-your-agent-api", diff --git a/src/agenteng/screens.py b/src/agenteng/screens.py index e50ebc7..a980a44 100644 --- a/src/agenteng/screens.py +++ b/src/agenteng/screens.py @@ -50,8 +50,6 @@ ("Testing", r"\btesting\b"), ("Is coding solved?", r"\bcoding is solved\b"), ("Skynet", r"\bSkynet\b"), - ("Voice agents", r"\bvoice agents?\b"), - ("Debugging", r"\bdebugging\b"), ("Browser use", r"\bbrowser use\b"), ("Scraping", r"\bscraping\b"), ("Tool selection", r"\bselection\b"), diff --git a/tests/fixtures/site_commands.tsv b/tests/fixtures/site_commands.tsv index 7aac3bd..4111bf7 100644 --- a/tests/fixtures/site_commands.tsv +++ b/tests/fixtures/site_commands.tsv @@ -79,7 +79,6 @@ works agenteng speaker alexander-korchagin data/speaker-stack.ts agenteng speake works agenteng speaker jon-bratseth data/speaker-stack.ts agenteng speaker jon-bratseth Verified against the CLI works agenteng speaker meryem-arik data/speaker-stack.ts agenteng speaker meryem-arik Verified against the CLI works agenteng speaker frederic-barthelet data/speaker-stack.ts agenteng speaker frederic-barthelet Verified against the CLI -works agenteng speaker stas-bichenko data/speaker-stack.ts agenteng speaker stas-bichenko Verified against the CLI works agenteng speaker jocelyn-darcy data/speaker-stack.ts agenteng speaker jocelyn-darcy Verified against the CLI alias agenteng guide --london pages/Guide.tsx agenteng guide --london --london shortcut; the guide is published for London only alias agenteng --agent-to-agent pages/AgentToAgent.tsx agenteng --agent-to-agent page badge; runs agenteng a2a-talks diff --git a/tests/test_service.py b/tests/test_service.py index 5c6e38e..1107f79 100644 --- a/tests/test_service.py +++ b/tests/test_service.py @@ -14,7 +14,7 @@ def test_export_has_evidence_and_honest_dates(service): c = service.catalogue - assert (len(c.events), len(c.speakers), len(c.sessions)) == (11, 18, 25) + assert (len(c.events), len(c.speakers), len(c.sessions)) == (11, 17, 24) past = [e for e in c.events if e.date_precision == "month"] assert len(past) == 8 assert all(e.start is None and e.end is None for e in past) @@ -156,7 +156,7 @@ def test_model_free_question_routing(service): price = open_service.lookup(Request(operation="ask", query="What are London ticket prices?")) assert price.data["current_offers"][0]["amount"] == 149 agenda = service.lookup(Request(operation="ask", query="London agenda")) - assert len(agenda.data) == 17 + assert len(agenda.data) == 16 when = service.lookup(Request(operation="ask", query="When is the next London conference?")) assert len(when.data) == 1 and when.data[0]["date"] == "2026-10-16" ambiguous = service.lookup(Request(operation="ask", query="ticket prices")) diff --git a/tests/test_talks_gallery.py b/tests/test_talks_gallery.py index 80db129..f2cb6fe 100644 --- a/tests/test_talks_gallery.py +++ b/tests/test_talks_gallery.py @@ -29,14 +29,14 @@ def run(*args): def test_gallery_mirrors_site_order_without_a2a(): rows = lookup(operation="gallery", limit=100).data - assert [r["gallery"] for r in rows] == ["london"] * 11 + ["san-francisco"] + assert [r["gallery"] for r in rows] == ["london"] * 10 + ["san-francisco"] assert rows[0]["slug"] == "london-2026-welcome" assert rows[0]["youtube_id"] == "iTV8VSrVJEk" and rows[0]["status"] == "recorded" - assert {r["status_label"] for r in rows[1:11]} == {"Recording coming soon"} + assert {r["status_label"] for r in rows[1:10]} == {"Recording coming soon"} assert rows[-1]["youtube_id"] == "AP1RRbXZhsE" assert all(r["talk_url"] == f"{SITE}/gallery/{r['slug']}" for r in rows) assert not any(r.get("ai_generated") or r["event_id"] == SF_CODE for r in rows) - assert all(r["youtube_id"] is None and "transcript" not in r for r in rows[1:11]) + assert all(r["youtube_id"] is None and "transcript" not in r for r in rows[1:10]) def test_gallery_a2a_opt_in_last_and_labelled(): @@ -55,7 +55,7 @@ def test_talks_is_the_programme_listing(): assert not any( r.get("ai_generated") or r.get("gallery_kind") == "event-recording" for r in rows ) - assert sum(r["event_id"] == LONDON for r in rows) == 10 + assert sum(r["event_id"] == LONDON for r in rows) == 9 code = [r for r in rows if r["event_id"] == SF_CODE] assert len(code) == 4 assert all(r["talk_url"] == f"{SITE}/san-francisco" and r["gallery"] is None for r in code) @@ -232,3 +232,32 @@ def test_sf_harness_video_is_an_event_recap(): ) text = Service().catalogue.model_dump_json().casefold() assert "full-event" not in text and "full event" not in text + + +# The cancelled talk's words, reversed so the guard itself does not reintroduce them. +CANCELLED = [w[::-1] for w in ("sats", "oknehcib", "tnega eciov", "gnizimitpo-dna-gniggubed")] +CANCELLED_SLUG = "-".join( + ["london-2026", *[w[::-1] for w in ("gniggubed", "dna", "gnizimitpo", "eciov", "stnega")]] +) +CANCELLED_SPEAKER = "-".join(w[::-1] for w in ("sats", "oknehcib")) + + +def test_cancelled_london_talk_is_gone(): + service = Service() + text = service.catalogue.model_dump_json().casefold() + for word in CANCELLED: + assert word not in text, word + london_talks = [s for s in service.catalogue.sessions if s.event_id == LONDON and s.speaker_id] + assert len(london_talks) == 9 + assert ( + len([t for t in service.catalogue.talks if t.event_id == LONDON and t.kind == "talk"]) == 9 + ) + assert lookup(operation="talk", session_id=CANCELLED_SLUG).status == "not_found" + assert lookup(operation="speaker", speaker_id=CANCELLED_SPEAKER).status == "not_found" + + +def test_bingo_has_no_cancelled_talk_terms(): + from agenteng import screens + + labels = {label.casefold() for label, _ in screens.BINGO_TERMS} + assert not labels & {CANCELLED[2] + "s", "debugging"}