From asi
Transforms Google Calendar events into GF(3)-typed interactions, routes to triadic queues, detects saturation for balanced scheduling states. Useful for ANIMA-framework scheduling.
npx claudepluginhub plurigrid/asi --plugin asiThis skill uses the workspace's default tool permissions.
Transform Google Calendar into an ANIMA-condensed system with GF(3) conservation.
Unifies Google Workspace management (Gmail, Drive, Calendar, Tasks, Docs) via ACSet schema and GF(3)-typed interactions. For multi-service automation workflows.
Manages calendars and scheduling: create events, schedule meetings, set reminders, view availability, recurring events, and sync securely with Google, Apple, and Outlook providers.
Manages calendars: create events, schedule meetings, view availability, set reminders, recurring events, and sync with Google, Apple, Outlook providers. Useful for scheduling in conversations.
Share bugs, ideas, or general feedback.
Transform Google Calendar into an ANIMA-condensed system with GF(3) conservation.
Trit: +1 (PLUS - generator/executor)
Principle: Balanced Calendar = Condensed Equilibrium State
Implementation: CalendarACSet + TriadicQueues + SaturationDetector
Calendar ACSet applies the ANIMA framework to scheduling:
┌────────────────────────────────────────────────────────────────────┐
│ CalendarACSet Schema │
├────────────────────────────────────────────────────────────────────┤
│ │
│ Interaction ─────┬────▶ Event │
│ ├─ verb: String │ ├─ event_id: String │
│ ├─ timebin: Int │ ├─ summary: String │
│ ├─ trit: Trit │ ├─ start_time: DateTime │
│ └─ calendar ─────┼──▶ ├─ end_time: DateTime │
│ │ ├─ has_conflicts: Bool │
│ QueueItem ───────┼──▶ └─ saturated: Bool │
│ ├─ interaction ──┘ │
│ └─ agent ───────────▶ Agent3 │
│ ├─ fiber: Trit {-1, 0, +1} │
│ Attendee ◀────────────┤ │
│ ├─ email: String └─ name: String │
│ ├─ response: Enum │
│ └─ event ─────────▶ Event │
│ │
│ Reminder ─────────▶ Event │
│ ├─ method: Enum │
│ └─ minutes: Int │
└────────────────────────────────────────────────────────────────────┘
| Object | Description | Trit Role |
|---|---|---|
Event | Calendar event with time bounds | Data |
Calendar | Container calendar (primary/secondary) | Aggregate |
Attendee | Event participant with response status | Edge |
Reminder | Notification configuration | Node |
Agent3 | Queue fiber (MINUS/ERGODIC/PLUS) | Router |
QueueItem | Links Interaction → Agent3 | Edge |
Calendar actions are assigned trits based on information flow:
VERB_TRIT_MAP = {
# MINUS (-1): Consumption/Query
"get_events": -1, "list_calendars": -1,
"get_event": -1, "check_availability": -1,
# ERGODIC (0): Coordination/Modification
"modify_event": 0, "update_attendees": 0,
"reschedule": 0, "change_reminder": 0,
"update_location": 0,
# PLUS (+1): Generation/Creation
"create_event": +1, "add_google_meet": +1,
"invite_attendee": +1, "schedule_recurring": +1,
"delete_event": +1, # Deletion generates state change
}
| Tool | Trit | Description |
|---|---|---|
get_events | -1 | Query calendar events (MINUS) |
list_calendars | -1 | List available calendars (MINUS) |
modify_event | 0 | Update event details (ERGODIC) |
create_event | +1 | Create new event (PLUS) |
delete_event | +1 | Remove event (PLUS) |
Calendar events link to Gmail threads via meeting invites:
def event_thread_morphism(event: Event, thread: Thread) -> Morphism:
"""Morphism from CalendarACSet → GmailACSet"""
return {
'source': ('Event', event.event_id),
'target': ('Thread', thread.thread_id),
'relation': 'invite_thread',
'trit_effect': 0, # ERGODIC - coordination
}
# Example: Meeting invite creates Gmail thread
event = create_event(summary="Standup", attendees=["team@example.com"])
thread = search_gmail(f"subject:'{event.summary}' from:calendar-notification")
link_event_thread(event, thread)
┌─────────────────────────────────────────┐
│ TRIADIC QUEUES │
├─────────────────────────────────────────┤
│ │
Interaction ────▶│ route(trit) ───▶ Agent3 Fiber │
│ │
│ MINUS (-1) ────▶ [get_events, ...] │
│ ERGODIC (0) ────▶ [modify_event, ...] │
│ PLUS (+1) ────▶ [create_event, ...] │
│ │
└─────────────────────────────────────────┘
Calendar saturation = no conflicts, all events responded, balanced time:
def is_calendar_saturated(calendar_id: str) -> bool:
"""Calendar is saturated when:
1. No conflicting events in range
2. All attendee responses received
3. GF(3) cycle closure: sum(trits) ≡ 0 (mod 3)
4. Time blocks balanced (no overload)
"""
events = get_events(calendar_id)
conflicts = detect_conflicts(events)
pending_responses = [e for e in events if has_pending_rsvp(e)]
gf3_sum = sum(event.trit_history) % 3
return (
len(conflicts) == 0 and
len(pending_responses) == 0 and
gf3_sum == 0
)
def detect_anima() -> Dict:
"""System at ANIMA when all calendars saturated."""
return {
"at_anima": all(is_calendar_saturated(c) for c in calendars),
"condensed_fingerprint": sha256(sorted_event_hashes),
"conflict_free": True,
}
| File | Description | Trit |
|---|---|---|
| calendar_acset.py | ACSet schema + GF(3) event tracking | +1 |
| calendar_saturation.py | Conflict detection + saturation | +1 |
| calendar_mcp_bridge.py | MCP tool wiring with guards | 0 |
from calendar_mcp_bridge import create_calendar_bridge
bridge = create_calendar_bridge("user@gmail.com")
# MINUS: Check availability first
bridge.get_events(time_min="2025-01-01", time_max="2025-01-07") # trit=-1
# PLUS: Create meeting
bridge.create_event(
summary="Project Sync",
start_time="2025-01-06T10:00:00",
end_time="2025-01-06T11:00:00",
attendees=["team@example.com"],
add_google_meet=True
) # trit=+1
# Conservation: -1 + 1 = 0 ✓
# MINUS: Read event details
bridge.get_events(event_id=event_id) # trit=-1
# ERGODIC: Modify response
bridge.modify_event(
event_id=event_id,
attendees=[{"email": "me@example.com", "responseStatus": "accepted"}]
) # trit=0
# PLUS: Add reminder
bridge.modify_event(
event_id=event_id,
reminders=[{"method": "popup", "minutes": 15}]
) # Would need balancing
# Balance with read
bridge.get_events(event_id=event_id) # -1 + 0 + 1 - 1 = -1... add +1
detector = CalendarSaturationDetector()
# Review week
events = bridge.get_events(time_min="2025-01-06", time_max="2025-01-13")
for event in events:
detector.update_event(event.event_id, trit=Trit.MINUS)
if has_conflicts(event):
bridge.modify_event(event.event_id, reschedule=True)
detector.update_event(event.event_id, trit=Trit.ERGODIC)
# Check saturation
if detector.is_saturated():
say("Calendar at equilibrium. No conflicts detected.")
| Skill | Trit | Integration |
|---|---|---|
| gmail-anima | 0 | Event↔Thread morphisms |
| google-workspace | 0 | MCP tool provider |
| gay-mcp | +1 | SplitMixTernary RNG |
| tasks-acset | -1 | Event→Task deadline links |
calendar-acset (+1) ⊗ gmail-anima (0) ⊗ tasks-acset (-1) = 0 ✓
get_events (-1) ⊗ modify_event (0) ⊗ create_event (+1) = 0 ✓
Skill Name: calendar-acset
Type: Calendar Management / ANIMA Framework
Trit: +1 (PLUS - generator/executor)
GF(3): Conserved via triadic queue routing
ANIMA: Balanced Calendar = Condensed Equilibrium State
This skill connects to the K-Dense-AI/claude-scientific-skills ecosystem:
general: 734 citations in bib.duckdbThis skill maps to Cat# = Comod(P) as a bicomodule in the equipment structure:
Trit: 0 (ERGODIC)
Home: Prof
Poly Op: ⊗
Kan Role: Adj
Color: #26D826
The skill participates in triads satisfying:
(-1) + (0) + (+1) ≡ 0 (mod 3)
This ensures compositional coherence in the Cat# equipment structure.