home / skills / plurigrid / asi / workspace-unified

workspace-unified skill

/skills/workspace-unified

This skill integrates Google Workspace actions into an ACSet-structured workflow, preserving trit balance across Gmail, Drive, Calendar, Tasks, Docs for

npx playbooks add skill plurigrid/asi --skill workspace-unified

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
29.8 KB
---
name: workspace-unified
description: Unified Google Workspace management via WorkspaceACSet. Transforms operations into GF(3)-typed Interactions across Gmail, Drive, Calendar, Tasks, Docs with cross-skill morphisms and MCP↔API equivalence. Use for multi-service workflows or applying ACSet principles to workspace automation.
---

# Workspace Unified Skill

Transform Google Workspace into an ACSet-structured system with GF(3) conservation and cross-skill morphisms.

**Trit**: 0 (ERGODIC - coordinator)  
**Principle**: Workflow Completion = Condensed Equilibrium State  
**Implementation**: WorkspaceACSet + PathInvariance + MCPAPIBridge

## Overview

Workspace Unified applies categorical database principles to workspace:

1. **Transform** - Operations → GF(3)-typed Interactions
2. **Route** - Interactions → Service-specific ACSet objects
3. **Compose** - Cross-skill morphisms with path commutativity
4. **Verify** - MCP↔API equivalence and Narya proofs

## WorkspaceACSet Schema

```
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                              WorkspaceACSet Schema                                       │
├─────────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                          │
│  Interaction ───────────┬──────▶ Thread ◀───────────────── DriveFile                    │
│  ├─ verb: String        │        ├─ thread_id: String       ├─ file_id: String          │
│  ├─ timebin: Int        │        ├─ needs_action: Bool      ├─ mime_type: String        │
│  ├─ trit: Trit          │        ├─ last_action_bin: Int    └─ saturated: Bool          │
│  ├─ service: Service    │        └─ saturated: Bool                                      │
│  └─ person ─────────────┼──▶                                                             │
│                         │                                                                │
│  CalendarEvent ◀────────┼──────── TaskList ◀────────────── Task                         │
│  ├─ event_id: String    │         ├─ list_id: String        ├─ task_id: String          │
│  ├─ summary: String     │         └─ title: String          ├─ title: String            │
│  ├─ start: DateTime     │                                   ├─ status: String           │
│  └─ saturated: Bool     │                                   └─ due: DateTime            │
│                         │                                                                │
│  Document ◀─────────────┼──────── Sheet                                                  │
│  ├─ doc_id: String      │         ├─ sheet_id: String                                   │
│  ├─ title: String       │         ├─ title: String                                      │
│  └─ content: Text       │         └─ values: Matrix                                     │
│                         │                                                                │
│  QueueItem ─────────────┼──────▶ Agent3                                                  │
│  ├─ interaction ────────┘        ├─ fiber: Trit {-1, 0, +1}                              │
│  └─ agent ───────────────▶       └─ name: String                                         │
│                                                                                          │
│  Person ◀─────────────────────── Partner ─────────────────▶ Person                       │
│  ├─ email: String                ├─ src                                                  │
│  └─ name: String                 ├─ tgt                                                  │
│                                  └─ weight: Int                                          │
│                                                                                          │
│  Service                                                                                 │
│  ├─ name: String {gmail, drive, calendar, tasks, docs, sheets}                          │
│  └─ default_trit: Trit                                                                   │
└─────────────────────────────────────────────────────────────────────────────────────────┘
```

### Objects

| Object | Description | Trit Role |
|--------|-------------|-----------|
| `Interaction` | Single workspace action with verb + trit + service | Data |
| `Thread` | Gmail conversation with saturation state | Gmail Aggregate |
| `DriveFile` | File or folder in Drive | Drive Aggregate |
| `CalendarEvent` | Meeting or event | Calendar Aggregate |
| `TaskList` | Container for tasks | Tasks Container |
| `Task` | Individual action item | Tasks Aggregate |
| `Document` | Google Doc content | Docs Aggregate |
| `Sheet` | Spreadsheet data | Sheets Aggregate |
| `Agent3` | Queue fiber (MINUS/ERGODIC/PLUS) | Router |
| `QueueItem` | Links Interaction → Agent3 | Edge |
| `Person` | User or contact | Node |
| `Partner` | Relationship edge in contact graph | Edge |
| `Service` | Workspace service identifier | Metadata |

