application · active

Topolo Support

Tenant-scoped support platform for Topolo internal operations and customer-organization ticket workflows, with support-owned workflow persistence kept outside Topolo Auth.

Documentation map

  • Topolo Support — Public overview of the Topolo support platform for internal operations and customer-organization ticket workflows.

Authority and runtime

System ID
topolo-support
App IDs
app_topolo_support
Owners
support-operations, platform-experience
Repositories
apps/TopoloSupport
Hosts
https://support.topolo.app, https://support.stg.topolo.us
Dependencies
topolo-auth, topolo-nexus, applications-packages

Security and data ownership

Risk tier
high
Tenant isolation
mixed
Privacy classification
restricted
Storage
d1, external_provider
Export and deletion
planned
Enterprise ready
no

Source-derived capability inventory

Source revisions: apps/TopoloSupport@77105cf20c40ad714d45907641b33ea6a6dbdd04

Declared actions: 26 · API routes: 1 · UI routes: 6

{
  "id": "topolo-support",
  "name": "Topolo Support",
  "slug": "topolo-support",
  "kind": "application",
  "visibility": "public",
  "repo_paths": [
    "apps/TopoloSupport"
  ],
  "source_revisions": [
    {
      "source_path": "apps/TopoloSupport",
      "repository": "apps/TopoloSupport",
      "revision": "77105cf20c40ad714d45907641b33ea6a6dbdd04",
      "ref": "origin/staging"
    }
  ],
  "source_counts": {
    "source_files": 91,
    "test_files": 56,
    "test_cases": 0,
    "migration_files": 14,
    "database_tables": 0,
    "manifests": 1,
    "deploy_targets": 2,
    "actions": 26,
    "mobile_contracts": 1,
    "notifications": 9,
    "package_manifests": 1,
    "deployment_configs": 0
  },
  "manifests": [
    {
      "source_path": "apps/TopoloSupport/topolo.app.json",
      "service_slug": "topolo-support",
      "name": "topolo-support",
      "app_id": "app_topolo_support",
      "compatibility_date": "2026-04-10",
      "primary_target": "web",
      "environments": [
        "development",
        "production",
        "staging"
      ],
      "targets": [
        {
          "name": "api",
          "kind": "worker",
          "directory": "apps/api",
          "main": "src/worker.ts",
          "worker_name": "topolo-support-api",
          "subdomain": null,
          "healthcheck_path": "/api/health",
          "variable_names": [
            "AUTH_API_URL",
            "ENVIRONMENT",
            "NEXUS_GATEWAY_URL",
            "SUPPORT_PUBLIC_BASE_URL",
            "TOPOLO_NEXUS_API_URL",
            "TOPOLO_NOTIFY_URL",
            "TOPOLO_SEED_APP_ID"
          ],
          "secret_names": [],
          "bindings": [
            {
              "kind": "d1",
              "binding": "SUPPORT_CORE_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "SUPPORT_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "SUPPORT_INGEST_DB",
              "target": null
            },
            {
              "kind": "d1",
              "binding": "SUPPORT_OUTBOX_DB",
              "target": null
            },
            {
              "kind": "secretsStore",
              "binding": "PLATFORM_AT_REST_MASTER_ENCRYPTION_KEY_STORE",
              "target": null
            },
            {
              "kind": "secretsStore",
              "binding": "PLATFORM_AT_REST_MASTER_ENCRYPTION_KEY_PREVIOUS_STORE",
              "target": null
            }
          ]
        },
        {
          "name": "web",
          "kind": "worker",
          "directory": "apps/web",
          "main": "src/worker.ts",
          "worker_name": "topolo-support",
          "subdomain": null,
          "healthcheck_path": "/api/health",
          "variable_names": [
            "INSIGHTS_SITE_KEY"
          ],
          "secret_names": [],
          "bindings": [
            {
              "kind": "services",
              "binding": "API",
              "target": null
            },
            {
              "kind": "services",
              "binding": "API",
              "target": null
            },
            {
              "kind": "services",
              "binding": "API",
              "target": null
            }
          ]
        }
      ],
      "notifications": [
        "support.customer_reply.received",
        "support.notification.delivery_failed",
        "support.sla.breached",
        "support.sla.warning",
        "support.ticket.assigned",
        "support.ticket.created",
        "support.ticket.escalated",
        "support.ticket.reopened",
        "support.ticket.resolved"
      ],
      "notification_contract": {
        "source_path": "topolo.notification-contracts.json",
        "role": "producer",
        "schema_version": 1,
        "owner_app_id": "app_topolo_support",
        "events": [
          {
            "type": "support.customer_reply.received",
            "version": 1,
            "description": "Support recorded the durable customer reply received transition.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "recipient_email": {
                  "type": "string",
                  "format": "email"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "Requester replied: Login issue",
                "body": "The requester added a public reply.",
                "recipient_email": "agent@example.com",
                "object_id": "ticket_123",
                "occurred_at": "2026-07-17T12:00:00.000Z"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "recipient_email",
              "body"
            ],
            "recipients": {
              "modes": [
                "organization_member",
                "external"
              ],
              "externalAddress": "optional"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:outbox:"
            }
          },
          {
            "type": "support.notification.delivery_failed",
            "version": 1,
            "description": "A persisted Support outbox delivery exhausted its retry budget.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "ticket_id",
                "ticket_subject",
                "surface",
                "priority",
                "severity",
                "category",
                "object_type",
                "object_id",
                "cta_url",
                "cta_label",
                "occurred_at",
                "failure_reason",
                "delivery_id"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_id": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_subject": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "const": "action"
                },
                "priority": {
                  "const": "high"
                },
                "severity": {
                  "const": "warning"
                },
                "category": {
                  "const": "support"
                },
                "object_type": {
                  "const": "support_notification"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "failure_reason": {
                  "type": "string",
                  "minLength": 1
                },
                "delivery_id": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Support notification failed: Login issue",
                "body": "A ticket notification exhausted its delivery retries.",
                "ticket_id": "ticket_123",
                "ticket_subject": "Login issue",
                "surface": "action",
                "priority": "high",
                "severity": "warning",
                "category": "support",
                "object_type": "support_notification",
                "object_id": "delivery_123",
                "cta_url": "https://support.topolo.app/tickets/ticket_123",
                "cta_label": "Open ticket",
                "occurred_at": "2026-07-20T12:00:00.000Z",
                "failure_reason": "retry limit reached",
                "delivery_id": "delivery_123"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "body",
              "ticket_subject",
              "failure_reason"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:delivery:"
            }
          },
          {
            "type": "support.sla.breached",
            "version": 1,
            "description": "A persisted unresolved Support ticket crossed its priority-based SLA deadline.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "ticket_id",
                "ticket_subject",
                "surface",
                "priority",
                "severity",
                "category",
                "object_type",
                "object_id",
                "cta_url",
                "cta_label",
                "occurred_at",
                "metric",
                "due_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_id": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_subject": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "const": "action"
                },
                "priority": {
                  "const": "urgent"
                },
                "severity": {
                  "const": "critical"
                },
                "category": {
                  "const": "support"
                },
                "object_type": {
                  "const": "support_sla"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "metric": {
                  "enum": [
                    "first_response",
                    "resolution"
                  ]
                },
                "due_at": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "SLA breached: Login issue",
                "body": "First response is breached.",
                "ticket_id": "ticket_123",
                "ticket_subject": "Login issue",
                "surface": "action",
                "priority": "urgent",
                "severity": "critical",
                "category": "support",
                "object_type": "support_sla",
                "object_id": "ticket_123:first_response:2026-07-20T12:00:00.000Z",
                "cta_url": "https://support.topolo.app/tickets/ticket_123",
                "cta_label": "Open ticket",
                "occurred_at": "2026-07-20T12:01:00.000Z",
                "metric": "first_response",
                "due_at": "2026-07-20T12:00:00.000Z"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "body",
              "ticket_subject"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:sla:"
            }
          },
          {
            "type": "support.sla.warning",
            "version": 1,
            "description": "A persisted unresolved Support ticket entered its SLA warning window.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "ticket_id",
                "ticket_subject",
                "surface",
                "priority",
                "severity",
                "category",
                "object_type",
                "object_id",
                "cta_url",
                "cta_label",
                "occurred_at",
                "metric",
                "due_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_id": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_subject": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "const": "action"
                },
                "priority": {
                  "const": "high"
                },
                "severity": {
                  "const": "warning"
                },
                "category": {
                  "const": "support"
                },
                "object_type": {
                  "const": "support_sla"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "metric": {
                  "enum": [
                    "first_response",
                    "resolution"
                  ]
                },
                "due_at": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "SLA warning: Login issue",
                "body": "Resolution is warning.",
                "ticket_id": "ticket_123",
                "ticket_subject": "Login issue",
                "surface": "action",
                "priority": "high",
                "severity": "warning",
                "category": "support",
                "object_type": "support_sla",
                "object_id": "ticket_123:resolution:2026-07-20T16:00:00.000Z",
                "cta_url": "https://support.topolo.app/tickets/ticket_123",
                "cta_label": "Open ticket",
                "occurred_at": "2026-07-20T12:00:00.000Z",
                "metric": "resolution",
                "due_at": "2026-07-20T16:00:00.000Z"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "body",
              "ticket_subject"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:sla:"
            }
          },
          {
            "type": "support.ticket.assigned",
            "version": 1,
            "description": "A support ticket was assigned to an organization member.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "enum": [
                    "notification",
                    "action"
                  ]
                },
                "action_kind": {
                  "enum": [
                    "open",
                    "review",
                    "approve",
                    "resolve",
                    "complete"
                  ]
                },
                "action_status": {
                  "type": "string"
                },
                "priority": {
                  "enum": [
                    "low",
                    "normal",
                    "high",
                    "urgent"
                  ]
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string"
                },
                "actor_display_name": {
                  "type": "string"
                },
                "recipient_email": {
                  "type": "string",
                  "format": "email"
                },
                "thread_key": {
                  "type": "string"
                },
                "expires_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "action_context": {
                  "type": "object"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "A support ticket was assigned to an organization member.",
                "body": "Open the owning app to review this event.",
                "object_id": "object_123",
                "occurred_at": "2026-07-17T00:00:00.000Z"
              }
            ],
            "dataClassification": "internal",
            "recipients": {
              "modes": [
                "organization_member",
                "external"
              ],
              "externalAddress": "optional"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:ticket-assigned:"
            },
            "sensitiveFields": [
              "recipient_email",
              "body"
            ]
          },
          {
            "type": "support.ticket.created",
            "version": 1,
            "description": "Support recorded the durable ticket created transition.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "object_id",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "recipient_email": {
                  "type": "string",
                  "format": "email"
                },
                "category": {
                  "type": "string"
                },
                "severity": {
                  "enum": [
                    "info",
                    "success",
                    "warning",
                    "critical"
                  ]
                },
                "object_type": {
                  "type": "string"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string"
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            },
            "examples": [
              {
                "title": "Ticket received: Login issue",
                "body": "We received your support request.",
                "recipient_email": "requester@example.com",
                "object_id": "ticket_123",
                "occurred_at": "2026-07-17T12:00:00.000Z"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "recipient_email",
              "body"
            ],
            "recipients": {
              "modes": [
                "organization_member",
                "external"
              ],
              "externalAddress": "optional"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:outbox:"
            }
          },
          {
            "type": "support.ticket.escalated",
            "version": 1,
            "description": "A persisted Support workflow event moved a ticket to urgent priority.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "ticket_id",
                "ticket_subject",
                "surface",
                "priority",
                "severity",
                "category",
                "object_type",
                "object_id",
                "cta_url",
                "cta_label",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_id": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_subject": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "const": "action"
                },
                "priority": {
                  "const": "urgent"
                },
                "severity": {
                  "const": "critical"
                },
                "category": {
                  "const": "support"
                },
                "object_type": {
                  "const": "ticket"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Urgent ticket: Login issue",
                "body": "This ticket was escalated to urgent priority.",
                "ticket_id": "ticket_123",
                "ticket_subject": "Login issue",
                "surface": "action",
                "priority": "urgent",
                "severity": "critical",
                "category": "support",
                "object_type": "ticket",
                "object_id": "ticket_123",
                "cta_url": "https://support.topolo.app/tickets/ticket_123",
                "cta_label": "Open ticket",
                "occurred_at": "2026-07-20T12:00:00.000Z",
                "actor_id": "user_123"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "body",
              "ticket_subject"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:ticket-event:"
            }
          },
          {
            "type": "support.ticket.reopened",
            "version": 1,
            "description": "A persisted Support workflow event reopened a resolved or closed ticket.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "ticket_id",
                "ticket_subject",
                "surface",
                "priority",
                "severity",
                "category",
                "object_type",
                "object_id",
                "cta_url",
                "cta_label",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_id": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_subject": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "const": "action"
                },
                "priority": {
                  "enum": [
                    "high",
                    "urgent"
                  ]
                },
                "severity": {
                  "const": "warning"
                },
                "category": {
                  "const": "support"
                },
                "object_type": {
                  "const": "ticket"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Ticket reopened: Login issue",
                "body": "A resolved ticket was reopened and needs attention.",
                "ticket_id": "ticket_123",
                "ticket_subject": "Login issue",
                "surface": "action",
                "priority": "high",
                "severity": "warning",
                "category": "support",
                "object_type": "ticket",
                "object_id": "ticket_123",
                "cta_url": "https://support.topolo.app/tickets/ticket_123",
                "cta_label": "Open ticket",
                "occurred_at": "2026-07-20T12:00:00.000Z",
                "actor_id": "user_123"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "body",
              "ticket_subject"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:ticket-event:"
            }
          },
          {
            "type": "support.ticket.resolved",
            "version": 1,
            "description": "A persisted Support workflow event marked a ticket resolved.",
            "status": "published",
            "payloadSchema": {
              "type": "object",
              "required": [
                "title",
                "body",
                "ticket_id",
                "ticket_subject",
                "surface",
                "priority",
                "severity",
                "category",
                "object_type",
                "object_id",
                "cta_url",
                "cta_label",
                "occurred_at"
              ],
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1
                },
                "body": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_id": {
                  "type": "string",
                  "minLength": 1
                },
                "ticket_subject": {
                  "type": "string",
                  "minLength": 1
                },
                "surface": {
                  "const": "notification"
                },
                "priority": {
                  "const": "normal"
                },
                "severity": {
                  "const": "success"
                },
                "category": {
                  "const": "support"
                },
                "object_type": {
                  "const": "ticket"
                },
                "object_id": {
                  "type": "string",
                  "minLength": 1
                },
                "cta_url": {
                  "type": "string",
                  "format": "uri"
                },
                "cta_label": {
                  "type": "string",
                  "minLength": 1
                },
                "occurred_at": {
                  "type": "string",
                  "format": "date-time"
                },
                "actor_id": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "additionalProperties": false
            },
            "examples": [
              {
                "title": "Ticket resolved: Login issue",
                "body": "This ticket was marked resolved.",
                "ticket_id": "ticket_123",
                "ticket_subject": "Login issue",
                "surface": "notification",
                "priority": "normal",
                "severity": "success",
                "category": "support",
                "object_type": "ticket",
                "object_id": "ticket_123",
                "cta_url": "https://support.topolo.app/tickets/ticket_123",
                "cta_label": "Open ticket",
                "occurred_at": "2026-07-20T12:00:00.000Z",
                "actor_id": "user_123"
              }
            ],
            "dataClassification": "confidential",
            "sensitiveFields": [
              "body",
              "ticket_subject"
            ],
            "recipients": {
              "modes": [
                "organization_member"
              ],
              "externalAddress": "forbidden"
            },
            "idempotency": {
              "required": true,
              "pattern": "^support:ticket-event:"
            }
          }
        ]
      },
      "actions": [
        {
          "name": "widget.get",
          "title": "Get widget summary",
          "description": "Get the TopoloOne widget summary for this service.",
          "method": "GET",
          "path": "/api/widget",
          "permission": "tickets:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/widget",
              "body": null
            },
            "effects": "Reads state through GET /api/widget without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "declared_unserved",
            "route_key": "GET /api/widget",
            "evidence": "No matching served route was extracted from canonical staging source."
          }
        },
        {
          "name": "workspaces.delete",
          "title": "Delete support workspace",
          "description": "Delete an empty non-default support workspace.",
          "method": "DELETE",
          "path": "/api/support/workspace/{workspaceId}",
          "permission": "workspace:delete",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "workspaceId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": true,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/support/workspace/example",
              "body": null
            },
            "effects": "May change state through DELETE /api/support/workspace/{workspaceId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/support/workspace/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "inboxes.create",
          "title": "Create support inbox",
          "description": "Create an inbox in a support workspace.",
          "method": "POST",
          "path": "/api/support/workspace/{workspaceId}/inboxes",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 2
              },
              "slug": {
                "type": "string",
                "minLength": 1
              },
              "channel": {
                "type": "string",
                "enum": [
                  "portal",
                  "api",
                  "email",
                  "webhook",
                  "widget",
                  "messaging",
                  "manual"
                ]
              },
              "isDefault": {
                "type": "boolean"
              }
            },
            "required": [
              "workspaceId",
              "name"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "name": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/workspace/example/inboxes",
              "body": {
                "workspaceId": "example",
                "name": "example"
              }
            },
            "effects": "May change state through POST /api/support/workspace/{workspaceId}/inboxes. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/workspace/*/inboxes",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "inboxes.update",
          "title": "Update support inbox",
          "description": "Update an inbox in a support workspace.",
          "method": "PATCH",
          "path": "/api/support/workspace/{workspaceId}/inboxes/{inboxId}",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "inboxId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 2
              },
              "slug": {
                "type": "string",
                "minLength": 1
              },
              "channel": {
                "type": "string",
                "enum": [
                  "portal",
                  "api",
                  "email",
                  "webhook",
                  "widget",
                  "messaging",
                  "manual"
                ]
              },
              "isDefault": {
                "type": "boolean"
              },
              "isActive": {
                "type": "boolean"
              }
            },
            "required": [
              "workspaceId",
              "inboxId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "inboxId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/support/workspace/example/inboxes/example",
              "body": {
                "workspaceId": "example",
                "inboxId": "example"
              }
            },
            "effects": "May change state through PATCH /api/support/workspace/{workspaceId}/inboxes/{inboxId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/support/workspace/*/inboxes/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "tickets.list",
          "title": "List tickets",
          "description": "List support tickets.",
          "method": "GET",
          "path": "/api/support/tickets",
          "permission": "tickets:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List tickets.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/support/tickets",
              "body": null
            },
            "effects": "Reads state through GET /api/support/tickets without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/support/tickets",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "tickets.create",
          "title": "Create ticket",
          "description": "Create a support ticket.",
          "method": "POST",
          "path": "/api/support/tickets",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "inboxId": {
                "type": "string",
                "minLength": 1
              },
              "subject": {
                "type": "string",
                "minLength": 1
              },
              "description": {
                "type": "string",
                "minLength": 1
              },
              "serviceName": {
                "type": "string",
                "minLength": 1
              },
              "appId": {
                "type": "string",
                "minLength": 1
              },
              "priority": {
                "type": "string",
                "minLength": 1
              },
              "category": {
                "type": "string",
                "minLength": 1
              },
              "requesterName": {
                "type": "string",
                "minLength": 1
              },
              "requesterEmail": {
                "type": "string",
                "minLength": 1
              },
              "requesterUserId": {
                "type": "string",
                "minLength": 1
              },
              "requesterOrgId": {
                "type": "string",
                "minLength": 1
              },
              "source": {
                "type": "string",
                "minLength": 1
              },
              "sourceReference": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create ticket.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "inboxId": "example",
              "subject": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/tickets",
              "body": {
                "workspaceId": "example",
                "inboxId": "example",
                "subject": "example"
              }
            },
            "effects": "May change state through POST /api/support/tickets. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/tickets",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "tickets.get",
          "title": "Get ticket",
          "description": "Get one support ticket.",
          "method": "GET",
          "path": "/api/support/tickets/{ticketId}",
          "permission": "tickets:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "ticketId": {
                "type": "string",
                "minLength": 1
              },
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "ticketId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get ticket.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "ticketId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/support/tickets/example",
              "body": null
            },
            "effects": "Reads state through GET /api/support/tickets/{ticketId} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/support/tickets/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "tickets.update",
          "title": "Update ticket",
          "description": "Update one support ticket.",
          "method": "PATCH",
          "path": "/api/support/tickets/{ticketId}",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "ticketId": {
                "type": "string",
                "minLength": 1
              },
              "status": {
                "type": "string",
                "minLength": 1
              },
              "priority": {
                "type": "string",
                "minLength": 1
              },
              "category": {
                "type": "string",
                "minLength": 1
              },
              "assignedToUserId": {
                "type": "string",
                "minLength": 1
              },
              "assignedToName": {
                "type": "string",
                "minLength": 1
              },
              "assignedToEmail": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "ticketId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update ticket.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "ticketId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/support/tickets/example",
              "body": {
                "ticketId": "example"
              }
            },
            "effects": "May change state through PATCH /api/support/tickets/{ticketId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/support/tickets/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "ticket_messages.create",
          "title": "Create ticket message",
          "description": "Add a message to a support ticket.",
          "method": "POST",
          "path": "/api/support/tickets/{ticketId}/messages",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "ticketId": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              },
              "visibility": {
                "type": "string",
                "minLength": 1
              },
              "channel": {
                "type": "string",
                "minLength": 1
              },
              "sourceReference": {
                "type": "string",
                "minLength": 1
              },
              "macroId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "ticketId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create ticket message.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "ticketId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/tickets/example/messages",
              "body": {
                "ticketId": "example"
              }
            },
            "effects": "May change state through POST /api/support/tickets/{ticketId}/messages. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/tickets/*/messages",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "macros.list",
          "title": "List macros",
          "description": "List support macros.",
          "method": "GET",
          "path": "/api/support/macros",
          "permission": "macros:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by List macros.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/support/macros",
              "body": null
            },
            "effects": "Reads state through GET /api/support/macros without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/support/macros",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "macros.get",
          "title": "Get macro",
          "description": "Get one support macro.",
          "method": "GET",
          "path": "/api/support/macros/{macroId}",
          "permission": "macros:read",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "type": "object",
            "properties": {
              "macroId": {
                "type": "string",
                "minLength": 1
              },
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "macroId"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "macroId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/support/macros/example",
              "body": null
            },
            "effects": "Reads state through GET /api/support/macros/{macroId} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/support/macros/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "macros.create",
          "title": "Create macro",
          "description": "Create a support macro.",
          "method": "POST",
          "path": "/api/support/macros",
          "permission": "macros:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "title": {
                "type": "string",
                "minLength": 1
              },
              "body": {
                "type": "string",
                "minLength": 1
              },
              "visibility": {
                "type": "string",
                "minLength": 1
              },
              "suggestedStatus": {
                "type": "string",
                "minLength": 1
              },
              "suggestedPriority": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create macro.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "title": "example",
              "body": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/macros",
              "body": {
                "workspaceId": "example",
                "title": "example",
                "body": "example"
              }
            },
            "effects": "May change state through POST /api/support/macros. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/macros",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.get",
          "title": "Get operations overview",
          "description": "Get support routing, triage, agent capacity, and queue analytics.",
          "method": "GET",
          "path": "/api/support/operations",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Get operations overview.",
            "additionalProperties": true
          },
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/support/operations",
              "body": null
            },
            "effects": "Reads state through GET /api/support/operations without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/support/operations",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.section.get",
          "title": "Get operations section",
          "description": "Get one support operations section.",
          "method": "GET",
          "path": "/api/support/operations/{section}",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": true,
          "inputSchema": {
            "type": "object",
            "properties": {
              "section": {
                "type": "string",
                "enum": [
                  "overview",
                  "workspaces",
                  "settings",
                  "agents",
                  "routing",
                  "channels",
                  "intelligence"
                ]
              },
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "section"
            ],
            "additionalProperties": false
          },
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "target": "api",
          "destructive": false,
          "requiresConfirmation": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {
              "section": "overview"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/support/operations/overview",
              "body": null
            },
            "effects": "Reads state through GET /api/support/operations/{section} without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/support/operations/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.settings.update",
          "title": "Update operations settings",
          "description": "Update support workspace assignment, triage, CSAT, timezone, and business-hour settings.",
          "method": "PATCH",
          "path": "/api/support/operations/settings",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "timezone": {
                "type": "string",
                "minLength": 1
              },
              "businessHours": {
                "type": "string"
              },
              "autoAssignmentEnabled": {
                "type": "boolean"
              },
              "aiTriageEnabled": {
                "type": "boolean"
              },
              "csatEnabled": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update operations settings.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "timezone": "example",
              "businessHours": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/support/operations/settings",
              "body": {
                "workspaceId": "example",
                "timezone": "example",
                "businessHours": "example"
              }
            },
            "effects": "May change state through PATCH /api/support/operations/settings. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/support/operations/settings",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.agents.update",
          "title": "Update support agent profile",
          "description": "Update a support agent status, capacity, skills, or active state.",
          "method": "PATCH",
          "path": "/api/support/operations/agents/{agentId}",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "agentId": {
                "type": "string",
                "minLength": 1
              },
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "status": {
                "type": "string",
                "minLength": 1
              },
              "maxCapacity": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "skills": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                ]
              },
              "isActive": {
                "type": "boolean"
              }
            },
            "required": [
              "agentId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update support agent profile.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "agentId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/support/operations/agents/example",
              "body": {
                "agentId": "example"
              }
            },
            "effects": "May change state through PATCH /api/support/operations/agents/{agentId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/support/operations/agents/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.routing_rules.create",
          "title": "Create routing rule",
          "description": "Create a support routing rule for ticket assignment.",
          "method": "POST",
          "path": "/api/support/operations/routing-rules",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "priorityOrder": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "matchSource": {
                "type": "string"
              },
              "matchCategory": {
                "type": "string"
              },
              "matchPriority": {
                "type": "string"
              },
              "targetInboxId": {
                "type": "string"
              },
              "requiredSkills": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                ]
              },
              "isActive": {
                "type": "boolean"
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Create routing rule.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example",
              "name": "example",
              "priorityOrder": 1
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/operations/routing-rules",
              "body": {
                "workspaceId": "example",
                "name": "example",
                "priorityOrder": 1
              }
            },
            "effects": "May change state through POST /api/support/operations/routing-rules. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/operations/routing-rules",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.routing_rules.update",
          "title": "Update routing rule",
          "description": "Update a support routing rule for ticket assignment.",
          "method": "PATCH",
          "path": "/api/support/operations/routing-rules/{ruleId}",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "ruleId": {
                "type": "string",
                "minLength": 1
              },
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "priorityOrder": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "matchSource": {
                "type": "string"
              },
              "matchCategory": {
                "type": "string"
              },
              "matchPriority": {
                "type": "string"
              },
              "targetInboxId": {
                "type": "string"
              },
              "requiredSkills": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                ]
              },
              "isActive": {
                "type": "boolean"
              }
            },
            "required": [
              "ruleId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Update routing rule.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "ruleId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "PATCH",
              "path": "/api/support/operations/routing-rules/example",
              "body": {
                "ruleId": "example"
              }
            },
            "effects": "May change state through PATCH /api/support/operations/routing-rules/{ruleId}. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "PATCH /api/support/operations/routing-rules/*",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.channel_connections.create",
          "title": "Connect support mailbox channel",
          "description": "Connect an IMAP mailbox to a support inbox through Nexus-managed mailbox credentials.",
          "method": "POST",
          "path": "/api/support/operations/channel-connections",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "inboxId": {
                "type": "string",
                "minLength": 1
              },
              "provider": {
                "type": "string",
                "minLength": 1
              },
              "displayName": {
                "type": "string"
              },
              "authUsername": {
                "type": "string",
                "minLength": 1
              },
              "authPassword": {
                "type": "string",
                "minLength": 1
              },
              "imapHost": {
                "type": "string",
                "minLength": 1
              },
              "imapPort": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "imapSecure": {
                "type": "boolean"
              },
              "smtpHost": {
                "type": "string",
                "minLength": 1
              },
              "smtpPort": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              },
              "smtpSecure": {
                "type": "boolean"
              }
            },
            "required": [
              "inboxId",
              "authUsername",
              "authPassword",
              "imapHost",
              "smtpHost"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Connect support mailbox channel.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "inboxId": "example",
              "authUsername": "example",
              "authPassword": "example",
              "imapHost": "example",
              "smtpHost": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/operations/channel-connections",
              "body": {
                "inboxId": "example",
                "authUsername": "example",
                "authPassword": "example",
                "imapHost": "example",
                "smtpHost": "example"
              }
            },
            "effects": "May change state through POST /api/support/operations/channel-connections. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/operations/channel-connections",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.channel_connections.sync",
          "title": "Sync support mailbox channel",
          "description": "Fetch new IMAP messages from a connected support mailbox channel.",
          "method": "POST",
          "path": "/api/support/operations/channel-connections/{connectionId}/sync",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "connectionId": {
                "type": "string",
                "minLength": 1
              },
              "workspaceId": {
                "type": "string",
                "minLength": 1
              },
              "limit": {
                "type": "integer",
                "exclusiveMinimum": 0,
                "maximum": 9007199254740991
              }
            },
            "required": [
              "connectionId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Sync support mailbox channel.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "connectionId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/operations/channel-connections/example/sync",
              "body": {
                "connectionId": "example"
              }
            },
            "effects": "May change state through POST /api/support/operations/channel-connections/{connectionId}/sync. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/operations/channel-connections/*/sync",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.triage",
          "title": "Refresh triage intelligence",
          "description": "Refresh deterministic triage summaries, intents, sentiment, and automation scores for open tickets.",
          "method": "POST",
          "path": "/api/support/operations/triage",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Refresh triage intelligence.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/operations/triage",
              "body": {
                "workspaceId": "example"
              }
            },
            "effects": "May change state through POST /api/support/operations/triage. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/operations/triage",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "operations.route",
          "title": "Run routing assignment",
          "description": "Assign open support tickets to active agents using workspace routing rules and capacity.",
          "method": "POST",
          "path": "/api/support/operations/route",
          "permission": "tickets:write",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "workspaceId": {
                "type": "string",
                "minLength": 1
              }
            },
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Run routing assignment.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "workspaceId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/operations/route",
              "body": {
                "workspaceId": "example"
              }
            },
            "effects": "May change state through POST /api/support/operations/route. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/operations/route",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "ticket_notifications.dispatch",
          "title": "Dispatch ticket notification",
          "description": "Dispatch notifications for a support ticket.",
          "method": "POST",
          "path": "/api/support/tickets/{ticketId}/notifications/dispatch",
          "permission": "replies:invoke",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "ticketId": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "ticketId"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "description": "Response returned by Dispatch ticket notification.",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "ticketId": "example"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "POST",
              "path": "/api/support/tickets/example/notifications/dispatch",
              "body": {
                "ticketId": "example"
              }
            },
            "effects": "May change state through POST /api/support/tickets/{ticketId}/notifications/dispatch. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "POST /api/support/tickets/*/notifications/dispatch",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "privacy.export",
          "title": "Export support organization data",
          "description": "Export the authenticated organization's portable Support data with secrets and operational errors redacted.",
          "method": "GET",
          "path": "/api/support/privacy",
          "permission": "privacy:read",
          "authorizationMode": "static",
          "readOnly": true,
          "requiresConfirmation": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/support/privacy",
              "body": null
            },
            "effects": "Reads state through GET /api/support/privacy without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/support/privacy",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "privacy.erase",
          "title": "Erase support organization data",
          "description": "Permanently erase the authenticated organization's Support data and retain only a hash-based erasure receipt.",
          "method": "DELETE",
          "path": "/api/support/privacy",
          "permission": "privacy:delete",
          "authorizationMode": "static",
          "readOnly": false,
          "requiresConfirmation": true,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {
              "confirmation": {
                "type": "string",
                "const": "ERASE"
              }
            },
            "required": [
              "confirmation"
            ],
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "destructive": true,
          "agentAccess": "confirm",
          "documentation": {
            "example_input": {
              "confirmation": "ERASE"
            },
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --confirm --json"
            ],
            "http_example": {
              "method": "DELETE",
              "path": "/api/support/privacy",
              "body": null
            },
            "effects": "May change state through DELETE /api/support/privacy. Inspect the plan and honor the published confirmation policy.",
            "verification": [
              "Check the structured action result.",
              "Read the affected resource back through the corresponding get or list action."
            ],
            "recovery": [
              "Do not retry an ambiguous mutation until a read confirms whether it applied.",
              "Use a published inverse, update, archive, or delete action only after inspecting its contract."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "DELETE /api/support/privacy",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        },
        {
          "name": "privacy.protection_canary",
          "title": "Check support content protection",
          "description": "Verify ticket content, requester and assignee PII, message and notification bodies, webhook payloads, and sensitive source references use readable canonical protection envelopes with valid keyed lookup digests.",
          "method": "GET",
          "path": "/api/support/privacy/protection/canary",
          "permission": "privacy:read",
          "authorizationMode": "static",
          "readOnly": true,
          "requiresConfirmation": false,
          "inputSchema": {
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            "type": "object",
            "properties": {},
            "additionalProperties": false
          },
          "target": "api",
          "outputSchema": {
            "type": "object",
            "additionalProperties": true
          },
          "destructive": false,
          "agentAccess": "auto",
          "documentation": {
            "example_input": {},
            "cli_example": [
              "topolo actions --service topolo-support --json",
              "topolo actions get <action-id> --json",
              "topolo actions validate <action-id> --data @payload.json --json",
              "topolo actions plan <action-id> --data @payload.json --json",
              "topolo actions call <action-id> --data @payload.json --json"
            ],
            "http_example": {
              "method": "GET",
              "path": "/api/support/privacy/protection/canary",
              "body": null
            },
            "effects": "Reads state through GET /api/support/privacy/protection/canary without a declared mutation.",
            "verification": [
              "Check the structured action result and pagination or resource identifiers before using it downstream."
            ],
            "recovery": [
              "Correct identity, resource context, permission, or input validation failures, then retry the read."
            ],
            "docs_url": null,
            "resource": null,
            "next_action_ids": [],
            "rollback_action_id": null
          },
          "implementation": {
            "status": "implemented",
            "route_key": "GET /api/support/privacy/protection/canary",
            "evidence": "Matched to a served route extracted from canonical staging source."
          }
        }
      ],
      "action_coverage": {
        "status": "ok",
        "served_routes": 31,
        "matched_actions": 25,
        "declared_unserved_actions": [
          "GET /api/widget"
        ],
        "coverage_excluded_actions": [],
        "uncatalogued_routes": [],
        "ignored_routes": 6,
        "configured_exclusions": 8,
        "configuration_findings": [
          "* /api/auth/*: exclusion matches no served route",
          "* /api/support/*: exclusion matches no served route"
        ],
        "notes": [
          "no routes extracted from api",
          "31 manually-declared route(s)"
        ]
      },
      "runtime_contract_audit": {
        "status": "verified",
        "actions": 26,
        "contracts": 26,
        "contract_module": "topolo.action-contracts.mjs",
        "validator_sources": [
          "apps/api/src/worker.ts"
        ],
        "authorization_sources": [
          "apps/api/src/worker.ts"
        ],
        "findings": []
      }
    }
  ],
  "mobile_contracts": [
    {
      "source_path": "apps/TopoloSupport/topolo.mobile-experience.json",
      "contract": {
        "version": "2026-06-29",
        "status": "approved",
        "mode": "native_capability",
        "appId": "app_topolo_support",
        "localizationNamespace": "support",
        "permissions": [
          "tickets:read",
          "tickets:write",
          "macros:read",
          "macros:write"
        ],
        "offlinePolicy": "read_through_cache",
        "fallbackPath": "/tickets",
        "auth": {
          "audience": "topolo-support",
          "scopes": [
            "tickets:read",
            "tickets:write",
            "macros:read",
            "macros:write"
          ]
        },
        "routes": [
          {
            "path": "/tickets",
            "apiPath": "/api/support/tickets",
            "title": "Tickets",
            "titleKey": "support.mobile.routes.tickets.title",
            "template": "record.list",
            "dataSource": "support.tickets.list",
            "detailRoute": "/tickets/:id",
            "actions": [
              {
                "id": "support.tickets.create",
                "title": "Create ticket",
                "type": "record.create",
                "permission": "tickets:write",
                "method": "POST",
                "path": "/api/support/tickets",
                "fields": [
                  {
                    "key": "subject",
                    "label": "Subject",
                    "labelKey": "support.supportshared.subject",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "description",
                    "label": "Description",
                    "labelKey": "support.supportshared.description",
                    "type": "textarea",
                    "required": true
                  },
                  {
                    "key": "serviceName",
                    "label": "Service",
                    "labelKey": "support.supportshared.service",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "priority",
                    "label": "Priority",
                    "labelKey": "support.supportshared.priority",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "category",
                    "label": "Category",
                    "labelKey": "support.supportshared.category",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "requesterName",
                    "label": "Requester name",
                    "type": "text"
                  },
                  {
                    "key": "requesterEmail",
                    "label": "Requester email",
                    "type": "email"
                  },
                  {
                    "key": "status",
                    "label": "Status",
                    "labelKey": "support.supportshared.status",
                    "type": "text"
                  },
                  {
                    "key": "assignedToName",
                    "label": "Assignee name",
                    "type": "text"
                  },
                  {
                    "key": "assignedToEmail",
                    "label": "Assignee email",
                    "type": "email"
                  }
                ],
                "titleKey": "support.mobile.actions.tickets.create.title"
              },
              {
                "id": "support.tickets.update",
                "title": "Update ticket",
                "type": "record.update",
                "permission": "tickets:write",
                "method": "PATCH",
                "path": "/api/support/tickets/:id",
                "fields": [
                  {
                    "key": "subject",
                    "label": "Subject",
                    "labelKey": "support.supportshared.subject",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "description",
                    "label": "Description",
                    "labelKey": "support.supportshared.description",
                    "type": "textarea",
                    "required": true
                  },
                  {
                    "key": "serviceName",
                    "label": "Service",
                    "labelKey": "support.supportshared.service",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "status",
                    "label": "Status",
                    "labelKey": "support.supportshared.status",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "priority",
                    "label": "Priority",
                    "labelKey": "support.supportshared.priority",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "category",
                    "label": "Category",
                    "labelKey": "support.supportshared.category",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "requesterName",
                    "label": "Requester name",
                    "type": "text"
                  },
                  {
                    "key": "requesterEmail",
                    "label": "Requester email",
                    "type": "email"
                  },
                  {
                    "key": "assignedToName",
                    "label": "Assignee name",
                    "type": "text"
                  },
                  {
                    "key": "assignedToEmail",
                    "label": "Assignee email",
                    "type": "email"
                  }
                ],
                "titleKey": "support.mobile.actions.tickets.update.title"
              }
            ]
          },
          {
            "path": "/tickets/:id",
            "apiPath": "/api/support/tickets/:id",
            "title": "Ticket",
            "titleKey": "support.mobile.routes.tickets.detail.title",
            "template": "record.detail",
            "dataSource": "support.tickets.detail"
          },
          {
            "path": "/macros",
            "apiPath": "/api/support/macros",
            "title": "Macros",
            "titleKey": "support.mobile.routes.macros.title",
            "template": "record.list",
            "dataSource": "support.macros.list",
            "detailRoute": "/macros/:id",
            "actions": [
              {
                "id": "support.macros.create",
                "title": "Create macro",
                "type": "record.create",
                "permission": "macros:write",
                "method": "POST",
                "path": "/api/support/macros",
                "fields": [
                  {
                    "key": "title",
                    "label": "Title",
                    "labelKey": "support.supportshared.title",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "body",
                    "label": "Body",
                    "labelKey": "support.supportshared.body",
                    "type": "textarea",
                    "required": true
                  },
                  {
                    "key": "visibility",
                    "label": "Visibility",
                    "labelKey": "support.supportshared.visibility",
                    "type": "text",
                    "required": true
                  },
                  {
                    "key": "suggestedStatus",
                    "label": "Suggested status",
                    "labelKey": "support.supportshared.suggestedStatus",
                    "type": "text"
                  },
                  {
                    "key": "suggestedPriority",
                    "label": "Suggested priority",
                    "labelKey": "support.supportshared.suggestedPriority",
                    "type": "text"
                  }
                ],
                "titleKey": "support.mobile.actions.macros.create.title"
              }
            ]
          },
          {
            "path": "/macros/:id",
            "apiPath": "/api/support/macros/:id",
            "title": "Macro",
            "titleKey": "support.mobile.routes.macros.title",
            "template": "record.detail",
            "dataSource": "support.macros.detail"
          }
        ]
      }
    }
  ],
  "package_manifests": [],
  "deployment_configs": [],
  "source_signals": {
    "api_routes": [
      {
        "method": "ALL",
        "path": "*",
        "source_path": "apps/TopoloSupport/apps/api/src/worker.ts"
      }
    ],
    "ui_routes": [
      {
        "path": "/tickets",
        "source_path": "apps/TopoloSupport/apps/web/src/App.tsx"
      },
      {
        "path": "/tickets/new",
        "source_path": "apps/TopoloSupport/apps/web/src/App.tsx"
      },
      {
        "path": "/tickets/:ticketId",
        "source_path": "apps/TopoloSupport/apps/web/src/App.tsx"
      },
      {
        "path": "/operations",
        "source_path": "apps/TopoloSupport/apps/web/src/App.tsx"
      },
      {
        "path": "/macros",
        "source_path": "apps/TopoloSupport/apps/web/src/App.tsx"
      },
      {
        "path": "/getting-started",
        "source_path": "apps/TopoloSupport/apps/web/src/App.tsx"
      }
    ],
    "test_cases": [],
    "database_tables": []
  },
  "documentation": {
    "declared_paths": [
      "applications/support",
      "internal/apps/topolo-support"
    ],
    "present_paths": [
      "applications/support",
      "internal/apps/topolo-support"
    ],
    "missing_paths": [],
    "human_reference": "/systems/topolo-support",
    "machine_reference": "/machine/systems/topolo-support.json",
    "action_examples": 26,
    "action_schemas": 26
  },
  "source_findings": [
    {
      "type": "declared_unserved_actions",
      "source_path": "apps/TopoloSupport/topolo.app.json",
      "detail": [
        "GET /api/widget"
      ]
    },
    {
      "type": "action_coverage_configuration",
      "source_path": "apps/TopoloSupport/topolo.app.json",
      "detail": [
        "* /api/auth/*: exclusion matches no served route",
        "* /api/support/*: exclusion matches no served route"
      ]
    }
  ]
}