Topolo Docs Topolo Platform
Open workspace

Validate branded content

Validate content and snapshot governance against a supplied Brand snapshot.

Outcome

Validate content and snapshot governance against a supplied Brand snapshot.

Before you start

  • Verify whoami and the pinned credential context, then inspect the exact discovered action before preparing input.
  • Discover a granted Brand workspace. Pass its resourceType/workspace identifier separately from input; a copied fixture identifier grants no access.
  • The declared permission is brand:read. The active credential, application scope, resource binding and runtime authority must all authorize the request.

Discover the target

topolo whoami --json
topolo actions get app_topolo_brand.brand_kits.validate --detail --json
topolo resources topolo-brand --json
topolo workspaces list topolo-brand --json

Request

POST /api/brand-kits:validate

Resource context is the selected Brand workspace. CLI/SDK action input includes path identifiers; direct HTTP JSON bodies exclude path parameters. Read the reviewed plan for the exact request.

Input fields

FieldRequiredMeaning
snapshotYesComplete typed Brand snapshot. When updating a draft this replaces the entire snapshot; it is not a partial patch.
textConditional/optionalText to validate against the snapshot, including terminology, claims and channel rules. Omitted text is treated as empty.
channelConditional/optionalOptional channel used to evaluate claim and CTA restrictions.
ctaIdConditional/optionalOptional CTA identifier from snapshot.ctas; validation checks its status and channel restrictions.
claimIdsConditional/optionalClaim identifiers from snapshot.claims to validate for the content.
assetIdsConditional/optionalAsset identifiers from snapshot.assets to validate for the content.