## GF(3) Service Typing

Workspace actions are assigned trits based on information flow:

```python
VERB_TRIT_MAP = {
    # ═══════════════════════════════════════════════════════════════
    # GMAIL
    # ═══════════════════════════════════════════════════════════════
    # MINUS (-1): Consumption/Validation
    "gmail_read": -1,     "gmail_search": -1,    "gmail_get_thread": -1,
    "gmail_list_labels": -1,
    
    # ERGODIC (0): Coordination/Metadata
    "gmail_label": 0,     "gmail_archive": 0,    "gmail_snooze": 0,
    "gmail_star": 0,      "gmail_mark_read": 0,  "gmail_move": 0,
    
    # PLUS (+1): Generation/Execution
    "gmail_send": +1,     "gmail_forward": +1,   "gmail_reply": +1,
    "gmail_draft": +1,    "gmail_compose": +1,
    
    # ═══════════════════════════════════════════════════════════════
    # DRIVE
    # ═══════════════════════════════════════════════════════════════
    # MINUS (-1)
    "drive_get_content": -1, "drive_list": -1,   "drive_search": -1,
    "drive_get_permissions": -1,
    
    # ERGODIC (0)
    "drive_share": 0,     "drive_move": 0,       "drive_rename": 0,
    "drive_update_metadata": 0,
    
    # PLUS (+1)
    "drive_create": +1,   "drive_upload": +1,    "drive_copy": +1,
    
    # ═══════════════════════════════════════════════════════════════
    # CALENDAR
    # ═══════════════════════════════════════════════════════════════
    # MINUS (-1)
    "calendar_get_events": -1, "calendar_list": -1, "calendar_get_event": -1,
    
    # ERGODIC (0)
    "calendar_modify": 0, "calendar_reschedule": 0, "calendar_update_attendees": 0,
    
    # PLUS (+1)
    "calendar_create": +1, "calendar_invite": +1, "calendar_duplicate": +1,
    
    # ═══════════════════════════════════════════════════════════════
    # TASKS
    # ═══════════════════════════════════════════════════════════════
    # MINUS (-1)
    "tasks_list": -1,     "tasks_get": -1,       "tasks_list_lists": -1,
    
    # ERGODIC (0)
    "tasks_update": 0,    "tasks_move": 0,       "tasks_complete": 0,
    
    # PLUS (+1)
    "tasks_create": +1,   "tasks_create_list": +1,
    
    # ═══════════════════════════════════════════════════════════════
    # DOCS
    # ═══════════════════════════════════════════════════════════════
    # MINUS (-1)
    "docs_get_content": -1, "docs_read_comments": -1, "docs_inspect": -1,
    
    # ERGODIC (0)
    "docs_find_replace": 0, "docs_update_headers": 0, "docs_format": 0,
    
    # PLUS (+1)
    "docs_create": +1,    "docs_insert_text": +1, "docs_create_table": +1,
    
    # ═══════════════════════════════════════════════════════════════
    # SHEETS
    # ═══════════════════════════════════════════════════════════════
    # MINUS (-1)
    "sheets_read": -1,    "sheets_get_info": -1,
    
    # ERGODIC (0)
    "sheets_clear": 0,
    
    # PLUS (+1)
    "sheets_write": +1,   "sheets_create": +1,   "sheets_create_sheet": +1,
}
```

### MCP Tool → Trit Mapping

