opentide

Deployment lifecycle

Defines rule deployment statuses, promotion strategy, proxy settings, and debug configuration. Shipped in bundled `deployment.toml`; clients MAY override via `.opentide/configurations/deployment.toml`.

Requirements

  • Every rule status value MUST match a configured status name in merged deployment.toml.
  • The set of statuses is configuration, not specification: implementations MUST NOT assume the bundled status names exist.
  • Status ordering is NOT normative. No transition graph is defined or enforced; any configured status MAY be set directly.
  • Status promotion MUST respect [promotion] settings when promotion.enabled is true.
  • Deprecated statuses MUST NOT be used for new rules (opentide emits warnings).
  • Platform-specific status on configuration blocks MUST also be valid deployment statuses when set.
  • For Defender for Endpoint, SentinelOne, and CrowdStrike, update, disablement, and deletion MUST use the tenant binding in deployment state. A RELEASE or PREVIEW action with no binding MUST NOT create a remote rule unless the deployment-state destination is not ignored and the binding can be durably retained.
  • opentide deploy MUST select only the rule files placed directly in the configured rules directory (paths.objects.rule, see workspace layout). A rule file in a subdirectory of that folder MUST NOT be deployed.

Definition

Status entries ([[statuses]])

FieldTypeRequiredDescription
namestringyesStatus identifier (e.g. STAGING)
descriptionstringyesHuman-readable description
strategystringyesDeployment strategy enum

Bundled statuses

NameStrategyDescription
DESIGNINERTUnder active functional design, without technical translation
DEVELOPMENTPREVIEWUnder active technical implementation
IMPROVINGPREVIEWFunctionally qualified, undergoing refinement
STAGINGPREVIEWDeployed in staging for operational testing
ACCEPTANCEPREVIEWReady for production; analyst validates alert and playbook
PRODUCTIONRELEASEActive production deployment
DISABLEDDISABLEMENTAccessible but not active
REMOVEDDELETIONFully deprecated, archival flag only

Strategy semantics

The strategy on a status determines what opentide deploy does with a rule in that status:

StrategyDeploy behaviour
INERTRule is not deployed to any platform
PREVIEWRule is deployed to staging/preview targets only
RELEASERule is deployed to production targets
DISABLEMENTAny active deployment of the rule is disabled (kept but inactive)
DELETIONThe rule is removed from platforms
UNIVERSALRule is deployed to both staging/preview and production targets

No bundled status uses UNIVERSAL; a client status MAY.

Status changes and promotion

There is no lifecycle state machine. Statuses are a flat, configurable set: the only constraint enforced on a rule is that its status matches a configured status name. Any status MAY be set directly in YAML, in any order, and no transition is validated.

Promotion, when promotion.enabled is true, is a single jump — not a step along a progression:

Status strategyEffect of promotion
RELEASE, DISABLEMENT, DELETIONNon-promotable; the status is left unchanged
Any other strategy (e.g. INERT, PREVIEW)Rewritten directly to promotion.promotion_target
flowchart LR
  D["opentide deploy<br/>promotion.enabled = true"] --> Q{"status strategy"}
  Q -->|"RELEASE / DISABLEMENT / DELETION"| U["status unchanged"]
  Q -->|"any other strategy"| T["status := promotion_target<br/>(default PRODUCTION)"]

Intermediate statuses are not stepped through: a rule in the bundled DESIGN status promotes straight to PRODUCTION. Promotion rewrites the status values inside a rule's platform configurations blocks.

The bundled status names in the table above suggest an editorial workflow (design → build → stage → release → retire), but that ordering is convention only and applies solely to the bundled configuration. Clients that override deployment.toml define their own statuses, and any progression between them is enforced by their own process, not by opentide.

Vendor-assigned rule ids

For Defender for Endpoint, SentinelOne, and CrowdStrike, update, disablement, and deletion require the tenant binding in deployment state (deployment-state.md). A release or preview action with no binding creates a remote rule only when the destination is not ignored and the binding can be durably retained. DISABLEMENT and DELETION with no binding report external_id_missing (a warning) and make no vendor call.

StrategyBinding presentNo binding
PREVIEW, RELEASEUpdate the remote ruleCreate and record the returned id; refused with deployment_state_ignored when the shard directory is gitignored, and with deployment_state_unpersisted in a CI run other than a RELEASE run on a push
DISABLEMENTUpdate the remote rule as disabled; keep the bindingexternal_id_missing (warning), no vendor call
DELETIONDelete the remote rule, then remove the bindingexternal_id_missing (warning), no vendor call
INERTNot deployedNot deployed

A rule that carries rule_id, rule_id_bundle, or rule_id::<tenant> on any platform block is refused before any platform client is built (external_id_in_rule). Deploy continues with independent rules and exits 1 when any selected rule reported an error. The strategies themselves are unchanged. Sentinel, Splunk, HarfangLab, Carbon Black Cloud, and Elastic address rules without a vendor-assigned id and never use deployment state.

[promotion]

FieldTypeDefaultDescription
enabledbooleantrueWhether status promotion is allowed
promotion_targetstringPRODUCTIONDefault target status for promotion

[proxy]

FieldDescription
proxy_userOptional; use with proxy_password for auth
proxy_passwordOptional proxy password (env var substitution supported)
proxy_hostProxy hostname
proxy_portProxy port

When both proxy_user and proxy_password are present, authenticated proxy is used; otherwise host:port only.

[debug]

FieldTypeDescription
mdr_test_uuidslist[string]UUIDs of rules usable for debugging
proxy_enabledbooleanEnable proxy in debug mode
ssl_enabledbooleanEnable SSL in debug mode

Top-level

FieldDefaultDescription
default_responders""Default responder team when not set on rule

Relationships

Defaults & overrides

Bundled deployment.toml ships in opentide. Override via .opentide/configurations/deployment.toml. Deep merge applies.

Examples

Default rule status in fixtures: STAGING — see fixtures/valid/rule-1.0.yaml.

History

VersionDateNotes
1.02026-06-25Initial spec from opentide deployment.toml
1.12026-10-16Vendor-assigned rule ids: update, disablement, and deletion on Defender for Endpoint, SentinelOne, and CrowdStrike use the binding in deployment state; creates require a destination that is not ignored and a run that can persist state; external_id_missing is a warning (RFC 0010).
1.22026-10-19opentide deploy selects only rule files placed directly in the configured rules directory; a rule file in a subfolder is not deployed (specifications#16).
1.32026-10-20UNIVERSAL joins the strategy table. opentide already accepts it for a status strategy; the spec did not list it. Additive. The deployment_state_unpersisted condition names a run by its strategies, not a deployment plan.

On this page