Exact published input schema:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "snapshot": {
      "type": "object",
      "properties": {
        "identity": {
          "type": "object",
          "properties": {
            "displayName": {
              "type": "string",
              "minLength": 1
            },
            "legalName": {
              "type": "string",
              "minLength": 1
            },
            "shortDescription": {
              "type": "string",
              "minLength": 1
            },
            "domains": {
              "default": [],
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            },
            "locales": {
              "default": [
                "en"
              ],
              "minItems": 1,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            }
          },
          "required": [
            "displayName",
            "shortDescription",
            "domains",
            "locales"
          ],
          "additionalProperties": false
        },
        "visual": {
          "type": "object",
          "properties": {
            "logos": {
              "type": "object",
              "properties": {
                "primaryAssetId": {
                  "type": "string",
                  "minLength": 1
                },
                "reversedAssetId": {
                  "type": "string",
                  "minLength": 1
                },
                "markAssetId": {
                  "type": "string",
                  "minLength": 1
                },
                "markReversedAssetId": {
                  "type": "string",
                  "minLength": 1
                },
                "lockupAssetId": {
                  "type": "string",
                  "minLength": 1
                },
                "minimumClearSpace": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "additionalProperties": false
            },
            "palette": {
              "type": "object",
              "properties": {
                "primary": {
                  "type": "string",
                  "pattern": "^#[0-9a-fA-F]{6}$"
                },
                "secondary": {
                  "type": "string",
                  "pattern": "^#[0-9a-fA-F]{6}$"
                },
                "accent": {
                  "type": "string",
                  "pattern": "^#[0-9a-fA-F]{6}$"
                },
                "background": {
                  "type": "string",
                  "pattern": "^#[0-9a-fA-F]{6}$"
                },
                "foreground": {
                  "type": "string",
                  "pattern": "^#[0-9a-fA-F]{6}$"
                },
                "semantic": {
                  "default": {},
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "string",
                    "pattern": "^#[0-9a-fA-F]{6}$"
                  }
                },
                "dark": {
                  "type": "object",
                  "properties": {
                    "primary": {
                      "type": "string",
                      "pattern": "^#[0-9a-fA-F]{6}$"
                    },
                    "secondary": {
                      "type": "string",
                      "pattern": "^#[0-9a-fA-F]{6}$"
                    },
                    "accent": {
                      "type": "string",
                      "pattern": "^#[0-9a-fA-F]{6}$"
                    },
                    "background": {
                      "type": "string",
                      "pattern": "^#[0-9a-fA-F]{6}$"
                    },
                    "foreground": {
                      "type": "string",
                      "pattern": "^#[0-9a-fA-F]{6}$"
                    }
                  },
                  "required": [
                    "primary",
                    "secondary",
                    "accent",
                    "background",
                    "foreground"
                  ],
                  "additionalProperties": false
                }
              },
              "required": [
                "primary",
                "secondary",
                "accent",
                "background",
                "foreground",
                "semantic"
              ],
              "additionalProperties": false
            },
            "typography": {
              "type": "object",
              "properties": {
                "heading": {
                  "type": "object",
                  "properties": {
                    "family": {
                      "type": "string",
                      "minLength": 1
                    },
                    "weights": {
                      "minItems": 1,
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": 100,
                        "maximum": 900
                      }
                    },
                    "fallback": {
                      "default": [],
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1
                      }
                    },
                    "assetId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "license": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "family",
                    "weights",
                    "fallback"
                  ],
                  "additionalProperties": false
                },
                "body": {
                  "type": "object",
                  "properties": {
                    "family": {
                      "type": "string",
                      "minLength": 1
                    },
                    "weights": {
                      "minItems": 1,
                      "type": "array",
                      "items": {
                        "type": "integer",
                        "minimum": 100,
                        "maximum": 900
                      }
                    },
                    "fallback": {
                      "default": [],
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1
                      }
                    },
                    "assetId": {
                      "type": "string",
                      "minLength": 1
                    },
                    "license": {
                      "type": "string",
                      "minLength": 1
                    }
                  },
                  "required": [
                    "family",
                    "weights",
                    "fallback"
                  ],
                  "additionalProperties": false
                }
              },
              "required": [
                "heading",
                "body"
              ],
              "additionalProperties": false
            },
            "layout": {
              "type": "object",
              "properties": {
                "radius": {
                  "default": 16,
                  "type": "number",
                  "minimum": 0,
                  "maximum": 64
                },
                "spacingScale": {
                  "minItems": 3,
                  "type": "array",
                  "items": {
                    "type": "number",
                    "exclusiveMinimum": 0
                  }
                },
                "logoPlacement": {
                  "default": "top-left",
                  "type": "string",
                  "enum": [
                    "top-left",
                    "top-right",
                    "bottom-left",
                    "bottom-right"
                  ]
                }
              },
              "required": [
                "radius",
                "spacingScale",
                "logoPlacement"
              ],
              "additionalProperties": false
            },
            "imagery": {
              "type": "object",
              "properties": {
                "direction": {
                  "type": "string",
                  "minLength": 1
                },
                "avoid": {
                  "default": [],
                  "type": "array",
                  "items": {
                    "type": "string",
                    "minLength": 1
                  }
                }
              },
              "required": [
                "direction",
                "avoid"
              ],
              "additionalProperties": false
            },
            "iconography": {
              "type": "string",
              "minLength": 1
            },
            "motion": {
              "type": "string",
              "minLength": 1
            }
          },
          "required": [
            "logos",
            "palette",
            "typography",
            "layout",
            "imagery"
          ],
          "additionalProperties": false
        },
        "verbal": {
          "type": "object",
          "properties": {
            "positioning": {
              "type": "string",
              "minLength": 1
            },
            "audiences": {
              "minItems": 1,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            },
            "valuePropositions": {
              "minItems": 1,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            },
            "tone": {
              "minItems": 1,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            },
            "do": {
              "default": [],
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            },
            "dont": {
              "default": [],
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            },
            "bannedTerms": {
              "default": [],
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            }
          },
          "required": [
            "positioning",
            "audiences",
            "valuePropositions",
            "tone",
            "do",
            "dont",
            "bannedTerms"
          ],
          "additionalProperties": false
        },
        "claims": {
          "default": [],
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              },
              "text": {
                "type": "string",
                "minLength": 1
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "approved",
                  "restricted",
                  "retired"
                ]
              },
              "source": {
                "type": "string",
                "minLength": 1
              },
              "qualifier": {
                "type": "string",
                "minLength": 1
              },
              "regions": {
                "default": [],
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "channels": {
                "default": [],
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "validFrom": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              "validUntil": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              }
            },
            "required": [
              "id",
              "text",
              "status",
              "regions",
              "channels"
            ],
            "additionalProperties": false
          }
        },
        "ctas": {
          "default": [],
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              },
              "label": {
                "type": "string",
                "minLength": 1
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "status": {
                "type": "string",
                "enum": [
                  "draft",
                  "approved",
                  "retired"
                ]
              },
              "channels": {
                "default": [],
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1
                }
              },
              "tracking": {
                "default": {},
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "id",
              "label",
              "url",
              "status",
              "channels",
              "tracking"
            ],
            "additionalProperties": false
          }
        },
        "assets": {
          "default": [],
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              },
              "kind": {
                "type": "string",
                "enum": [
                  "logo",
                  "font",
                  "image",
                  "icon",
                  "motion",
                  "audio",
                  "template"
                ]
              },
              "name": {
                "type": "string",
                "minLength": 1
              },
              "url": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri"
                  },
                  {
                    "type": "string",
                    "pattern": "^\\/[^\\s]*$"
                  }
                ]
              },
              "mimeType": {
                "type": "string",
                "minLength": 1
              },
              "license": {
                "type": "string",
                "minLength": 1
              },
              "altText": {
                "type": "string",
                "minLength": 1
              }
            },
            "required": [
              "id",
              "kind",
              "name",
              "url"
            ],
            "additionalProperties": false
          }
        },
        "accessibility": {
          "type": "object",
          "properties": {
            "minimumContrast": {
              "default": 4.5,
              "type": "number",
              "minimum": 1,
              "maximum": 21
            },
            "requireAltText": {
              "default": true,
              "type": "boolean"
            },
            "reducedMotion": {
              "default": true,
              "type": "boolean"
            }
          },
          "required": [
            "minimumContrast",
            "requireAltText",
            "reducedMotion"
          ],
          "additionalProperties": false
        },
        "legal": {
          "type": "object",
          "properties": {
            "requiredDisclosures": {
              "default": [],
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            },
            "prohibitedTopics": {
              "default": [],
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              }
            }
          },
          "required": [
            "requiredDisclosures",
            "prohibitedTopics"
          ],
          "additionalProperties": false
        },
        "communications": {
          "type": "object",
          "properties": {
            "emailLogoAssetId": {
              "type": "string",
              "minLength": 1
            },
            "senderDisplayName": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120,
              "pattern": "^[^\\u0000-\\u001f\\u007f<>\"]+$"
            },
            "replyToAddress": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "supportAddress": {
              "type": "string",
              "maxLength": 254,
              "format": "email",
              "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
            },
            "legalFooter": {
              "type": "object",
              "properties": {
                "entityName": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                "registeredAddress": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 500
                },
                "companyNumber": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                }
              },
              "additionalProperties": false
            },
            "unsubscribeText": {
              "type": "string",
              "minLength": 1,
              "maxLength": 300
            },
            "footerText": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1000
            }
          },
          "additionalProperties": false
        }
      },
      "required": [
        "identity",
        "visual",
        "verbal",
        "claims",
        "ctas",
        "assets",
        "accessibility",
        "legal"
      ],
      "additionalProperties": false,
      "description": "Complete typed Brand snapshot. When updating a draft this replaces the entire snapshot; it is not a partial patch."
    },
    "text": {
      "type": "string",
      "description": "Text to validate against the snapshot, including terminology, claims and channel rules. Omitted text is treated as empty."
    },
    "channel": {
      "type": "string",
      "minLength": 1,
      "description": "Optional channel used to evaluate claim and CTA restrictions."
    },
    "ctaId": {
      "type": "string",
      "minLength": 1,
      "description": "Optional CTA identifier from snapshot.ctas; validation checks its status and channel restrictions."
    },
    "claimIds": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "description": "Claim identifiers from snapshot.claims to validate for the content."
    },
    "assetIds": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "description": "Asset identifiers from snapshot.assets to validate for the content."
    }
  },
  "required": [
    "snapshot"
  ],
  "additionalProperties": false
}

