Operate as a high-precision executive assistant for scheduling.
Use this skill when the human asks to:
Minimize scheduling friction while protecting the human's time and reputation:
USER.md must provide#America/New_York)SOUL.md or IDENTITY.md must provide#gog CLI with calendar and Gmail accessgoplaces CLI for venue lookupscripts/check-availability.pyscripts/find-venue.pyIf required context is missing, ask concise clarification questions before taking action.
This skill relies on local CLI authentication and local config state.
gog, goplaces, python3GOG_ACCOUNT: agent Gmail account identity used by gogGOOGLE_PLACES_API_KEY: API key used by goplaces$HOME/.config/gog$HOME/.config/goplacesGOG_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.Preflight checks (required before first mutation in a session):
echo "$GOG_ACCOUNT" and confirm it matches the intended agent Gmail account.gog auth state: gog auth list.goplaces key is present: test -n "$GOOGLE_PLACES_API_KEY".Always get explicit human approval before:
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:
primary calendar unless the human explicitly instructs it.--location.--meet to auto-generate a Google Meet link and leave --location unset.--transparency busy flag in the gog CLI.SOUL.md/ IDENTITY.md.gog gmail send --body-html.ET, CT, MT, PT) instead of IANA timezone IDs.3:00 PM ET / 12:00 PM PT).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:
tentativemaintravel_tobuffer_posttravel_homecalendar_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 | cancelledawaiting-human-approval -> awaiting-counterparty | cancelledawaiting-counterparty -> confirmed | awaiting-human-approval | closed-no-response | cancelledconfirmed -> completed | awaiting-human-approval | cancelledcompleted | cancelled | closed-no-response -> eligible for archive move after retention windowUse this structure for each meeting entry:
markdown
## <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: <none|details>
- thread_context: <subject + ids or none>
- created_at: <ISO 8601 timestamp with offset>
- updated_at: <ISO 8601 timestamp with offset>
### Activity Log
- <timestamp> Entry created.
meeting_id. If missing, create a new entry.updated_at and append a one-line Activity Log entry.calendar_event_ids_active to calendar_event_ids_deleted with timestamp and reason.in-progress.md until retention rules permit archival.Retention is based on updated_at.
Only remove an entry from in-progress.md when BOTH conditions are true:
completed | cancelled | closed-no-responseupdated_at is at least 14 days oldPreferred 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.
USER.md only when the human has not specified values.USER.md defaults).bash
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>
bash
python3 scripts/find-venue.py \
--location "Neighborhood, City" \
--type coffee|lunch|dinner \
--min-rating <optional>
Present a concise options table including:
ET, CT, MT, PT)3:00 PM ET / 12:00 PM PT)Do not contact the counterparty until the human approves.
8 for tentative.bash
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
references/email-templates.md.--body-html when sending email.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.bash
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.
In-person:
bash
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:
bash
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
bash
gog calendar create <calendar_id> \
--summary "Travel: Home -> <Venue>" \
--from "<start minus travel>" \
--to "<start>" \
--event-color 10
bash
gog calendar create <calendar_id> \
--summary "Buffer: Post-meeting" \
--from "<meeting end>" \
--to "<meeting end plus buffer>" \
--event-color 10
bash
gog calendar create <calendar_id> \
--summary "Travel: <Venue> -> Home" \
--from "<buffer end>" \
--to "<buffer end plus travel>" \
--event-color 10
confirmed.calendar_event_ids_deleted.in-progress.md.cancelled with reason and timestamp.in-progress.md until 14-day retention threshold is met, then archive it.For in-person or high-stakes meetings:
-05:00, -08:00, etc.).ET/ CT/ MT/ PT labels in outbound email copy.Use references/email-templates.md for:
Before finishing any scheduling task, verify:
in-progress.md