[fix][meetup] Give each group its own timezone in a multi-group run - #4
Merged
Merged
Conversation
Cross-posting one session to a Pro network put it at a different instant in every group. Meetup reads startDateTime as wall time in the *receiving* group's zone and accepts no offset, but createMeetupDrafts applied a single `timezone` and sent the resulting wall time to all of them. Caught on real drafts: a session at 2026-08-22T16:00:00Z was created as 11:00-05:00 in Chicago (right), 11:00+02:00 in Belgrade (7h early) and 11:00-04:00 in Toronto (1h early). Three different instants for one talk. Config gains `groupTimezones`, keyed by group urlname like `groupHosts`, and GroupTarget carries the resolved zone so createMeetupDrafts converts per group rather than once. A run now renders 16:00Z as 11:00 Chicago / 18:00 Belgrade / 12:00 Toronto -- one instant, three wall clocks. BREAKING: a multi-group run with only the shared `timezone` now throws, naming the groups that need an entry. This is deliberate. The old behaviour had no correct interpretation once more than one zone is involved, and failing loudly beats scheduling a talk at the wrong hour in front of an audience. Single-group configs are unaffected, and a narrowed run (--groups cpp-serbia) still accepts the shared `timezone`. Also adds a `list-groups` command that prints each configured group's timezone as a paste-ready `groupTimezones` map, mirroring list-venues -- Meetup already knows every group's zone, so nobody should be hand-guessing it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
groupTimezones(keyed by group urlname, likegroupHosts) puts the zone onGroupTarget, socreateMeetupDraftsconverts per group instead of once. One run nowrenders 16:00Z as 11:00 Chicago / 18:00 Belgrade / 12:00 Toronto — one instant, three
wall clocks.
list-groupscommand prints each configured group's name and the timezone Meetupholds for it, plus a paste-ready
groupTimezonesmap, mirroringlist-venues. A groupthat cannot be read is warned about rather than aborting the listing.
process.exitCode = 1was beingoverwritten by
runMain(...).then(() => process.exit(0)), so those runs exited 0.BREAKING: a multi-group run carrying only the shared
timezonenow throws, naming thegroups that need an entry. One wall time has no correct interpretation across several
zones, and failing loudly beats scheduling a talk at the wrong hour in front of an
audience. Single-group configs and narrowed runs (
--groups cpp-serbia) still accepttimezoneunchanged. This lands after 0.3.0, so it needs a 0.4.0 bump before the next tag.Motivation
Cross-posting one session to a Pro network put it at a different instant in every group —
a talk at 16:00Z was created as 11:00 in Chicago (right), 11:00 in Belgrade (7h early) and
11:00 in Toronto (1h early) — because Meetup reads
startDateTimeas wall time in thereceiving group's own zone and accepts no offset.
Testing
Tested locally. Full CI chain green (build, lint, format:check, typecheck, spell, test),
125 tests — 11 new, covering per-group conversion, case-insensitive
groupTimezoneskeys,the multi-group refusal and the groups it names, the single-group and narrowed-run
exemptions, and both multi-group exit codes through the real bin.
list-groupsis untestedbeyond typecheck: it needs live credentials. It is read-only, one
groupByUrlnamequeryper group.
Checkup list