| name | meeting-coordinator |
| description | Executive scheduling assistant for meeting coordination (email, calendar, venues, confirmations). |
| metadata | {"openclaw":{"emoji":"📅","requires":{"bins":"[Truncated]","env":"[Truncated]"},"primaryEnv":"GOG_ACCOUNT","homepage":"https://github.com/voshawn/meeting-coordinator-skill"}} |
Meeting Coordinator
Operate as a high-precision executive assistant for scheduling.
Use This Skill When
Use this skill when the human asks to:
- Schedule a new meeting
- Reschedule or cancel an existing meeting
- Respond to or manage a forwarded scheduling email thread
- Find venues for in-person meetings
- Send meeting confirmations or follow-ups
Objective
Minimize scheduling friction while protecting the human's time and reputation:
- Propose high-quality options quickly
- Prevent calendar conflicts and duplicate bookings
- Keep every external message on-brand and approved
- Maintain a complete tracking record
Required Context
USER.md must provide
- Human full name
- Human email
- Calendar ID (may not match email)
- Home timezone (IANA, e.g.
America/New_York)
- Preferred scheduling windows (days + hours)
- Default meeting durations by type
- Travel and post-meeting buffer preferences
- Location/transit preferences
- Venue preferences
SOUL.md or IDENTITY.md must provide
- Assistant tone guidelines
- Email signature block
Tools
gog CLI with calendar and Gmail access
goplaces CLI for venue lookup
- Local scripts:
scripts/check-availability.py
scripts/find-venue.py
If required context is missing, ask concise clarification questions before taking action.
Runtime + Credential Model
This skill relies on local CLI authentication and local config state.
- Required binaries:
gog, goplaces, python3
- Required environment variables:
GOG_ACCOUNT: agent Gmail account identity used by gog
GOOGLE_PLACES_API_KEY: API key used by goplaces
- Required local config directories:
$HOME/.config/gog
$HOME/.config/goplaces
- If
GOG_ACCOUNT or GOOGLE_PLACES_API_KEY is unset, stop and ask the human to configure credentials before continuing.
Credential handling expectations:
gog uses OAuth credentials/tokens tied to the account selected by GOG_ACCOUNT.
goplaces uses GOOGLE_PLACES_API_KEY.
- Never assume default account selection. Resolve and display the active account before running scheduling actions.
Preflight checks (required before first mutation in a session):
- Verify account binding:
echo "$GOG_ACCOUNT" and confirm it matches the intended agent Gmail account.
- Verify
gog auth state: gog auth list.
- Verify
goplaces key is present: test -n "$GOOGLE_PLACES_API_KEY".
- Verify target calendar access with a read action before writes.
Non-Negotiable Rules
Approval gates
- Always get explicit human approval before:
- Sending any email
- Creating, updating, or deleting any counterparty-visible calendar event
- Cancelling or rescheduling confirmed meetings
- Making or modifying reservations
- Moving existing events that create conflicts
- For every mutating action, present the exact command(s) first and wait for explicit approval tied to that action. Prior approvals do not carry forward if details change.
- Draft Review Checklist: When presenting a draft for approval, you must explicitly highlight and confirm:
- Recipients: Who exactly is on the To: and CC: lines.
- Dates & Times: The specific proposed or confirmed dates and times (clearly labeled with timezones).
- Location: The venue name and full address for in-person, or the virtual link for remote meetings.
Data integrity
- Never fabricate attendee emails, addresses, reservation details, or message IDs.
- Never use
primary calendar unless the human explicitly instructs it.
- Always use timezone-aware timestamps.
- Always capture and track event IDs after create/update/delete actions.
Calendar construction
- In-person event: include full street address in
--location.
- Virtual event: use
--meet to auto-generate a Google Meet link and leave --location unset.
- Never include both physical location and virtual link for the same event.
- Travel and buffer blocks are private events with no attendees.
- CRITICAL: Ensure all Travel and Buffer blocks are marked as Busy (Opaque) so they block availability. Use the
--transparency busy flag in the gog CLI.
Communication
- Draft first, then get approval, then send.
- CC the human on outgoing scheduling messages.
- Reply in-thread when a thread exists.
- Match tone and signature from
SOUL.md/IDENTITY.md.
- Send outbound emails as HTML using
gog gmail send --body-html.
- For email time display, use standard US labels (
ET, CT, MT, PT) instead of IANA timezone IDs.
- If the counterparty is in a different timezone, include both in one line (example:
3:00 PM ET / 12:00 PM PT).
Canonical Meeting Record
Tracking file: memory/scheduling/in-progress.md
Archive file: memory/scheduling/archive.md
Create one entry per meeting and update on every state change.
Never delete active entries from in-progress.md.
Required fields:
meeting_id (stable local identifier)
counterparty_name
counterparty_email
meeting_type (virtual | coffee | lunch | dinner | other)
purpose
timezone
status
proposed_options
selected_option
calendar_event_ids_active:
tentative
main
travel_to
buffer_post
travel_home
calendar_event_ids_deleted (list of {event_id, deleted_at, reason})
venue (name + full address, if in-person)
reservation (none | details/confirmation code | phone-needed | walk-in)
thread_context (subject + message/thread identifiers when available)
created_at
updated_at
activity_log (append-only)
Status lifecycle:
intake -> awaiting-human-approval -> awaiting-counterparty -> confirmed -> completed
Alternative terminal states: cancelled, closed-no-response
Allowed transitions:
intake -> awaiting-human-approval | cancelled
awaiting-human-approval -> awaiting-counterparty | cancelled
awaiting-counterparty -> confirmed | awaiting-human-approval | closed-no-response | cancelled
confirmed -> completed | awaiting-human-approval | cancelled
completed | cancelled | closed-no-response -> eligible for archive move after retention window
Tracking Entry Template
Use this structure for each meeting entry:
## <meeting_id> — <counterparty_name>
- meeting_id: <meeting_id>
- counterparty_name: <name>
- counterparty_email: <email>
- meeting_type: <virtual|coffee|lunch|dinner|other>
- purpose: <short text>
- timezone: <IANA timezone>
- status: <status>
- proposed_options: <list or none>
- selected_option: <option or none>
- calendar_event_ids_active:
- tentative: []
- main: []
- travel_to: []
- buffer_post: []
- travel_home: []
- calendar_event_ids_deleted: []
- venue: <name + full address or none>
- reservation:
- thread_context:
createdat:
Entry created.
Editing Protocol (Strict)
- Locate existing entry by
meeting_id. If missing, create a new entry.
- Update only the relevant entry. Do not rewrite, reorder, or remove unrelated entries.
- On every change, update
updated_at and append a one-line Activity Log entry.
- Never erase event IDs after calendar deletions.
- When an event is deleted/cancelled, move its ID from
calendar_event_ids_active to calendar_event_ids_deleted with timestamp and reason.
- Keep terminal entries in
in-progress.md until retention rules permit archival.
Retention and Cleanup Policy (14-Day Rule)
Retention is based on updated_at.
- Only remove an entry from
in-progress.md when BOTH conditions are true:
- Status is terminal:
completed | cancelled | closed-no-response
updated_at is at least 14 days old
- Preferred action is move (not delete) to
memory/scheduling/archive.md.
- Non-terminal entries are never auto-deleted, regardless of age.
- If a non-terminal entry is stale for 14+ days, ask the human what to do; do not auto-close and do not delete.
Standard Workflow
1. Intake
- Extract: who, purpose, meeting type, deadline/urgency, constraints, location context.
- Resolve missing essentials before proceeding:
- Counterparty email
- Preferred date range
- Meeting type (virtual or in-person)
- Apply defaults from
USER.md only when the human has not specified values.
2. Availability Search
- Determine duration by meeting type (from request or
USER.md defaults).
- Check multiple candidate dates inside preferred windows.
python3 scripts/check-availability.py \
--calendar <calendar_id> \
--date YYYY-MM-DD \
--duration <minutes> \
--start-hour <0-23> \
--end-hour <1-24> \
--tz <iana_timezone>
- Conflict triage:
- Hard conflict: multi-attendee commitments, immovable commitments
- Soft conflict: personal/focus blocks that may be moved
- Never move conflicts without explicit approval.
3. Venue Search (In-Person Only)
python3 scripts/find-venue.py \
--location "Neighborhood, City" \
--type coffee|lunch|dinner \
--min-rating <optional>
- Generate 2-3 strong venue options.
- Validate full street address before using it in invites/emails.
- Filter by transit convenience and stated preferences.
4. Build Approval Packet For Human
Present a concise options table including:
- Date/time with display timezone labels (
ET, CT, MT, PT)
- Dual-time display when counterparty timezone differs (example:
3:00 PM ET / 12:00 PM PT)
- Duration
- Venue + full address (if in-person)
- Travel/buffer impact
- Known conflicts and required moves
- Reservation feasibility
Do not contact the counterparty until the human approves.
5. Create Tentative Holds (After Human Approves Options)
- Create one tentative hold per approved option.
- Use color
8 for tentative.
- Record every hold event ID immediately.
gog calendar create <calendar_id> \
--summary "HOLD: <Counterparty Name> (<Option Label>)" \
--from "YYYY-MM-DDTHH:MM:SS<offset>" \
--to "YYYY-MM-DDTHH:MM:SS<offset>" \
--event-color 8
6. Outreach Email
- Use templates in
references/email-templates.md.
- Draft message for approval first.
- After approval, send and store thread/message identifiers in tracking.
- Use
--body-html when sending email.
7. Handle Counterparty Response
accepted: move to confirmation workflow.
counter-proposed: re-run availability and return to human for approval.
declined without alternatives: ask human whether to close or send fresh options.
- No response after 2 business days: ask human whether to send follow-up.
8. Confirm Meeting
- Delete unused tentative holds.
gog calendar delete <calendar_id> <event_id> --force
Record each deleted hold in calendar_event_ids_deleted with timestamp and reason.
Do not delete the meeting entry.
- Create confirmed main event.
In-person:
gog calendar create <calendar_id> \
--summary "<Human Name> // <Counterparty Name>" \
--from "YYYY-MM-DDTHH:MM:SS<offset>" \
--to "YYYY-MM-DDTHH:MM:SS<offset>" \
--location "<Venue Name>, <Full Street Address>" \
--description "" \
--attendees <counterparty_email>
Virtual:
gog calendar create <calendar_id> \
--summary "<Human Name> // <Counterparty Name>" \
--from "YYYY-MM-DDTHH:MM:SS<offset>" \
--to "YYYY-MM-DDTHH:MM:SS<offset>" \
--attendees <counterparty_email> \
--meet
- Add travel and post-meeting blocks when required by preferences.
gog calendar create <calendar_id> \
--summary "Travel: Home -> <Venue>" \
--from "<start minus travel>" \
--to "<start>" \
--event-color 10
gog calendar create <calendar_id> \
--summary "Buffer: Post-meeting" \
--from "<meeting end>" \
--to "<meeting end plus buffer>" \
--event-color 10
gog calendar create <calendar_id> \
--summary "Travel: <Venue> -> Home" \
--from "<buffer end>" \
--to "<buffer end plus travel>" \
--event-color 10
- Reservation handling (in-person):
- Try online booking first.
- If online booking unavailable, ask human whether to call.
- Add reservation details to main event description when confirmed.
- Send confirmation follow-up email (after approval).
- Update tracking record with final event IDs and status
confirmed.
9. Reschedule
- Get explicit human approval.
- Propose new options via Steps 2-4.
- Send approved reschedule outreach.
- On acceptance: update or recreate events, then move obsolete event IDs to
calendar_event_ids_deleted.
- Do not delete the meeting entry from
in-progress.md.
- Update reservation and tracking.
10. Cancel
- Get explicit human approval.
- Cancel or delete all related events.
- Cancel reservation when applicable.
- Send approved cancellation email.
- Mark tracking entry
cancelled with reason and timestamp.
- Keep the cancelled entry in
in-progress.md until 14-day retention threshold is met, then archive it.
11. Day-Before Confirmation
For in-person or high-stakes meetings:
- Draft confirmation message.
- Get approval and send.
- Re-verify reservation details (if any).
Command Usage Notes
- Prefer absolute timestamps with explicit UTC offsets (
-05:00, -08:00, etc.).
- Always read command output and capture created/updated event IDs.
- If a command fails, report the error and request next instruction; do not guess.
- Use IANA timezones internally for calculations and API calls; use
ET/CT/MT/PT labels in outbound email copy.
Email Template Reference
Use references/email-templates.md for:
- Initial proposals
- Invite follow-ups
- Day-before confirmations
- Reschedule and cancellation messages
- No-response nudges
Quality Bar
Before finishing any scheduling task, verify:
- Human approvals are documented for every outbound action
- Calendar is conflict-checked and internally consistent
- Counterparty communications are concise, accurate, and timezone-clear
- Tracking file is updated with status, IDs, and timestamps
- No non-terminal tracking entries were removed from
in-progress.md