application · active
Topolo Brand
Canonical versioned brand identity, assets, voice, claims, CTAs, and validation for Topolo applications.
Documentation map
- Topolo Brand — Canonical versioned identity, voice, claims, CTA, and creative asset governance for Topolo applications.
- Topolo Design — Standalone brand-governed design workspace for static assets and short animated creative clips.
Authority and runtime
- System ID
topolo-brand- App IDs
- app_topolo_brand
- Owners
- marketing-platform
- Repositories
- apps/TopoloBrand
- Hosts
- https://brand.topolo.app, https://brand.stg.topolo.us, https://brand.topolo.dev
- Dependencies
- topolo-auth, topolo-notify, applications-packages
Security and data ownership
- Risk tier
- high
- Tenant isolation
- organization_scoped
- Privacy classification
- confidential
- Storage
- d1, r2
- Export and deletion
- implemented
- Enterprise ready
- yes
Source-derived capability inventory
Source revisions: apps/TopoloBrand@05fc4a7e6712bb2cfabb4adee7fd95ba5935c992
Declared actions: 29 · API routes: 9 · UI routes: 9
{
"id": "topolo-brand",
"name": "Topolo Brand",
"slug": "topolo-brand",
"kind": "application",
"visibility": "public",
"repo_paths": [
"apps/TopoloBrand"
],
"source_revisions": [
{
"source_path": "apps/TopoloBrand",
"repository": "apps/TopoloBrand",
"revision": "05fc4a7e6712bb2cfabb4adee7fd95ba5935c992",
"ref": "origin/staging"
}
],
"source_counts": {
"source_files": 64,
"test_files": 48,
"test_cases": 0,
"migration_files": 10,
"database_tables": 0,
"manifests": 1,
"deploy_targets": 2,
"actions": 29,
"mobile_contracts": 0,
"notifications": 6,
"package_manifests": 1,
"deployment_configs": 0
},
"manifests": [
{
"source_path": "apps/TopoloBrand/topolo.app.json",
"service_slug": "topolo-brand",
"name": "topolo-brand",
"app_id": "app_topolo_brand",
"compatibility_date": "2026-05-05",
"primary_target": null,
"environments": [
"development",
"production",
"staging"
],
"targets": [
{
"name": "api",
"kind": "worker",
"directory": "apps/api",
"main": "src/worker.ts",
"worker_name": "topolo-brand-api",
"subdomain": null,
"healthcheck_path": "/api/health",
"variable_names": [
"AUTH_BASE_URL",
"BRAND_APP_URL",
"NEXUS_GATEWAY_URL",
"TOPOLO_NOTIFY_URL"
],
"secret_names": [],
"bindings": [
{
"kind": "d1",
"binding": "BRAND_CONTROL_DB",
"target": null
},
{
"kind": "d1",
"binding": "BRAND_CONTENT_DB",
"target": null
},
{
"kind": "d1",
"binding": "BRAND_ASSETS_DB",
"target": null
},
{
"kind": "d1",
"binding": "BRAND_AUDIT_DB",
"target": null
},
{
"kind": "r2",
"binding": "BRAND_OBJECTS_BUCKET",
"target": null
}
]
},
{
"name": "web",
"kind": "worker",
"directory": "apps/web",
"main": "src/worker.ts",
"worker_name": "topolo-brand",
"subdomain": "brand",
"healthcheck_path": "/api/health",
"variable_names": [
"INSIGHTS_SITE_KEY"
],
"secret_names": [],
"bindings": [
{
"kind": "services",
"binding": "API",
"target": null
}
]
}
],
"notifications": [
"brand.asset.processing_failed",
"brand.binding.changed",
"brand.kit.deleted",
"brand.kit.retired",
"brand.version.published",
"brand.version.review_requested"
],
"notification_contract": {
"source_path": "topolo.notification-contracts.json",
"role": "producer",
"schema_version": 1,
"owner_app_id": "app_topolo_brand",
"events": [
{
"type": "brand.asset.processing_failed",
"version": 1,
"description": "A durable Brand asset upload attempt failed after registration.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"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
},
"surface": {
"const": "action"
},
"priority": {
"const": "high"
},
"severity": {
"const": "critical"
},
"category": {
"const": "brand"
},
"object_type": {
"const": "brand_asset"
},
"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"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Brand asset upload failed",
"body": "Primary logo could not be stored. Try the upload again.",
"surface": "action",
"priority": "high",
"severity": "critical",
"category": "brand",
"object_type": "brand_asset",
"object_id": "brand_asset_123",
"cta_url": "https://brand.stg.topolo.us/brand-kits/brand_123",
"cta_label": "Open brand kit",
"occurred_at": "2026-07-19T00:00:00.000Z"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^brand:brand\\.asset\\.processing_failed:brand_audit_"
}
},
{
"type": "brand.binding.changed",
"version": 1,
"description": "A durable Brand consumer-resource binding was created, changed, or removed.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"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
},
"surface": {
"const": "notification"
},
"priority": {
"const": "normal"
},
"severity": {
"const": "info"
},
"category": {
"const": "brand"
},
"object_type": {
"const": "brand_binding"
},
"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"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Brand binding changed",
"body": "A resource is now using a different brand kit.",
"surface": "notification",
"priority": "normal",
"severity": "info",
"category": "brand",
"object_type": "brand_binding",
"object_id": "brand_binding_123",
"cta_url": "https://brand.stg.topolo.us/bindings",
"cta_label": "View bindings",
"occurred_at": "2026-07-19T00:00:00.000Z"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^brand:brand\\.binding\\.changed:brand_audit_"
}
},
{
"type": "brand.kit.deleted",
"version": 1,
"description": "A Brand kit was permanently deleted, with its drafts, governed asset bytes and audit trail.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"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
},
"surface": {
"const": "notification"
},
"priority": {
"const": "high"
},
"severity": {
"const": "warning"
},
"category": {
"const": "brand"
},
"object_type": {
"const": "brand_kit"
},
"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"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Brand kit deleted",
"body": "Topolo was permanently deleted. This cannot be undone.",
"surface": "notification",
"priority": "high",
"severity": "warning",
"category": "brand",
"object_type": "brand_kit",
"object_id": "brand_123",
"cta_url": "https://brand.stg.topolo.us/brand-kits",
"cta_label": "View Brand Kits",
"occurred_at": "2026-08-01T00:00:00.000Z"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^brand:brand\\.kit\\.deleted:brand_audit_"
}
},
{
"type": "brand.kit.retired",
"version": 1,
"description": "A durable active Brand kit was retired.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"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
},
"surface": {
"const": "notification"
},
"priority": {
"const": "normal"
},
"severity": {
"const": "warning"
},
"category": {
"const": "brand"
},
"object_type": {
"const": "brand_kit"
},
"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"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Brand kit retired",
"body": "Topolo is no longer available to connected products.",
"surface": "notification",
"priority": "normal",
"severity": "warning",
"category": "brand",
"object_type": "brand_kit",
"object_id": "brand_123",
"cta_url": "https://brand.stg.topolo.us/brand-kits/brand_123",
"cta_label": "Open brand kit",
"occurred_at": "2026-07-19T00:00:00.000Z"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^brand:brand\\.kit\\.retired:brand_audit_"
}
},
{
"type": "brand.version.published",
"version": 1,
"description": "A durable Brand kit version became the published version.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"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
},
"surface": {
"const": "notification"
},
"priority": {
"const": "normal"
},
"severity": {
"const": "success"
},
"category": {
"const": "brand"
},
"object_type": {
"const": "brand_version"
},
"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"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Brand version published",
"body": "The new brand version is now available to connected products.",
"surface": "notification",
"priority": "normal",
"severity": "success",
"category": "brand",
"object_type": "brand_version",
"object_id": "brand_version_123",
"cta_url": "https://brand.stg.topolo.us/brand-kits/brand_123",
"cta_label": "View published version",
"occurred_at": "2026-07-19T00:00:00.000Z"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^brand:brand\\.version\\.published:brand_audit_"
}
},
{
"type": "brand.version.review_requested",
"version": 1,
"description": "A durable Brand version review request was assigned to an organization member.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"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
},
"surface": {
"const": "action"
},
"priority": {
"const": "high"
},
"severity": {
"const": "info"
},
"category": {
"const": "brand"
},
"object_type": {
"const": "brand_version"
},
"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"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Brand review requested",
"body": "A teammate requested your review of a brand version.",
"surface": "action",
"priority": "high",
"severity": "info",
"category": "brand",
"object_type": "brand_version",
"object_id": "brand_version_123",
"cta_url": "https://brand.stg.topolo.us/brand-kits/brand_123",
"cta_label": "Review version",
"occurred_at": "2026-07-19T00:00:00.000Z"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^brand:brand\\.version\\.review_requested:brand_audit_"
}
}
]
},
"actions": [
{
"name": "widget.get",
"title": "Get widget summary",
"description": "Get the TopoloOne widget summary.",
"method": "GET",
"path": "/api/widget",
"permission": "workspace: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-brand --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": "implemented",
"route_key": "GET /api/widget",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspace.bootstrap",
"title": "Get workspace bootstrap",
"description": "Get the signed workspace bootstrap.",
"method": "GET",
"path": "/api/bootstrap",
"permission": "workspace: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-brand --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/bootstrap",
"body": null
},
"effects": "Reads state through GET /api/bootstrap 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/bootstrap",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspaces.delete",
"title": "Delete workspace",
"description": "Delete an empty, non-default Brand workspace.",
"method": "DELETE",
"path": "/api/workspaces/{workspaceId}",
"permission": "workspace:delete",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspaceId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspaceId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/workspaces/example",
"body": null
},
"effects": "May change state through DELETE /api/workspaces/{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/workspaces/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "privacy.export",
"title": "Export workspace privacy data",
"description": "Export all Brand records and authenticated asset download paths owned by the selected workspace.",
"method": "GET",
"path": "/api/privacy/export",
"permission": "brand: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-brand --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/privacy/export",
"body": null
},
"effects": "Reads state through GET /api/privacy/export 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/privacy/export",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "privacy.delete",
"title": "Erase workspace privacy data",
"description": "Erase all Brand records and asset bytes owned by the selected workspace.",
"method": "DELETE",
"path": "/api/privacy",
"permission": "workspace:delete",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-brand --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/privacy",
"body": null
},
"effects": "May change state through DELETE /api/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/privacy",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "retention.run",
"title": "Run Brand retention",
"description": "Pseudonymize expired actor identity and purge expired archived asset bytes.",
"method": "POST",
"path": "/api/privacy/retention",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-brand --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/privacy/retention",
"body": {}
},
"effects": "May change state through POST /api/privacy/retention. 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/privacy/retention",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kits.list",
"title": "List brand kits",
"description": "List canonical brand kits for the organization.",
"method": "GET",
"path": "/api/brand-kits",
"permission": "brand: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-brand --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/brand-kits",
"body": null
},
"effects": "Reads state through GET /api/brand-kits 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/brand-kits",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kits.get",
"title": "Get brand kit",
"description": "Get one canonical brand kit.",
"method": "GET",
"path": "/api/brand-kits/{id}",
"permission": "brand:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/brand-kits/{id} 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/brand-kits/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kits.create",
"title": "Create brand kit",
"description": "Create a canonical brand kit.",
"method": "POST",
"path": "/api/brand-kits",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"slug": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
}
},
"required": [
"name",
"slug"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"name": "example",
"slug": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits",
"body": {
"name": "example",
"slug": "example"
}
},
"effects": "May change state through POST /api/brand-kits. 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/brand-kits",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kits.update",
"title": "Update brand kit",
"description": "Update brand kit metadata.",
"method": "PATCH",
"path": "/api/brand-kits/{id}",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PATCH /api/brand-kits/{id}. 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/brand-kits/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kits.delete",
"title": "Delete brand kit",
"description": "Permanently delete a Brand kit that was never published and has no connections, including its governed asset bytes. Refused with 409 otherwise — retire instead.",
"method": "DELETE",
"path": "/api/brand-kits/{id}",
"permission": "brand:delete",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/brand-kits/{id}. 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/brand-kits/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kits.retire",
"title": "Retire brand kit",
"description": "Retire a brand kit and stop new resolution.",
"method": "POST",
"path": "/api/brand-kits/{id}/retire",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/00000000-0000-4000-8000-000000000000/retire",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/brand-kits/{id}/retire. 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/brand-kits/*/retire",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kit_versions.list",
"title": "List brand versions",
"description": "List immutable and draft versions for a brand kit.",
"method": "GET",
"path": "/api/brand-kits/{brandKitId}/versions",
"permission": "brand:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
}
},
"required": [
"brandKitId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"brandKitId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/versions",
"body": null
},
"effects": "Reads state through GET /api/brand-kits/{brandKitId}/versions 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/brand-kits/*/versions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kit_versions.get",
"title": "Get brand version",
"description": "Get an exact brand kit version.",
"method": "GET",
"path": "/api/brand-kits/{brandKitId}/versions/{versionId}",
"permission": "brand:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"versionId": {
"type": "string",
"minLength": 1
}
},
"required": [
"brandKitId",
"versionId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"brandKitId": "example",
"versionId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/versions/example",
"body": null
},
"effects": "Reads state through GET /api/brand-kits/{brandKitId}/versions/{versionId} 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/brand-kits/*/versions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kit_versions.create",
"title": "Create brand version",
"description": "Create a draft versioned brand snapshot.",
"method": "POST",
"path": "/api/brand-kits/{brandKitId}/versions",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"snapshot": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"changeNote": {
"type": "string"
}
},
"required": [
"brandKitId",
"snapshot"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"brandKitId": "example",
"snapshot": {}
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/versions",
"body": {
"brandKitId": "example",
"snapshot": {}
}
},
"effects": "May change state through POST /api/brand-kits/{brandKitId}/versions. 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/brand-kits/*/versions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kit_versions.update",
"title": "Update draft brand version",
"description": "Update a draft version before publishing.",
"method": "PATCH",
"path": "/api/brand-kits/{brandKitId}/versions/{versionId}",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"versionId": {
"type": "string",
"minLength": 1
},
"snapshot": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"changeNote": {
"type": "string"
}
},
"required": [
"brandKitId",
"versionId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"brandKitId": "example",
"versionId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/versions/example",
"body": {
"brandKitId": "example",
"versionId": "example"
}
},
"effects": "May change state through PATCH /api/brand-kits/{brandKitId}/versions/{versionId}. 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/brand-kits/*/versions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kit_versions.publish",
"title": "Publish brand version",
"description": "Publish an immutable brand snapshot for consumers. Refused with 422 and the failing issues when the snapshot breaks its own governance rules — an unresolved logo reference, or a palette below the brand’s declared minimum contrast.",
"method": "POST",
"path": "/api/brand-kits/{brandKitId}/versions/{versionId}/publish",
"permission": "brand:publish",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"versionId": {
"type": "string",
"minLength": 1
}
},
"required": [
"brandKitId",
"versionId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"brandKitId": "example",
"versionId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/versions/example/publish",
"body": {
"brandKitId": "example",
"versionId": "example"
}
},
"effects": "May change state through POST /api/brand-kits/{brandKitId}/versions/{versionId}/publish. 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/brand-kits/*/versions/*/publish",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kit_versions.discard",
"title": "Discard brand draft",
"description": "Delete a working draft that was started and not wanted. Published and retired versions are immutable and cannot be discarded.",
"method": "DELETE",
"path": "/api/brand-kits/{brandKitId}/versions/{versionId}",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"versionId": {
"type": "string",
"minLength": 1
}
},
"required": [
"brandKitId",
"versionId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"brandKitId": "example",
"versionId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/versions/example",
"body": null
},
"effects": "May change state through DELETE /api/brand-kits/{brandKitId}/versions/{versionId}. 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/brand-kits/*/versions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kit_versions.restore",
"title": "Restore brand version",
"description": "Copy an earlier version’s snapshot into the working draft. The earlier version is never revived — published versions are immutable and consumers recorded their ids — so this produces an ordinary draft to review and publish.",
"method": "POST",
"path": "/api/brand-kits/{brandKitId}/versions/{versionId}/restore",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"versionId": {
"type": "string",
"minLength": 1
}
},
"required": [
"brandKitId",
"versionId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"brandKitId": "example",
"versionId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/versions/example/restore",
"body": {
"brandKitId": "example",
"versionId": "example"
}
},
"effects": "May change state through POST /api/brand-kits/{brandKitId}/versions/{versionId}/restore. 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/brand-kits/*/versions/*/restore",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kit_versions.request_review",
"title": "Request brand version review",
"description": "Assign a draft brand version to an organization member for review.",
"method": "POST",
"path": "/api/brand-kits/{brandKitId}/versions/{versionId}/review",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"versionId": {
"type": "string",
"minLength": 1
},
"reviewerUserId": {
"type": "string",
"minLength": 1
}
},
"required": [
"brandKitId",
"versionId",
"reviewerUserId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"brandKitId": "example",
"versionId": "example",
"reviewerUserId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/versions/example/review",
"body": {
"brandKitId": "example",
"versionId": "example",
"reviewerUserId": "example"
}
},
"effects": "May change state through POST /api/brand-kits/{brandKitId}/versions/{versionId}/review. 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/brand-kits/*/versions/*/review",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_bindings.list",
"title": "List brand bindings",
"description": "List consumer resources bound to brand kits.",
"method": "GET",
"path": "/api/brand-bindings",
"permission": "brand: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-brand --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/brand-bindings",
"body": null
},
"effects": "Reads state through GET /api/brand-bindings 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/brand-bindings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_bindings.upsert",
"title": "Bind consumer resource",
"description": "Bind an app resource to a canonical brand kit.",
"method": "PUT",
"path": "/api/brand-bindings",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"consumerAppId": {
"type": "string",
"minLength": 1
},
"externalResourceType": {
"type": "string",
"minLength": 1
},
"externalResourceId": {
"type": "string",
"minLength": 1
},
"brandKitId": {
"type": "string",
"minLength": 1
}
},
"required": [
"consumerAppId",
"externalResourceType",
"externalResourceId",
"brandKitId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"consumerAppId": "example",
"externalResourceType": "example",
"externalResourceId": "example",
"brandKitId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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": "PUT",
"path": "/api/brand-bindings",
"body": {
"consumerAppId": "example",
"externalResourceType": "example",
"externalResourceId": "example",
"brandKitId": "example"
}
},
"effects": "May change state through PUT /api/brand-bindings. 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": "PUT /api/brand-bindings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_bindings.delete",
"title": "Delete brand binding",
"description": "Remove a consumer resource brand binding.",
"method": "DELETE",
"path": "/api/brand-bindings/{id}",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-bindings/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/brand-bindings/{id}. 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/brand-bindings/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kits.resolve",
"title": "Resolve brand kit",
"description": "Resolve the exact published brand version for a kit or consumer resource.",
"method": "POST",
"path": "/api/brand-kits:resolve",
"permission": "brand:read",
"authorizationMode": "runtime",
"allowedServices": [
"topolo-design",
"topolo-social-studio",
"topolo-socialize"
],
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"consumerAppId": {
"type": "string",
"minLength": 1
},
"externalResourceType": {
"type": "string",
"minLength": 1
},
"externalResourceId": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"brandKitId": "example",
"consumerAppId": "example",
"externalResourceType": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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": "POST",
"path": "/api/brand-kits:resolve",
"body": {
"brandKitId": "example",
"consumerAppId": "example",
"externalResourceType": "example"
}
},
"effects": "Reads state through POST /api/brand-kits:resolve 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": "POST /api/brand-kits:resolve",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_kits.validate",
"title": "Validate branded content",
"description": "Check content, claims, CTAs, assets, and channel restrictions against a brand snapshot, plus the snapshot’s own logo references and palette contrast.",
"method": "POST",
"path": "/api/brand-kits:validate",
"permission": "brand:read",
"authorizationMode": "runtime",
"allowedServices": [
"topolo-social-studio",
"topolo-socialize"
],
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"snapshot": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"text": {
"type": "string"
},
"channel": {
"type": "string",
"minLength": 1
},
"ctaId": {
"type": "string",
"minLength": 1
},
"claimIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"assetIds": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"snapshot",
"text"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"snapshot": {},
"text": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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": "POST",
"path": "/api/brand-kits:validate",
"body": {
"snapshot": {},
"text": "example"
}
},
"effects": "Reads state through POST /api/brand-kits:validate 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": "POST /api/brand-kits:validate",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_assets.list",
"title": "List brand assets",
"description": "List registered logos, fonts, media, and templates for a kit.",
"method": "GET",
"path": "/api/brand-kits/{brandKitId}/assets",
"permission": "brand:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
}
},
"required": [
"brandKitId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"brandKitId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-kits/example/assets",
"body": null
},
"effects": "Reads state through GET /api/brand-kits/{brandKitId}/assets 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/brand-kits/*/assets",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_assets.register",
"title": "Register brand asset",
"description": "Register an asset before uploading its content.",
"method": "POST",
"path": "/api/brand-assets",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brandKitId": {
"type": "string",
"minLength": 1
},
"kind": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"mimeType": {
"type": "string",
"minLength": 1
},
"license": {
"type": "string",
"minLength": 1
},
"altText": {
"type": "string",
"minLength": 1
}
},
"required": [
"brandKitId",
"kind",
"name",
"mimeType"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"brandKitId": "example",
"kind": "example",
"name": "example",
"mimeType": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-assets",
"body": {
"brandKitId": "example",
"kind": "example",
"name": "example",
"mimeType": "example"
}
},
"effects": "May change state through POST /api/brand-assets. 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/brand-assets",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_assets.upload",
"title": "Upload brand asset content",
"description": "Upload base64-encoded content into a registered Brand asset.",
"method": "PUT",
"path": "/api/brand-assets/{assetId}/content",
"permission": "brand:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"assetId": {
"type": "string",
"minLength": 1
},
"contentBase64": {
"type": "string",
"minLength": 1,
"pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"
},
"contentType": {
"type": "string",
"minLength": 1
},
"fileName": {
"type": "string",
"minLength": 1
}
},
"required": [
"assetId",
"contentBase64",
"contentType",
"fileName"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"agentContract": {
"upload": {
"profile": "inline-base64",
"contentField": "contentBase64",
"contentTypeField": "contentType",
"fileNameField": "fileName",
"maxBytes": 26214400,
"acceptedContentTypes": [
"*/*"
]
}
},
"documentation": {
"example_input": {
"assetId": "example",
"contentBase64": "/example",
"contentType": "example",
"fileName": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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": "PUT",
"path": "/api/brand-assets/example/content",
"body": {
"assetId": "example",
"contentBase64": "/example",
"contentType": "example",
"fileName": "example"
}
},
"effects": "May change state through PUT /api/brand-assets/{assetId}/content. 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": "PUT /api/brand-assets/*/content",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "brand_assets.download",
"title": "Download brand asset content",
"description": "Read authenticated Brand asset bytes for an allowed organization-bound consumer.",
"method": "GET",
"path": "/api/brand-assets/{assetId}/content",
"permission": "brand:read",
"authorizationMode": "runtime",
"allowedServices": [
"topolo-design",
"topolo-social-studio",
"topolo-socialize"
],
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"assetId": {
"type": "string",
"minLength": 1
}
},
"required": [
"assetId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"properties": {
"contentType": {
"type": "string",
"minLength": 1
},
"contentLength": {
"type": "integer",
"minimum": 0
},
"contentBase64": {
"type": "string"
}
},
"required": [
"contentType",
"contentLength",
"contentBase64"
],
"additionalProperties": false
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"assetId": "example"
},
"cli_example": [
"topolo actions --service topolo-brand --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/brand-assets/example/content",
"body": null
},
"effects": "Reads state through GET /api/brand-assets/{assetId}/content 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/brand-assets/*/content",
"evidence": "Matched to a served route extracted from canonical staging source."
}
}
],
"action_coverage": {
"status": "ok",
"served_routes": 33,
"matched_actions": 29,
"declared_unserved_actions": [],
"coverage_excluded_actions": [],
"uncatalogued_routes": [
{
"key": "DELETE /api/brand-bindings",
"method": "DELETE",
"path": "/api/brand-bindings",
"source": "apps/api/src/brand-routes.ts",
"target": "api"
}
],
"ignored_routes": 3,
"configured_exclusions": 1,
"configuration_findings": [],
"notes": [
"22 manually-declared route(s)"
]
},
"runtime_contract_audit": {
"status": "verified",
"actions": 29,
"contracts": 29,
"contract_module": "topolo.action-contracts.mjs",
"validator_sources": [
"apps/api/src/worker.ts"
],
"authorization_sources": [
"apps/api/src/worker.ts"
],
"findings": []
}
}
],
"mobile_contracts": [],
"package_manifests": [],
"deployment_configs": [],
"source_signals": {
"api_routes": [
{
"method": "ALL",
"path": "*",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/health",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/app-identity",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/widget",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/bootstrap",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/privacy/export",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/privacy",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/privacy/retention",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/workspaces",
"source_path": "apps/TopoloBrand/apps/api/src/worker.ts"
}
],
"ui_routes": [
{
"path": "/dashboard",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
},
{
"path": "/brand-kits",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
},
{
"path": "/brand-kits/:kitId/:section?",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
},
{
"path": "/assets",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
},
{
"path": "/publishing",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
},
{
"path": "/connections",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
},
{
"path": "/getting-started",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
},
{
"path": "/settings",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
},
{
"path": "/settings/:section",
"source_path": "apps/TopoloBrand/apps/web/src/App.tsx"
}
],
"test_cases": [],
"database_tables": []
},
"documentation": {
"declared_paths": [
"applications/brand",
"internal/apps/topolo-brand"
],
"present_paths": [
"applications/brand",
"internal/apps/topolo-brand"
],
"missing_paths": [],
"human_reference": "/systems/topolo-brand",
"machine_reference": "/machine/systems/topolo-brand.json",
"action_examples": 29,
"action_schemas": 29
},
"source_findings": [
{
"type": "uncatalogued_routes",
"source_path": "apps/TopoloBrand/topolo.app.json",
"detail": [
{
"key": "DELETE /api/brand-bindings",
"method": "DELETE",
"path": "/api/brand-bindings",
"source": "apps/api/src/brand-routes.ts",
"target": "api"
}
]
}
]
}