Effects

Evaluates snapshot logo references, email-logo format and palette contrast plus content terminology, claim, CTA, asset and channel constraints without publishing or changing records.

Interpret the response

valid is determined by error-level issues; warnings remain separately counted. HTTP 200 with valid:false is a completed negative validation. This checks the supplied snapshot, not proof of its publication or consumer selection.

Response identifier contract:

{
  "kind": "brand_kits_validate",
  "identifierSource": "none",
  "explanation": "valid is determined by error-level issues; warnings remain separately counted. HTTP 200 with valid:false is a completed negative validation. This checks the supplied snapshot, not proof of its publication or consumer selection."
}

Worked examples

These complete synthetic responses were captured from the local worker over canonical SQL migrations. Auth and R2 dependencies are simulated; notification delivery is not exercised. Set BRAND_WORKSPACE_ID from granted workspace discovery. Save reviewed input as payload.json, validate and inspect the unchanged plan. The final mutation command and MCP confirm flag assume the intended effect has already been authorized.

Minimal example

Input · payload.json:

{
  "snapshot": {
    "identity": {
      "displayName": "Fixture identity",
      "shortDescription": "The next generation of software.",
      "domains": [
        "topolo.io"
      ],
      "locales": [
        "en"
      ]
    },
    "visual": {
      "logos": {
        "primaryAssetId": "brand_asset_dd192c95-76da-4c2e-a61c-8b164686806b"
      },
      "palette": {
        "primary": "#111827",
        "secondary": "#E5E7EB",
        "accent": "#F97316",
        "background": "#FFFFFF",
        "foreground": "#111827",
        "semantic": {}
      },
      "typography": {
        "heading": {
          "family": "Inter",
          "weights": [
            700
          ],
          "fallback": [
            "sans-serif"
          ]
        },
        "body": {
          "family": "Inter",
          "weights": [
            400,
            600
          ],
          "fallback": [
            "sans-serif"
          ]
        }
      },
      "layout": {
        "radius": 16,
        "spacingScale": [
          4,
          8,
          16
        ],
        "logoPlacement": "top-left"
      },
      "imagery": {
        "direction": "Bold, graphic, product-led.",
        "avoid": [
          "generic stock photography"
        ]
      }
    },
    "verbal": {
      "positioning": "Enterprise-grade software without enterprise-era waste.",
      "audiences": [
        "small businesses"
      ],
      "valuePropositions": [
        "One connected software ecosystem"
      ],
      "tone": [
        "bold",
        "direct"
      ],
      "do": [
        "Use specific proof"
      ],
      "dont": [
        "Use unsupported superlatives"
      ],
      "bannedTerms": [
        "guaranteed riches"
      ]
    },
    "claims": [],
    "ctas": [],
    "assets": [
      {
        "id": "brand_asset_dd192c95-76da-4c2e-a61c-8b164686806b",
        "kind": "logo",
        "name": "Fixture logo",
        "url": "/api/brand-assets/brand_asset_dd192c95-76da-4c2e-a61c-8b164686806b/content",
        "mimeType": "image/svg+xml"
      }
    ],
    "accessibility": {
      "minimumContrast": 4.5,
      "requireAltText": true,
      "reducedMotion": true
    },
    "legal": {
      "requiredDisclosures": [],
      "prohibitedTopics": []
    }
  },
  "text": "A clear fixture message"
}