| Tool | Trit | Service | Description |
|------|------|---------|-------------|
| `search_gmail_messages` | -1 | Gmail | Search inbox (MINUS) |
| `get_gmail_message_content` | -1 | Gmail | Read message (MINUS) |
| `get_gmail_thread_content` | -1 | Gmail | Read thread (MINUS) |
| `list_gmail_labels` | -1 | Gmail | List labels (MINUS) |
| `modify_gmail_message_labels` | 0 | Gmail | Change labels (ERGODIC) |
| `batch_modify_gmail_message_labels` | 0 | Gmail | Bulk labels (ERGODIC) |
| `send_gmail_message` | +1 | Gmail | Send email (PLUS) |
| `draft_gmail_message` | +1 | Gmail | Create draft (PLUS) |
| `list_drive_items` | -1 | Drive | List files (MINUS) |
| `get_drive_file_content` | -1 | Drive | Read file (MINUS) |
| `search_drive_files` | -1 | Drive | Search files (MINUS) |
| `share_drive_file` | 0 | Drive | Share file (ERGODIC) |
| `update_drive_file` | 0 | Drive | Update metadata (ERGODIC) |
| `create_drive_file` | +1 | Drive | Create file (PLUS) |
| `get_events` | -1 | Calendar | Get events (MINUS) |
| `modify_event` | 0 | Calendar | Modify event (ERGODIC) |
| `create_event` | +1 | Calendar | Create event (PLUS) |
| `list_tasks` | -1 | Tasks | List tasks (MINUS) |
| `get_task` | -1 | Tasks | Get task (MINUS) |
| `update_task` | 0 | Tasks | Update task (ERGODIC) |
| `create_task` | +1 | Tasks | Create task (PLUS) |
| `get_doc_content` | -1 | Docs | Read doc (MINUS) |
| `create_doc` | +1 | Docs | Create doc (PLUS) |
| `read_sheet_values` | -1 | Sheets | Read sheet (MINUS) |
| `modify_sheet_values` | +1 | Sheets | Write sheet (PLUS) |

## Cross-Skill Morphisms

```
┌──────────────────────────────────────────────────────────────────────────────┐
│                        CROSS-SKILL MORPHISM DIAGRAM                          │
├──────────────────────────────────────────────────────────────────────────────┤
│                                                                              │
│                            thread_file                                       │
│            Thread ─────────────────────────────▶ DriveFile                   │
│              │                                       │                       │
│              │ thread_event                          │ file_event            │
│              ▼                                       ▼                       │
│        CalendarEvent ◀───── event_file ─────── DriveFile                     │
│              │                                       │                       │
│              │ event_task                            │ file_task             │
│              ▼                                       ▼                       │
│            Task ◀──────────────────────────────── Task                       │
│              │                                       │                       │
│              │ task_doc                              │ file_doc              │
│              ▼                                       ▼                       │
│          Document ◀───────────────────────────── Document                    │
│              │                                                               │
│              │ doc_sheet                                                     │
│              ▼                                                               │
│           Sheet                                                              │
│                                                                              │
│   GF(3) Conservation: All morphism paths preserve trit balance               │
└──────────────────────────────────────────────────────────────────────────────┘
```

### Morphism Table

| Morphism | Source | Target | Trigger | GF(3) Effect |
|----------|--------|--------|---------|--------------|
| `thread_file` | Thread | DriveFile | Attachment detected | 0 (ERGODIC) |
| `thread_event` | Thread | CalendarEvent | Meeting scheduled | +1 (PLUS) |
| `thread_task` | Thread | Task | Action item identified | +1 (PLUS) |
| `file_event` | DriveFile | CalendarEvent | File-linked meeting | +1 (PLUS) |
| `file_task` | DriveFile | Task | File review needed | +1 (PLUS) |
| `file_doc` | DriveFile | Document | Content extraction | 0 (ERGODIC) |
| `event_task` | CalendarEvent | Task | Event followup | +1 (PLUS) |
| `event_doc` | CalendarEvent | Document | Meeting notes | +1 (PLUS) |
| `task_doc` | Task | Document | Task documentation | +1 (PLUS) |
| `doc_sheet` | Document | Sheet | Data extraction | 0 (ERGODIC) |

### Path Commutativity

```
                     thread_task
Gmail.Thread ─────────────────────────────────▶ Tasks.Task
     │                                              │
     │ thread_event                                 │ (identity)
     ▼                                              ▼
Calendar.Event ────────────────────────────────▶ Tasks.Task
                      event_task

INVARIANT: thread_task == event_task ∘ thread_event
```

```
                      thread_file
Gmail.Thread ─────────────────────────────────▶ Drive.File
     │                                              │
     │ thread_event                                 │ file_event
     ▼                                              ▼
Calendar.Event ◀─────── event_file ─────────── Calendar.Event

INVARIANT: thread_event == event_file⁻¹ ∘ file_event ∘ thread_file
```

