{"slug":"kata-2","title":"kata","summary":"KATA, the indentation-based configuration language Cerb uses for automations, toolbars, sheets, charts, workflows, policies, and more. Load it before writing any KATA -- the indentation and quoting rules are not YAML's.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-16T16:27:57.440517Z","repo":{"url":"https://github.com/jstanden/cerb","stars":84,"forks":38,"license":null,"updatedAt":"2026-10-16T15:09:59Z"},"bodyHtml":"<hr>\n<h2>name: kata\ndescription: KATA, the indentation-based configuration language Cerb uses for automations, toolbars, sheets, charts, workflows, policies, and more. Load it before writing any KATA -- the indentation and quoting rules are not YAML's.</h2>\n<h1>KATA</h1>\n<p>KATA is Cerb's configuration language: keys, values, and indentation. It looks like YAML and is not YAML. Everything below applies <strong>everywhere Cerb uses KATA</strong> -- automation scripts and policies, toolbars, sheets, charts, workflows, interaction elements, agent config, the schema file -- not just automations.</p>\n<p>Full reference: <code>/cerb-docs/references/docs/kata.md</code>.</p>\n<h2>The indentation rule -- read this one twice</h2>\n<p><strong>A bare <code>key:</code> with anything indented under it is an OBJECT. Always.</strong> There is no exception and no heuristic.</p>\n<p>To put a multi-line VALUE under a key, the key must carry an annotation. <code>@text:</code> is the generic one, but any annotation works -- <code>@int:</code>, <code>@bool:</code>, <code>@json:</code> all accept a value indented on the following lines.</p>\n<pre><code>message@text:\n  Subject: Order 123\n  Status: open\n</code></pre>\n<p>→ the string <code>\"Subject: Order 123\\nStatus: open\"</code>.</p>\n<p>Drop the annotation and the same lines mean something completely different:</p>\n<pre><code>message:\n  Subject: Order 123\n  Status: open\n</code></pre>\n<p>→ the object <code>{\"message\": {\"Subject\": \"Order 123\", \"Status\": \"open\"}}</code>.</p>\n<p><strong>That second one does not error.</strong> It parses cleanly into the wrong shape, and the failure surfaces much later as an empty placeholder or a command that received an object where it wanted a string. Prose is especially prone to it, because a colon anywhere in a sentence is enough -- <code>Subject:</code>, <code>Note:</code>, a time like <code>9:00</code>.</p>\n<p>You are only warned when the indented text <em>can't</em> be read as keys:</p>\n<pre><code>note:\n  See https://cerb.ai/docs/ for more\n</code></pre>\n<p>→ <code>Unexpected syntax (line 2)</code>. Same mistake, but this one is loud. Don't rely on it.</p>\n<p><strong>So: any value that spans lines, or that contains prose, needs an annotation on its key.</strong> When in doubt, <code>@text:</code>.</p>\n<h2>Strings are never quoted</h2>\n<p>Values are literal text from the colon to the end of the line. Quotes are not syntax -- they become part of the value.</p>\n<pre><code>name: Jeff          →  \"Jeff\"\nname: \"Jeff\"        →  \"\\\"Jeff\\\"\"      ← the quotes are IN the string\nname: 'Jeff'        →  \"'Jeff'\"\n</code></pre>\n<p>Never wrap a value in quotes to \"make it a string\". It already is one. Quote only when the quotes are genuinely part of the text you want.</p>\n<h2>Comments must be on their own line</h2>\n<p>A <code>#</code> only starts a comment at the beginning of a line (after indentation). There are no trailing comments.</p>\n<pre><code># This is a comment.\nname: Jeff\n</code></pre>\n<pre><code>name: Jeff # this is NOT a comment\n</code></pre>\n<p>→ the value is <code>\"Jeff # this is NOT a comment\"</code>.</p>\n<p>Note that this cuts the other way inside an annotated text block: there, a <code>#</code> line <em>is</em> content, because the whole block is a literal value.</p>\n<h2>Types come from annotations</h2>\n<p>All values are text by default. Convert explicitly:</p>\n<p><code>@bool</code> <code>@int</code> <code>@float</code> <code>@csv</code> <code>@json</code> <code>@list</code> <code>@date</code> <code>@key</code> <code>@text</code> <code>@raw</code> <code>@optional</code></p>\n<p>Annotations combine with a comma (<code>@optional,text:</code>). <code>@optional</code> is honored by whatever CONSUMES the KATA rather than by the parser, so what it does depends on the command -- check that command's documentation rather than assuming it drops empty values.</p>\n<p><strong>Never stack <code>@raw</code> inside an already-raw block.</strong> Inside <code>script@raw:</code> / <code>event_kata@raw:</code> / <code>policy_kata@raw:</code>, use the normal annotations (<code>if@bool:</code>, <code>set:</code>). Writing <code>if@raw,bool: {{...}}</code> makes the condition never match.</p>\n<h2>Keys must be unique among siblings</h2>\n<p>A repeated key silently clobbers the earlier one. Where you need the same command twice under one parent, give each an alias with <code>/</code>:</p>\n<pre><code>set/init:\nset/increment:\nawait/step:\n</code></pre>\n<p>The part before the <code>/</code> is what Cerb dispatches on; the part after is yours, and it may contain only letters, numbers, and underscores -- no dots.</p>\n<h2>References</h2>\n<p><code>&amp;name:</code> defines a reusable block; <code>@ref</code> uses it. Useful for a long value you'd otherwise repeat, and for keeping a big text block out of the middle of a script.</p>\n<h2>House style</h2>\n<p>Two-space indentation, spaces not tabs. Annotate types rather than relying on a reader to infer them.</p>\n","files":[{"path":"SKILL.md","sizeBytes":4161,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-16T16:28:15.064518Z","sha256":"DED62BB63989456920FFECD9D328D61B81719D30FCF28A5BD6CD530188CF7C77","sizeBytes":2074},"review":null,"source":{"repositoryUrl":"https://github.com/jstanden/cerb","path":"features/cerberusweb.core/assets/agent_filesystems/cerb-agents/skills/kata","license":null,"commit":"cf28b62ee0f67ff993645931568a4e4bbad074f0","subtreeSha":"AADC5B463D2813524A800BBDA0ECC7B64D4FA2C5E9B6299F4D9185A5CD9509DB","lastSyncedAt":"2026-10-16T16:27:56.786317Z"},"reviewedAt":"2026-10-16T16:28:43.147999Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/jstanden/cerb/tree/12.0.x/features/cerberusweb.core/assets/agent_filesystems/cerb-agents/skills/kata"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install jstanden-cerb@llmmart"},{"target":"git","command":"git clone https://github.com/jstanden/cerb.git"}]}