opentide

Validation

OpenTide validates detection content through a structured pipeline: ID uniqueness, UUID format, Pydantic schema validation, vocabulary conformance, deprecated field warnings, and cross-object reference checks. Optional checks include CVE scanning and per-platform query validation.

Requirements

  • opentide validate MUST run default checks: id-uniqueness, uuid-format, schema.
  • Schema validation MUST load each object via metadata.schema and validate against the registered Pydantic model.
  • Vocabulary validation MUST walk metaschema tide.vocab annotations for each object type.
  • UUID values MUST be UUID version 4.
  • Object UUIDs MUST be unique across the workspace registry.
  • Cross-object references MUST resolve to existing objects when checked.
  • Threat chaining relationships MUST reference valid targets when checked.
  • Query validation MUST only be offered for platforms in the query-validation allowlist (see platforms.md).
  • Platforms without query validators MUST return supported: false — not fake success.

Definition

Check types (ValidateCheck)

CheckIdentifierDefaultDescription
ID uniquenessid-uniquenessyesNo duplicate metadata.uuid across YAML files
UUID formatuuid-formatyesEvery UUID must be valid UUIDv4
SchemaschemayesPydantic model validation + vocab + cross-ref
CVEcvenoCVE reference integrity (optional flag)

Schema check sub-steps

When schema is enabled, for each in-scope object the implementation MUST, in order:

  1. Load and model-validate — resolve the object's metadata.schema and validate it against the registered model.
  2. Vocabulary — check controlled-vocabulary fields against the indexed metaschema vocabulary annotations.
  3. Deprecation — flag deprecated fields as warnings.
  4. References — resolve references links to existing objects.
  5. Chaining — resolve chaining relationships (threat vectors only).

Steps 4 and 5 resolve cross-object links; they run whenever the schema check runs against a full workspace scope where the referenced objects are present.

Validation scope

ModeBehavior
fullAll objects in the workspace index
narrowFilter by --file, --uuid, and/or --type

When --file, --uuid, or --type filters match no objects, validation MUST emit a scope_no_match error rather than silently passing — a filter that selects nothing is treated as a mistake, not a success.

Query validation

Command: opentide validate query --platform <id>

PlatformSupported
sentinelyes
defender_for_endpointyes
splunkyes
sentinel_oneyes
carbon_black_cloudyes
crowdstrikeno
harfanglabno

Requires platform credentials and enabled configuration. Validates deployed or planned rule queries against the live platform API.

Issue severities

SeverityExamples
errorSchema failure, duplicate UUID, invalid UUID, broken cross-ref
warningDeprecated field usage

Environment signals

VariableSet when
VALIDATION_ERROR_RAISEDOne or more errors
VALIDATION_WARNING_RAISEDOne or more warnings

Parallel execution

Validation MAY parallelize per-object work and ID scans; worker count is resolved from object count and optional --workers flag.

Relationships

Defaults & overrides

Validation uses merged configuration for vocabulary and status enums. No separate validation config file. Scope defaults to full workspace.

Examples

FixtureExpected result
fixtures/valid/rule-1.0.yamlPasses schema + UUID checks
fixtures/invalid/rule-bad-uuid.yamlFails uuid-format
fixtures/invalid/rule-unknown-schema.yamlFails schema
fixtures/cross-object/rule-references-objective.yamlPasses when sibling objective fixture present

History

VersionDateNotes
1.02026-06-25Initial spec from opentide validation/session.py

On this page