CLI:

topolo actions validate app_topolo_brand.brand_kits.validate --data @payload.json --json
topolo actions plan app_topolo_brand.brand_kits.validate --resource-type workspace --resource-id "$BRAND_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_brand.brand_kits.validate --resource-type workspace --resource-id "$BRAND_WORKSPACE_ID" --data @payload.json --json

MCP tool and arguments:

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_brand.brand_kits.validate",
    "input": {
      "snapshot": {
        "identity": {
          "displayName": "Fixture identity",
          "shortDescription": "The next generation of software.",
          "domains": [
            "topolo.io"
          ],
          "locales": [
            "en"
          ]
        },
        "visual": {
          "logos": {
            "primaryAssetId": "brand_asset_dd192c95-76da-4c2e-a61c-8b164686806b"
          },
          "palette": {
            "primary": "#111827",
            "secondary": "#E5E7EB",
            "accent": "#F97316",
            "background": "#FFFFFF",
            "foreground": "#111827",
            "semantic": {}
          },
          "typography": {
            "heading": {
              "family": "Inter",
              "weights": [
                700
              ],
              "fallback": [
                "sans-serif"
              ]
            },
            "body": {
              "family": "Inter",
              "weights": [
                400,
                600
              ],
              "fallback": [
                "sans-serif"
              ]
            }
          },
          "layout": {
            "radius": 16,
            "spacingScale": [
              4,
              8,
              16
            ],
            "logoPlacement": "top-left"
          },
          "imagery": {
            "direction": "Bold, graphic, product-led.",
            "avoid": [
              "generic stock photography"
            ]
          }
        },
        "verbal": {
          "positioning": "Enterprise-grade software without enterprise-era waste.",
          "audiences": [
            "small businesses"
          ],
          "valuePropositions": [
            "One connected software ecosystem"
          ],
          "tone": [
            "bold",
            "direct"
          ],
          "do": [
            "Use specific proof"
          ],
          "dont": [
            "Use unsupported superlatives"
          ],
          "bannedTerms": [
            "guaranteed riches"
          ]
        },
        "claims": [],
        "ctas": [],
        "assets": [
          {
            "id": "brand_asset_dd192c95-76da-4c2e-a61c-8b164686806b",
            "kind": "logo",
            "name": "Fixture logo",
            "url": "/api/brand-assets/brand_asset_dd192c95-76da-4c2e-a61c-8b164686806b/content",
            "mimeType": "image/svg+xml"
          }
        ],
        "accessibility": {
          "minimumContrast": 4.5,
          "requireAltText": true,
          "reducedMotion": true
        },
        "legal": {
          "requiredDisclosures": [],
          "prohibitedTopics": []
        }
      },
      "text": "A clear fixture message"
    },
    "resourceType": "workspace",
    "resourceId": "<identifier returned by resource discovery>"
  }
}

