Add a new breakout series
A breakout series requires changes in two repos: ethereum/pm (where the bot lives and the issue template lives) and forkcast (where calls render). This skill covers the pm side and the cross-repo handoff. Invoke the add-series skill for the Forkcast-side file edits.
Reference commit for the pm-side pattern: 6e572f83 ("acdbot: introduce native aa breakout"). Reference commit for adding to the trusted list: 14a86086 ("acdbot: add to trusted list for pqi").
Step 1: Gather info from the user
You need:
- Display name (e.g., "P2P Networking", "Native Account Abstraction")
- Facilitator's GitHub username (e.g.,
kamilsa) - First meeting date/time UTC — informational; the facilitator will open the issue themselves
- Duration in minutes (typically 60 or 90)
- Cadence — one of:
weekly,bi-weekly,monthly,other - Series config key — lowercased, no-spaces version of the display name used as the pm config key (e.g.,
p2pnetworking,nativeaa,encryptthemempool). Derive and confirm with the user. - Forkcast type abbreviation — short slug used in Forkcast URLs/folders (e.g.,
p2p,aa,pqi). Existing values are insrc/data/calls.tsCallType. Confirm with the user — this is theadd-series"Short type key" input. - Tailwind color for the badge/border (used by
add-series). Pick an unused color from the existing palettes insrc/components/calls-index/CallsIndexTimeline.tsx. - YouTube playlist ID (recommended upfront) — ask the user to create an empty playlist named after the series and share the playlist ID. If they can't create it now, leave as
nulland they can land a follow-up PR later.
Step 2: Locate the pm checkout
The user typically has ethereum/pm checked out at ../pm relative to forkcast. Verify by running ls ../pm/.github/ACDbot/call_series_config.yml. If not present, ask the user for the path.
Step 3: Make the four pm-repo edits
All four files live under ../pm/.github/:
workflows/protocol-call-workflow.yml— append the facilitator's GitHub username (lowercase) to thetrustedContributorsarray. This authorizes them to trigger the bot. Verify the exact GitHub account with the user before adding — this list grants bot permissions, so a typo or impersonated handle is a security concern, not just a correctness one.ACDbot/call_series_config.yml— add a new entry undercall_series:just before theone-off:block. Shape:<series-key>: display_name: "<Display Name>" youtube_playlist_id: "<PLJqWcTqh_zK...>" # or null if not yet created discord_webhook_env: null autopilot_defaults: duration: <60|90> occurrence_rate: "<weekly|bi-weekly|monthly|other>" need_youtube_streams: false display_zoom_link_in_invite: true external_meeting_link: falseUse the YouTube playlist ID gathered in Step 1 if available. If left
null, land a follow-up PR (acdbot: wire up <series> youtube playlist) once the playlist exists — see PR pattern at commita125cd3f.ISSUE_TEMPLATE/protocol-call-form.yml— add the display name to theCall Seriesdropdownoptions:. The list is mostly alphabetical — insert accordingly.labeler.yml— append a new label entry at the end. Shape:<LabelName>: - "^(.*<regex pattern>.*)"Match the existing file's indent style: one space before the
-(unusual but consistent with the rest of the file). The regex should match plausible issue title phrasings — usually the display name and one short alias. Note the file does not end with a trailing newline; preserve that.
Step 4: Make the Forkcast-side edits via add-series
Run the add-series skill with the Forkcast type abbreviation, display name, pm series key (so it knows whether to add a SERIES_TO_TYPE mapping), and Tailwind color. It will:
- Update
src/data/calls.ts(CallTypeunion +callTypeNames) - Update color maps in
CallsIndexTimeline.tsxandHomePage.tsx - Update
scripts/sync-call-assets.mjs(KNOWN_TYPESandSERIES_TO_TYPEmapping) - Run typecheck/build
Skip add-series Step 5 ("Verify artifacts exist") and Step 6 ("Update protocol-calls.generated.json") — for a brand-new breakout there are no calls yet. Forkcast renders nothing until the first call is synced via the normal sync call assets from eth/pm pipeline.
Step 5: Open both PRs
- pm PR: branch
acdbot/<series>-breakout, titleacdbot: introduce <series> breakout, againstethereum/pm:master. - Forkcast PR: branch
add-<series>-breakout, titleadd <series> breakout series, againstethereum/forkcast:main.
Use whichever remote the user pushes their fork branches to (check git remote -v if unsure).
The Forkcast PR is safe to merge before any call exists — all new entries are latent until a record with the new type lands in protocol-calls.generated.json. The pm PR is the gating dependency: the facilitator can't open their first issue until the dropdown option exists.
Step 6: Hand off the manual checklist to the user
Print this verbatim:
- Zoom account: open an issue in the EF devops repo requesting a Zoom account for the facilitator. Required so the bot can assign them host role on the EF zoom-bot.
- Once Zoom account exists: add the facilitator as a co-host on the zoom-bot account.
- Facilitator opens the first issue: ask them to open the first call issue themselves in
ethereum/pmusing theProtocol Calltemplate, selecting the new series from the dropdown with Autopilot enabled. Letting them open it means they can edit the agenda directly. - YouTube playlist: if not already wired up in the initial PR, create an empty
<Display Name>playlist on the EF YouTube channel and open a follow-up PR settingyoutube_playlist_idincall_series_config.yml. Doing this before the first call means the bot uploads the inaugural recording into the playlist automatically. - Discord channel: first check whether an existing Eth R&D channel already fits (most breakouts do — e.g., a networking series can usually live in an existing networking channel). Only request a new channel if no existing one is a reasonable home; the goal is to keep the channel list from growing indefinitely. If a new channel is genuinely needed, ask the Eth R&D Discord admins.
Step 7: Done
Confirm both PR URLs to the user. Summarize: "pm side configures the bot and dropdown; Forkcast side renders the calls once sync call assets from eth/pm picks them up after the first meeting."