← All Skills

snappy-scheduling

v1.0.0
7 files, 46.2 KB ~2,742 words · 11 min read Updated 2026-09-09

snappy-scheduling skill

40 of 45 checks pass
What it can do
availableread
propose days? duration?draft
What does not pass yet
reached bysnappy-calendar
Architecture 4 endpoints
🔑 Bearer token auth
GETDELETE
api.cal.com4 endpoints
DELETE/v1/bookings/BOOKING_ID
GET/v1/bookings
GET/v1/bookings/BOOKING_ID
GET/v1/event-types
$ npx snappy-skills install snappy-scheduling
zip ↓
Documents
AGENTS.md

snappy-scheduling -- loader#

You are booking a meeting. This skill handles the negotiation (propose, confirm, invite). The final event creation goes through snappy-calendar.

Auth#

bashSNAPPY_SETTINGS_QUIET=1 source ~/.claude/skills/snappy-settings/scripts/load-env.sh

Exports XANO_TOKEN and XANO base URL. Never hardcode credentials.

Robert's scheduling rules#

Rule Detail
Preferred windows 11 AM - 1 PM, 3 PM - 5 PM ET
Hard boundary 9 AM - 6 PM ET only
Protected 9-11 AM ET (deep work, never schedule)
Buffer 15 min between back-to-back
Friday afternoon Keep clear
Default duration 30 min standard, 45 min sales, 60 min strategy

The workflow (always in this order)#

  1. Check availability -- GET $XANO/api:PB9UH7b9/calendar/availability + GET $XANO/api:PB9UH7b9/calendar/events?days=7
  2. Look up attendee -- GET $XANO/api:PB9UH7b9/contacts?tag=... (get preferred_channel, timezone)
  3. Propose 2-3 slots -- Send via attendee's preferred channel (email, Slack, WhatsApp, iMessage)
  4. Wait for confirmation -- Do NOT create the event until confirmed
  5. Create event -- POST $XANO/api:PB9UH7b9/calendar/create with summary, start_time, end_time, attendees[]
  6. Log interaction -- Update contact's last_contact in snappy-knowledge

Detailed workflows#

Cal.com API key is loaded by load-env.sh from .env.cache if CALCOM_API_KEY is present.

See references.md#scheduling-links-calcom.

Rules#

  • Do NOT propose times without checking calendar availability first
  • Do NOT create a calendar event before the attendee confirms
  • Do NOT use "EST"/"EDT" -- use "ET" (covers both)
  • Do NOT cancel a meeting without notifying the attendee first via their preferred channel
  • Do NOT confuse this skill with content scheduling -- content goes through snappy-post
  • Do NOT hardcode credentials -- always pull from snappy-settings/.env.cache via env("KEY")

API module#

typescriptimport { listEvents, createEvent, checkAvailability, proposeSlots } from "../snappy-scheduling/api.ts";
import { listContacts } from "../snappy-scheduling/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-scheduling/api.ts available
npx tsx ~/.claude/skills/snappy-scheduling/api.ts propose 3 30

API functions#

Function Purpose
listEvents(days?) List calendar events (re-export from snappy-calendar)
createEvent(...) Create a calendar event (re-export from snappy-calendar)
checkAvailability(days?) Check free/busy status (re-export from snappy-calendar)
proposeSlots(days?, durationMinutes?) Find available slots respecting Robert's scheduling preferences
listContacts(...) Look up contacts (re-export from snappy-knowledge)

Used by#

  • snappy-calendar

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
available read npx tsx ~/.claude/skills/snappy-scheduling/api.ts available
propose days?, duration? draft npx tsx ~/.claude/skills/snappy-scheduling/api.ts propose

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->


Self-correcting loader (PID feedback)#

If this AGENTS.md does not cover the case you are working on and you had to read other files to find the answer, you have two jobs before you finish:

1. Fix it now (P -- proportional correction). If the missing information fits in 1-5 lines, edit this AGENTS.md directly -- add the line, the table row, the one-liner, whatever you had to go find. Keep edits surgical. Do not restructure sections or rewrite paragraphs. The goal is: the next agent that hits this case won't have to leave the loader.

2. Log it always. Whether or not you fixed it, append one line to the feedback log:

bashecho "[$(date -u +%FT%TZ)] <skill-name>: <what was missing> [FIXED|LOGGED]" >> ~/.claude/logs/agents-md-feedback.log

Tag FIXED if you patched the loader in step 1. Tag LOGGED if the gap was too large to patch inline (needs a section rewrite, new workflow, etc.) -- those get picked up by drain-skill-regen.sh for a full regen pass (I -- integral correction).

Do not skip this. A missing report means the same gap will happen next time. A missing fix means you chose to let the next agent stumble on the same thing you just solved.

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

<!-- SKILL-INDEX-START -->

[snappy-scheduling Index]|root: ~/.claude/skills/snappy-scheduling|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,references.md,workflows.md}

<!-- SKILL-INDEX-END -->

---
name: snappy-scheduling
role: Meeting scheduling. Proposes times, sends invites, resolves conflicts, books calls.
loaded-by: PreToolUse hook (auto-injected when "snappy-scheduling" is mentioned)
---