Captured local response · HTTP 200:

{
  "valid": true,
  "errors": 0,
  "warnings": 1,
  "issues": [
    {
      "code": "insufficient_contrast",
      "severity": "warning",
      "message": "accent on background is 2.80:1, below the brand minimum of 4.5:1.",
      "path": "visual.palette.accent"
    }
  ]
}

valid is determined by error-level issues; warnings remain separately counted. HTTP 200 with valid:false is a completed negative validation. This checks the supplied snapshot, not proof of its publication or consumer selection.

Workflow example

Input · payload.json:

{
  "snapshot": {
    "identity": {
      "displayName": "Fixture identity",
      "shortDescription": "The next generation of software.",
      "domains": [
        "topolo.io"
      ],
      "locales": [
        "en"
      ]
    },
    "visual": {
      "logos": {
        "primaryAssetId": "brand_asset_87bffee4-7249-419b-b4c1-8edeeb732d55"
      },
      "palette": {
        "primary": "#111827",
        "secondary": "#E5E7EB",
        "accent": "#F97316",
        "background": "#FFFFFF",
        "foreground": "#111827",
        "semantic": {}
      },
      "typography": {
        "heading": {
          "family": "Inter",
          "weights": [
            700
          ],
          "fallback": [
            "sans-serif"
          ]
        },
        "body": {
          "family": "Inter",
          "weights": [
            400,
            600
          ],
          "fallback": [
            "sans-serif"
          ]
        }
      },
      "layout": {
        "radius": 16,
        "spacingScale": [
          4,
          8,
          16
        ],
        "logoPlacement": "top-left"
      },
      "imagery": {
        "direction": "Bold, graphic, product-led.",
        "avoid": [
          "generic stock photography"
        ]
      }
    },
    "verbal": {
      "positioning": "Enterprise-grade software without enterprise-era waste.",
      "audiences": [
        "small businesses"
      ],
      "valuePropositions": [
        "One connected software ecosystem"
      ],
      "tone": [
        "bold",
        "direct"
      ],
      "do": [
        "Use specific proof"
      ],
      "dont": [
        "Use unsupported superlatives"
      ],
      "bannedTerms": [
        "guaranteed riches"
      ]
    },
    "claims": [],
    "ctas": [],
    "assets": [
      {
        "id": "brand_asset_87bffee4-7249-419b-b4c1-8edeeb732d55",
        "kind": "logo",
        "name": "Fixture logo",
        "url": "/api/brand-assets/brand_asset_87bffee4-7249-419b-b4c1-8edeeb732d55/content",
        "mimeType": "image/svg+xml"
      },
      {
        "id": "brand_asset_dce3c24f-65dd-4579-913f-9ffbf74619c9",
        "kind": "logo",
        "name": "Fixture email logo",
        "url": "/api/brand-assets/brand_asset_dce3c24f-65dd-4579-913f-9ffbf74619c9/content",
        "mimeType": "image/png",
        "altText": "Fixture email identity"
      }
    ],
    "accessibility": {
      "minimumContrast": 4.5,
      "requireAltText": true,
      "reducedMotion": true
    },
    "legal": {
      "requiredDisclosures": [],
      "prohibitedTopics": []
    },
    "communications": {
      "emailLogoAssetId": "brand_asset_dce3c24f-65dd-4579-913f-9ffbf74619c9",
      "senderDisplayName": "Fixture identity",
      "replyToAddress": "reply@example.invalid",
      "supportAddress": "support@example.invalid",
      "legalFooter": {
        "entityName": "Fixture identity Ltd",
        "registeredAddress": "1 Fixture Street, Example City",
        "companyNumber": "FIXTURE-001"
      },
      "unsubscribeText": "Manage your message preferences.",
      "footerText": "Synthetic documentation example."
    }
  },
  "text": "A clear fixture message"
}

