# NoETL DSL knowledge base > Machine-readable, version-accurate NoETL playbook grammar. Generated from > noetl-orchestrate-core; never hand-edited. - apiVersion: noetl.io/v2 (document kind: Playbook) - schema_digest: sha256:de6519f1f025dcb0e4743e321cff30e8ac4800d38acaaecf8249c00a13ab9ad6 - source: noetl/server@12523418beee ## Artifacts - [Playbook JSON Schema (draft 2020-12)](/schema/v2/playbook.schema.json) - [Tool-kind manifest](/dsl/manifest.json) - [Provenance](/dsl/source.json) ## Tool kinds (default gates) - agent: disabled (gated by NOETL_TOOL_KIND_AGENT) - artifact: enabled - container: enabled - duckdb: enabled - ducklake: enabled - gateway: enabled - gcs: enabled - http: enabled - iterator: enabled - mcp: disabled (gated by NOETL_TOOL_KIND_MCP) - nats: enabled - noop: enabled - playbook: enabled - playbooks: enabled - postgres: enabled - python: enabled - rhai: enabled - script: enabled - secrets: enabled - shell: enabled - snowflake: enabled - snowflake_transfer: enabled - subscription: enabled - task_sequence: enabled - transfer: enabled - wasm: enabled - workbook: enabled ## Rules for generators - Use only enabled tool kinds. A disabled kind is rejected at registration. - Executability is reported by live workers, not by this file: 'accepted' is not 'runs'. - A workflow needs a step named `start`; step names are unique; `next` targets must exist. - Validate before registering (POST /api/dsl/validate, RFC Phase 2).