Events Extraction
Extract, classify, and format upcoming events and webinars for the newsletter.
Quick Start
- Receive list of event URLs (5-15 typical)
- Fetch each URL and extract event details
- Classify: Virtual, In-person, or Hybrid
- Assign canonical categories (max 2, prefer 1)
- Format into tables and bullet lists
- Write output to
workspace/newsletter_phase2_events_YYYY-MM-DD.md
Independence: This phase runs independently of Phases 1A-1C and can execute in parallel.
Inputs
- Deterministic Phase 2 event-source artifact (mandatory):
workspace/newsletter_phase2_event_sources_YYYY-MM-DD.json- Generated by:
python3 tools/extract_event_sources.py <START_DATE> <END_DATE>
- Deterministic source config (required by extractor):
kb/EVENT_SOURCES.yaml
- Optional direct URLs (fallback only when artifact is missing):
https://github.com/resources/eventshttps://developer.microsoft.com/en-us/reactor/series/S-1625/https://developer.microsoft.com/en-us/reactor/series/S-1631/- Note: Reactor series IDs are curated seeds and should be refreshed during KB maintenance.
- Curator notes file (optional):
workspace/Jan.mdor similar - COLLECTION_DATE: Date for filename (defaults to today)
Output
- File:
workspace/newsletter_phase2_events_YYYY-MM-DD.md
Core Workflow
Step 0: Deterministic Source Extraction
Run deterministic extraction before event curation:
python3 tools/extract_event_sources.py <START_DATE> <END_DATE>
Then verify output exists:
workspace/newsletter_phase2_event_sources_<END_DATE>.json
If this phase is part of a full run, record receipt immediately after writing the JSON:
bash tools/record_phase_receipt.sh <START_DATE> <END_DATE> phase2_event_sources workspace/newsletter_phase2_event_sources_<END_DATE>.json
Step 1: Discovery
Use the deterministic JSON candidates as primary inputs. Scan all candidate URLs, then enrich with in-range event detail pages.
GitHub Resources Events (github.com/resources/events):
- Fetch the page and event deep links (
github.com/resources/events/<slug>), extract all upcoming events - These are primarily in-person events (AI Tour, GitHub Connect, conferences) and KUWC virtual series
Microsoft Reactor (series pages + event deep links):
- Prefer series pages and deep links from the JSON artifact
- Follow series links (for example S-1625 Agentic DevOps Live) to gather session pages
- Avoid Reactor search URLs as row-level event links
Microsoft AI Tour (aitour.microsoft.com):
- Check for cities where GitHub has a confirmed booth/presence
- Cross-reference with github.com/resources/events (AI Tour events appear on both)
Curator notes: Check for manually added event URLs or KUWC series entries
Step 1.5: Reactor Event Filtering (L69)
The Reactor catalog contains many events. Apply these filters:
INCLUDE (all must be true):
- Event is in English
- Event involves GitHub, Copilot, GHAS, VS Code, or Azure DevOps with GitHub integration
- Event is relevant to enterprise engineering leaders (not consumer/hobbyist)
- Event provides actionable training, product updates, or security guidance
INCLUDE event types:
- Agentic DevOps Live series (GitHub + Azure integration, modernization, security)
- VS Code Live release events (product updates)
- AI Dev Days with GitHub/Azure tracks (hackathons with enterprise prizes)
- Security sessions using GHAS + Defender for Cloud
- App modernization with Copilot agents (Java, .NET)
- GitHub + Azure DevOps workflow sessions
EXCLUDE:
- Non-English language events (Spanish, Portuguese, etc.)
- Competition/gaming formats ("Agents League Battle", esports-inspired)
- Generic AI framework tutorials without GitHub integration (LangChain4j, generic Python AI)
- Beginner-level series on non-GitHub tools
- Events with no GitHub speaker or GitHub product involvement
Key signal: Check the event tags. Events tagged with Github, GitHub Copilot, Agentic DevOps, or VS Code are strong candidates. Events tagged only with AI or generic topics without GitHub involvement should be excluded.
Step 2: Extraction
Extract required fields per event:
- Event title (exact from source)
- Date (normalize to date only for virtual; include CT times only for conference sessions)
- Format: Virtual, In-person, or Hybrid
- Registration URL (direct sign-up link)
Optional but recommended:
- Location (City, ST, Country for in-person)
- Description (1-2 sentences, enterprise value focused)
- Speakers (if available)
- Series information
Step 3: Classification
See events-formatting.md for complete formatting rules.
Canonical categories (use ONLY these, prefer 1, max 2):
- Copilot: All GitHub Copilot related sessions (VS Code AI events implicitly map here)
- GitHub Platform: Core platform, Actions, general feature launches
- Developer Experience: Workflows, training, productivity enablement
- Enterprise: Compliance, governance, administration, security policy
Skill level: Include only "Introductory" or "Advanced" when explicitly stated. Omit otherwise.
Step 4: Formatting
Virtual events: ## Virtual Events heading, table with Date + Event + Categories (NO times)
In-person events: ## In-Person Events heading, table with Date + Location + Event
Behind the scenes: ## Behind the scenes heading, short bullets for operational notes/recordings
Hybrid events: List under In-person with "(Hybrid, virtual attendance available)"
Conference sessions: Detailed tables with Date + Time (CT) + Session + Description
Step 5: Standard Content
Always include these blocks in the output:
- Copilot Fridays back catalog link
- Brian's YouTube playlists (3 playlists)
Step 6: Validation
Before writing output:
- Title, date, and registration URL present for all events
- Conference session times converted to CT
- All links embedded as markdown (no raw URLs)
- Hybrid listed under In-person with virtual note
- Categories use canonical taxonomy:
Copilot,Copilot, Advanced,Copilot, New Features,GHAS,GHAS, Security,Enterprise,GitHub Platform. Never useDeveloper ProductivityorPlatformalone. - Enterprise relevance satisfied
- Source diversity present: include event links from both GitHub Resources and Microsoft Reactor when available in range
- At least one Reactor-linked event appears in Virtual Events for >=30-day ranges when Reactor has in-range GitHub events
- Event count floor by range length:
=60-day range: 12+ total events
=30-day range: 8+ total events
- <30-day range: 4+ total events
- Event row URLs are deep links, not landing/search placeholders
- Do not use these as row-level event URLs:
https://resources.github.com/events/https://github.com/resources/eventshttps://developer.microsoft.com/en-us/reactor/?search=...https://resources.github.com/copilot-fridays-english-on-demand/
Reference
- Events Formatting - Table specs, category mapping, timezone rules
- Benchmark Example - Known-good Dec 2025 events
Done When
- Event-source artifact exists at
workspace/newsletter_phase2_event_sources_*.json - Events file exists at
workspace/newsletter_phase2_events_*.md - All provided URLs processed
- Virtual events in table format (date only, no times)
- In-person events in table format (
Date,Location,Event) -
## Behind the scenessection present with short notes - Canonical categories only (Copilot, GitHub Platform, Developer Experience, Enterprise)
- Standard content blocks included (Copilot Fridays, YouTube playlists)
- Event count floor met for date range
- At least one Reactor-sourced event included when Reactor has in-range enterprise events
- No raw URLs in output
Converted and distributed by TomeVault — claim your Tome and manage your conversions.