CLI:

topolo actions validate app_topolo_brand.brand_kits.validate --data @payload.json --json
topolo actions plan app_topolo_brand.brand_kits.validate --resource-type workspace --resource-id "$BRAND_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_brand.brand_kits.validate --resource-type workspace --resource-id "$BRAND_WORKSPACE_ID" --data @payload.json --json

MCP tool and arguments:

{
  "tool": "topolo_read_action",
  "arguments": {
    "actionId": "app_topolo_brand.brand_kits.validate",
    "input": {
      "snapshot": {
        "identity": {
          "displayName": "Fixture identity",
          "shortDescription": "The next generation of software.",
          "domains": [
            "topolo.io"
          ],
          "locales": [
            "en"
          ]
        },
        "visual": {
          "logos": {
            "primaryAssetId": "brand_asset_87bffee4-7249-419b-b4c1-8edeeb732d55"
          },
          "palette": {
            "primary": "#111827",
            "secondary": "#E5E7EB",
            "accent": "#F97316",
            "background": "#FFFFFF",
            "foreground": "#111827",
            "semantic": {}
          },
          "typography": {
            "heading": {
              "family": "Inter",
              "weights": [
                700
              ],
              "fallback": [
                "sans-serif"
              ]
            },
            "body": {
              "family": "Inter",
              "weights": [
                400,
                600
              ],
              "fallback": [
                "sans-serif"
              ]
            }
          },
          "layout": {
            "radius": 16,
            "spacingScale": [
              4,
              8,
              16
            ],
            "logoPlacement": "top-left"
          },
          "imagery": {
            "direction": "Bold, graphic, product-led.",
            "avoid": [
              "generic stock photography"
            ]
          }
        },
        "verbal": {
          "positioning": "Enterprise-grade software without enterprise-era waste.",
          "audiences": [
            "small businesses"
          ],
          "valuePropositions": [
            "One connected software ecosystem"
          ],
          "tone": [
            "bold",
            "direct"
          ],
          "do": [
            "Use specific proof"
          ],
          "dont": [
            "Use unsupported superlatives"
          ],
          "bannedTerms": [
            "guaranteed riches"
          ]
        },
        "claims": [],
        "ctas": [],
        "assets": [
          {
            "id": "brand_asset_87bffee4-7249-419b-b4c1-8edeeb732d55",
            "kind": "logo",
            "name": "Fixture logo",
            "url": "/api/brand-assets/brand_asset_87bffee4-7249-419b-b4c1-8edeeb732d55/content",
            "mimeType": "image/svg+xml"
          },
          {
            "id": "brand_asset_dce3c24f-65dd-4579-913f-9ffbf74619c9",
            "kind": "logo",
            "name": "Fixture email logo",
            "url": "/api/brand-assets/brand_asset_dce3c24f-65dd-4579-913f-9ffbf74619c9/content",
            "mimeType": "image/png",
            "altText": "Fixture email identity"
          }
        ],
        "accessibility": {
          "minimumContrast": 4.5,
          "requireAltText": true,
          "reducedMotion": true
        },
        "legal": {
          "requiredDisclosures": [],
          "prohibitedTopics": []
        },
        "communications": {
          "emailLogoAssetId": "brand_asset_dce3c24f-65dd-4579-913f-9ffbf74619c9",
          "senderDisplayName": "Fixture identity",
          "replyToAddress": "reply@example.invalid",
          "supportAddress": "support@example.invalid",
          "legalFooter": {
            "entityName": "Fixture identity Ltd",
            "registeredAddress": "1 Fixture Street, Example City",
            "companyNumber": "FIXTURE-001"
          },
          "unsubscribeText": "Manage your message preferences.",
          "footerText": "Synthetic documentation example."
        }
      },
      "text": "A clear fixture message"
    },
    "resourceType": "workspace",
    "resourceId": "<identifier returned by resource discovery>"
  }
}