# snappy-scheduling -- loader

You are booking a meeting. This skill handles the negotiation (propose, confirm, invite). The final event creation goes through `snappy-calendar`.

## Auth

```bash
SNAPPY_SETTINGS_QUIET=1 source ~/.claude/skills/snappy-settings/scripts/load-env.sh
```

Exports `XANO_TOKEN` and `XANO` base URL. Never hardcode credentials.

## Robert's scheduling rules

| Rule | Detail |
|------|--------|
| Preferred windows | 11 AM - 1 PM, 3 PM - 5 PM ET |
| Hard boundary | 9 AM - 6 PM ET only |
| Protected | 9-11 AM ET (deep work, never schedule) |
| Buffer | 15 min between back-to-back |
| Friday afternoon | Keep clear |
| Default duration | 30 min standard, 45 min sales, 60 min strategy |

## The workflow (always in this order)

1. **Check availability** -- `GET $XANO/api:PB9UH7b9/calendar/availability` + `GET $XANO/api:PB9UH7b9/calendar/events?days=7`
2. **Look up attendee** -- `GET $XANO/api:PB9UH7b9/contacts?tag=...` (get preferred_channel, timezone)
3. **Propose 2-3 slots** -- Send via attendee's preferred channel (email, Slack, WhatsApp, iMessage)
4. **Wait for confirmation** -- Do NOT create the event until confirmed
5. **Create event** -- `POST $XANO/api:PB9UH7b9/calendar/create` with summary, start_time, end_time, attendees[]
6. **Log interaction** -- Update contact's last_contact in snappy-knowledge

## Detailed workflows

- Single attendee: [workflows.md#workflow-1](workflows.md#workflow-1-single-attendee-booking)
- Multi-attendee: [workflows.md#workflow-2](workflows.md#workflow-2-multi-attendee-coordination)
- Reschedule: [workflows.md#workflow-3](workflows.md#workflow-3-reschedule)
- Cancel: [workflows.md#workflow-4](workflows.md#workflow-4-cancel)

## Scheduling link (Cal.com fallback)

Cal.com API key is loaded by `load-env.sh` from `.env.cache` if `CALCOM_API_KEY` is present.

See [references.md#scheduling-links-calcom](references.md#scheduling-links-calcom).

## Rules

- Do NOT propose times without checking calendar availability first
- Do NOT create a calendar event before the attendee confirms
- Do NOT use "EST"/"EDT" -- use "ET" (covers both)
- Do NOT cancel a meeting without notifying the attendee first via their preferred channel
- Do NOT confuse this skill with content scheduling -- content goes through `snappy-post`
- Do NOT hardcode credentials -- always pull from `snappy-settings/.env.cache` via `env("KEY")`

## API module

```typescript
import { listEvents, createEvent, checkAvailability, proposeSlots } from "../snappy-scheduling/api.ts";
import { listContacts } from "../snappy-scheduling/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-scheduling/api.ts available
npx tsx ~/.claude/skills/snappy-scheduling/api.ts propose 3 30
```

## API functions

| Function | Purpose |
|----------|---------|
| `listEvents(days?)` | List calendar events (re-export from snappy-calendar) |
| `createEvent(...)` | Create a calendar event (re-export from snappy-calendar) |
| `checkAvailability(days?)` | Check free/busy status (re-export from snappy-calendar) |
| `proposeSlots(days?, durationMinutes?)` | Find available slots respecting Robert's scheduling preferences |
| `listContacts(...)` | Look up contacts (re-export from snappy-knowledge) |

## Used by

- `snappy-calendar`

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `available` | — | `read` | `npx tsx ~/.claude/skills/snappy-scheduling/api.ts available` |
| `propose` | `days?`, `duration?` | `draft` | `npx tsx ~/.claude/skills/snappy-scheduling/api.ts propose` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

---

## Self-correcting loader (PID feedback)

If this AGENTS.md does not cover the case you are working on and you had to read other files to find the answer, you have two jobs before you finish:

**1. Fix it now (P -- proportional correction).** If the missing information fits in 1-5 lines, edit this AGENTS.md directly -- add the line, the table row, the one-liner, whatever you had to go find. Keep edits surgical. Do not restructure sections or rewrite paragraphs. The goal is: the next agent that hits this case won't have to leave the loader.

**2. Log it always.** Whether or not you fixed it, append one line to the feedback log:

```bash
echo "[$(date -u +%FT%TZ)] <skill-name>: <what was missing> [FIXED|LOGGED]" >> ~/.claude/logs/agents-md-feedback.log
```

Tag `FIXED` if you patched the loader in step 1. Tag `LOGGED` if the gap was too large to patch inline (needs a section rewrite, new workflow, etc.) -- those get picked up by `drain-skill-regen.sh` for a full regen pass (I -- integral correction).

**Do not skip this.** A missing report means the same gap will happen next time. A missing fix means you chose to let the next agent stumble on the same thing you just solved.


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-scheduling Index]|root: ~/.claude/skills/snappy-scheduling|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,references.md,workflows.md}
<!-- SKILL-INDEX-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?