## Saturation Detection → ANIMA State

```python
def is_workspace_saturated() -> bool:
    """Workspace is saturated when:
    1. All services reach their saturation threshold
    2. GF(3) global conservation: sum(trits) ≡ 0 (mod 3)
    3. All cross-skill morphism paths commute
    4. No pending interactions in any queue
    """
    service_states = {
        'gmail': gmail_saturated(),
        'drive': drive_saturated(),
        'calendar': calendar_saturated(),
        'tasks': tasks_saturated(),
        'docs': docs_saturated(),
        'sheets': sheets_saturated(),
    }
    
    global_trit_sum = sum(
        interaction.trit 
        for service in services 
        for interaction in service.interactions
    )
    
    return (
        all(service_states.values()) and           # All saturated
        (global_trit_sum % 3) == 0 and             # GF(3) conserved
        verify_path_commutativity() and            # Morphisms commute
        all_queues_empty()                         # No pending work
    )

def detect_anima() -> Dict:
    """System at ANIMA when workspace is condensed."""
    return {
        "at_anima": is_workspace_saturated(),
        "condensed_fingerprint": sha256(workspace_state_hash()),
        "service_states": get_all_service_states(),
        "gf3_balance": compute_global_gf3_balance(),
        "pending_interactions": count_pending_interactions(),
    }
```

### Per-Service Saturation Thresholds

```python
SATURATION_THRESHOLDS = {
    'gmail_threads': 1000,
    'drive_files': 500,
    'calendar_events': 200,
    'tasks': 300,
    'docs': 100,
    'sheets': 50,
}

def service_saturated(service: str) -> bool:
    count = get_service_object_count(service)
    threshold = SATURATION_THRESHOLDS.get(service, 100)
    return count >= threshold
```

## Narya Proof Integration