Captured local response · HTTP 200:

{
  "valid": true,
  "errors": 0,
  "warnings": 1,
  "issues": [
    {
      "code": "insufficient_contrast",
      "severity": "warning",
      "message": "accent on background is 2.80:1, below the brand minimum of 4.5:1.",
      "path": "visual.palette.accent"
    }
  ]
}

valid is determined by error-level issues; warnings remain separately counted. HTTP 200 with valid:false is a completed negative validation. This checks the supplied snapshot, not proof of its publication or consumer selection.

Verify the result

Inspect every issue code, severity, path and message. Correct error-level issues and validate the exact intended snapshot/content again before a separately authorized publication.

Errors and recovery

  • auth_error (HTTP 401): CLI/SDK authentication classification when Auth returns a non-code message: restore the authorized credential, then verify whoami and context. Preserve the exact service message.

  • permission_denied (HTTP 403): Use the exact permission and granted resource required by the reviewed action; organization membership alone is insufficient.

  • workspace_required (HTTP 400): Discover and select a granted Brand workspace before preparing the request.

  • brand_storage_unavailable (HTTP 503): The Brand storage bindings are unavailable. Preserve the request identifier and report the service fault; do not retry an unverified mutation.

Recovery boundary

This read or validation does not change Brand service state.

  • app_topolo_brand.brand_kit_versions.update: Update a draft snapshot or change note.
  • app_topolo_brand.brand_kit_versions.publish: Publish a draft as the immutable version consumers resolve.

Evidence

Four real local SQLite stores use all canonical migrations; Auth identity/grants and archival plus R2 object storage are explicitly simulated. Notifications are disabled in fixtures. No notification delivery, live mutation, gateway credential parity or deployed environment proof is claimed. Fixture identifiers and timestamps are synthetic and must be replaced by exact authorized resource discovery.