Proofs in [`src/narya_proofs/`](file:///Users/alice/agent-o-rama/agent-o-rama/src/narya_proofs/):

### 1. Path Commutativity ([path_commutativity.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/narya_proofs/path_commutativity.py))

```python
def prove_path_commutativity(workspace: WorkspaceACSet) -> bool:
    """Verify all morphism paths commute."""
    # thread_task == event_task ∘ thread_event
    for thread in workspace.threads:
        direct = workspace.thread_task(thread)
        composed = workspace.event_task(workspace.thread_event(thread))
        if direct != composed:
            return False
    return True
```

### 2. GF(3) Global Conservation ([gf3_global.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/narya_proofs/gf3_global.py))

```python
def prove_gf3_global_conservation(workspace: WorkspaceACSet) -> bool:
    """All cross-service workflows satisfy sum ≡ 0 (mod 3)."""
    for workflow in workspace.workflows:
        trit_sum = sum(op.trit for op in workflow.operations)
        if trit_sum % 3 != 0:
            return False
    return True
```

### 3. MCP↔API Equivalence ([mcp_api_equiv.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/narya_proofs/mcp_api_equiv.py))

```python
def prove_mcp_api_equivalence(bridge: WorkspaceBridge) -> bool:
    """MCP and API executions produce identical states."""
    for operation in bridge.supported_operations:
        mcp_state = bridge.execute_mcp(operation, test_params)
        api_state = bridge.execute_api(operation, test_params)
        if normalize(mcp_state) != normalize(api_state):
            return False
    return True
```

### 4. Cross-Service Integrity ([cross_service.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/narya_proofs/cross_service.py))

```python
def prove_cross_service_integrity(workspace: WorkspaceACSet) -> bool:
    """Thread IDs, file IDs consistent across all services."""
    for morphism in workspace.morphisms:
        source_id = morphism.source.id
        target_id = morphism.target.id
        if not workspace.verify_id_consistency(source_id, target_id):
            return False
    return True
```

## Source Files

| File | Description | Trit |
|------|-------------|------|
| [workspace_acset.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/workspace_acset.py) | ACSet schema + cross-skill morphisms | 0 |
| [workspace_detector.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/workspace_detector.py) | Saturation + equilibrium detection | 0 |
| [workspace_bridge.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/workspace_bridge.py) | MCP tool wiring with guards | 0 |
| [triadic_queues.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/triadic_queues.py) | Three disjoint queue fibers | 0 |
| [path_invariance.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/path_invariance.py) | Morphism commutativity checks | -1 |
| [mcp_api_equivalence.py](file:///Users/alice/agent-o-rama/agent-o-rama/src/mcp_api_equivalence.py) | Equivalence verification | -1 |
| [narya_proofs/](file:///Users/alice/agent-o-rama/agent-o-rama/src/narya_proofs/) | Formal verification proofs | -1 |

## Workflows

### Workflow 1: Email-to-Task with Full Morphism Chain

```python
from workspace_bridge import create_workspace_bridge
from workspace_detector import WorkspaceDetector

# Create bridge
bridge = create_workspace_bridge("[email protected]")
detector = WorkspaceDetector()

# MINUS: Search for actionable emails
results = bridge.search_gmail_messages("is:unread label:action-required")
for msg in results:
    thread = bridge.get_gmail_thread_content(msg.thread_id)
    detector.update_service('gmail', trit=Trit.MINUS)
    
    # PLUS: Create task via thread_task morphism
    task = bridge.create_task(
        title=f"Follow up: {thread.subject}",
        notes=thread.snippet,
        task_list_id=default_list_id
    )
    detector.update_service('tasks', trit=Trit.PLUS)
    
    # ERGODIC: Label as processed
    bridge.modify_gmail_message_labels(
        msg.id,
        add_label_ids=["Label_Processed"],
        remove_label_ids=["INBOX"]
    )
    detector.update_service('gmail', trit=Trit.ERGODIC)

# GF(3) check: -1 + 1 + 0 = 0 ✓
```

### Workflow 2: Meeting Notes with Cross-Service Morphisms

```python
# MINUS: Get calendar events
events = bridge.get_events(time_min=today, time_max=tomorrow)
detector.update_service('calendar', trit=Trit.MINUS)

for event in events:
    # PLUS: Create meeting notes doc via event_doc morphism
    doc = bridge.create_doc(
        title=f"Notes: {event.summary}",
        content=generate_template(event)
    )
    detector.update_service('docs', trit=Trit.PLUS)
    
    # ERGODIC: Update event with doc link
    bridge.modify_event(
        event_id=event.id,
        description=f"{event.description}\n\nNotes: {doc.url}"
    )
    detector.update_service('calendar', trit=Trit.ERGODIC)

# GF(3) check: -1 + 1 + 0 = 0 ✓
```

### Workflow 3: File Review with Task Creation

```python
# MINUS: Search for files needing review
files = bridge.search_drive_files("modifiedTime > '2024-01-01' and mimeType = 'application/pdf'")
detector.update_service('drive', trit=Trit.MINUS)

for file in files:
    # MINUS: Get file content
    content = bridge.get_drive_file_content(file.id)
    detector.update_service('drive', trit=Trit.MINUS)
    
    # PLUS: Create review task via file_task morphism
    task = bridge.create_task(
        title=f"Review: {file.name}",
        notes=f"File: {file.webViewLink}"
    )
    detector.update_service('tasks', trit=Trit.PLUS)
    
    # PLUS: Share file with reviewer
    bridge.share_drive_file(file.id, share_with="[email protected]")
    detector.update_service('drive', trit=Trit.ERGODIC)

# Auto-balance if needed
if detector.gf3_residue() != 0:
    bridge.list_tasks(task_list_id=default_list_id)  # MINUS to balance
```

### Workflow 4: Weekly Digest with Condensation Check

```python
# Create digest from all services
digest = WorkspaceDigest()

# MINUS: Gather data
digest.gmail_threads = bridge.search_gmail_messages("newer_than:7d")
digest.drive_files = bridge.search_drive_files("modifiedTime > '2024-01-01'")
digest.events = bridge.get_events(time_min=week_ago, time_max=now)
digest.tasks = bridge.list_tasks(task_list_id=default_list_id)

# PLUS: Create digest doc
doc = bridge.create_doc(
    title=f"Weekly Digest: {week_start} - {week_end}",
    content=render_digest(digest)
)

# ERGODIC: Update shared folder
bridge.update_drive_file(doc.id, add_parents="shared_digests_folder_id")

# Check ANIMA
anima = detector.detect_anima()
if anima["at_anima"]:
    say("Workspace at ANIMA. Condensed state achieved.")
    print(f"Fingerprint: {anima['condensed_fingerprint'][:16]}...")
```

## Commands

```bash
# Run workspace ACSet demo
python src/workspace_acset.py

# Test cross-skill morphisms
python src/path_invariance.py

# Run MCP↔API equivalence tests
python src/mcp_api_equivalence.py

# Run Narya proofs
python -m src.narya_proofs.runner

# Check workspace saturation
python src/workspace_detector.py
```

## Integration with Other Skills

| Skill | Trit | Integration |
|-------|------|-------------|
| [gmail-anima](file:///Users/alice/agent-o-rama/agent-o-rama/.agents/skills/gmail-anima/SKILL.md) | 0 | Gmail-specific ACSet with thread saturation |
| [google-workspace](file:///Users/alice/.claude/skills/google-workspace/SKILL.md) | 0 | MCP tool provider |
| [gay-mcp](file:///Users/alice/.agents/skills/gay-mcp/SKILL.md) | +1 | SplitMixTernary RNG for deterministic colors |
| [sheaf-cohomology](file:///Users/alice/.claude/skills/sheaf-cohomology/SKILL.md) | -1 | H¹ obstruction verification |
| [bisimulation-game](file:///Users/alice/.agents/skills/bisimulation-game/SKILL.md) | -1 | State equivalence proofs |
| [ordered-locale](file:///Users/alice/.agents/skills/ordered-locale-proper/SKILL.md) | 0 | Service ordering topology |
| [acsets-algebraic-databases](file:///Users/alice/.agents/skills/acsets/SKILL.md) | 0 | ACSet foundations |

### GF(3) Triadic Conservation

```
workspace-unified (0) ⊗ gmail-anima (0) ⊗ gay-mcp (+1) ⊗ sheaf-cohomology (-1) = 0 ✓
gmail_read (-1) ⊗ drive_create (+1) ⊗ calendar_modify (0) = 0 ✓
thread_file (0) ⊗ file_event (+1) ⊗ event_task (+1) ⊗ tasks_get (-1) ⊗ docs_get (-1) = 0 ✓
```

## MCP ↔ API Equivalence

| # | Operation | MCP Tool | REST API Equivalent |
|---|-----------|----------|---------------------|
| 1 | Gmail Search | search_gmail_messages | GET /gmail/v1/users/me/messages |
| 2 | Gmail Read | get_gmail_message_content | GET /gmail/v1/users/me/messages/{id} |
| 3 | Gmail Send | send_gmail_message | POST /gmail/v1/users/me/messages/send |
| 4 | Gmail Label | modify_gmail_message_labels | POST /gmail/v1/users/me/messages/modify |
| 5 | Drive List | list_drive_items | GET /drive/v3/files |
| 6 | Drive Get | get_drive_file_content | GET /drive/v3/files/{id}?alt=media |
| 7 | Drive Create | create_drive_file | POST /upload/drive/v3/files |
| 8 | Drive Share | share_drive_file | POST /drive/v3/files/{id}/permissions |
| 9 | Calendar Events | get_events | GET /calendar/v3/calendars/{id}/events |
| 10 | Calendar Create | create_event | POST /calendar/v3/calendars/{id}/events |
| 11 | Tasks List | list_tasks | GET /tasks/v1/lists/{id}/tasks |
| 12 | Tasks Create | create_task | POST /tasks/v1/lists/{id}/tasks |
| 13 | Docs Get | get_doc_content | GET /docs/v1/documents/{id} |
| 14 | Docs Create | create_doc | POST /docs/v1/documents |
| 15 | Sheets Read | read_sheet_values | GET /sheets/v4/spreadsheets/{id}/values |

### Equivalence Verification

```python
@dataclass
class MCPAPIEquivalence:
    operation: str
    mcp_result: WorkspaceState
    api_result: WorkspaceState
    
    def verify(self) -> bool:
        """Verify bitwise equivalence after normalization."""
        mcp_normalized = normalize(self.mcp_result)
        api_normalized = normalize(self.api_result)
        return mcp_normalized == api_normalized
    
    def diff(self) -> Optional[StateDiff]:
        """Return diff if not equivalent."""
        if self.verify():
            return None
        return compute_diff(self.mcp_result, self.api_result)

def verify_all_equivalences(bridge: WorkspaceBridge) -> Dict:
    """Run full equivalence suite."""
    results = {}
    for op in bridge.supported_operations:
        equiv = MCPAPIEquivalence(
            operation=op,
            mcp_result=bridge.execute_mcp(op, test_params[op]),
            api_result=bridge.execute_api(op, test_params[op])
        )
        results[op] = {
            'equivalent': equiv.verify(),
            'diff': equiv.diff()
        }
    return results
```

## Say Narration Integration

```python
from workspace_bridge import NaryaLogger

logger = NaryaLogger(voice="Ava (Premium)")

# Announces: "Workspace bridge: MINUS transition on gmail"
logger.log(before, after, Trit.MINUS, service="gmail", impact=False)

# Announces: "Workspace bridge: PLUS transition on drive, impact detected"
logger.log(before, after, Trit.PLUS, service="drive", impact=True)

# Cross-skill morphism announcement
logger.log_morphism("thread_task", thread, task, Trit.PLUS)
```

---

**Skill Name**: workspace-unified  
**Type**: Workspace Management / ACSet Framework  
**Trit**: 0 (ERGODIC - coordinator)  
**GF(3)**: Conserved via cross-skill morphism routing  
**ANIMA**: Workflow Completion = Condensed Equilibrium State

Overview

This skill provides unified Google Workspace management by modeling Gmail, Drive, Calendar, Tasks, Docs and Sheets as a WorkspaceACSet with GF(3)-typed interactions and cross-skill morphisms. It enforces conservation of information flow via trits (−1, 0, +1), ensures path commutativity across service mappings, and verifies MCP↔API equivalence for reliable automation. Use it to coordinate multi-service workflows and to apply ACSet principles to workspace automation.

How this skill works

Operations are transformed into Interaction objects typed by a trit value: MINUS (consumption), ERGODIC (coordination), or PLUS (generation). Interactions route to service-specific ACSet objects (Thread, DriveFile, CalendarEvent, Task, Document, Sheet) and compose using defined morphisms so that different paths yield equivalent results. The system verifies GF(3) global conservation, path commutativity, saturation thresholds per service, and MCP↔API equivalence before declaring workspace saturation.

When to use it

  • Automating workflows that span Gmail, Drive, Calendar, Tasks and Docs together
  • Ensuring cross-service actions preserve information balance and deterministic outcomes
  • Converting high-level operations into verified MCP calls or API requests
  • Detecting and proving global completion (saturation) of workspace workflows
  • Building agents or queues that route actions by trit-based priorities

Best practices

  • Map every user-visible action to a single Interaction with an explicit verb and trit
  • Keep morphism triggers explicit (e.g., attachment→thread_file) to preserve commutativity
  • Validate GF(3) conservation after batched operations to catch drift early
  • Use saturation checks (service thresholds, trit sum mod 3, queue emptiness) as gate conditions
  • Prefer ERGODIC verbs for metadata updates to avoid unintended generation or consumption

Example use cases

  • Automatically create a CalendarEvent and linked Task when a Gmail thread contains an action item, while proving the thread_task == event_task invariant
  • Route an attachment from a Thread to DriveFile, extract content into a Document and populate a Sheet while keeping trit balance
  • Coordinate a multi-step onboarding flow across Drive, Docs and Tasks with MCP↔API verification at each step
  • Detect workspace saturation to trigger archive or handoff procedures once all queues are empty and GF(3) is conserved

FAQ

What does GF(3) conservation mean in practice?

It means each interaction carries a trit (−1, 0, +1) and the system enforces that the sum of trits across active interactions is congruent to 0 mod 3 after composed operations.

How are cross-skill morphisms validated?

Morphisms are defined with explicit triggers and GF(3) effects; the platform verifies path commutativity by comparing alternative composition paths and checking equivalence before committing changes.