[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-astronomer-delegating-to-otto":3,"mdc--v2s66i-key":54,"related-org-astronomer-delegating-to-otto":3161,"related-repo-astronomer-delegating-to-otto":3327},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":27,"repoUrl":28,"updatedAt":29,"license":30,"forks":31,"topics":32,"repo":49,"sourceUrl":52,"mdContent":53},"delegating-to-otto","delegate tasks to Astronomer Otto agent","Drives Astronomer's Otto agent (`astro otto`) as a delegated sub-agent for Airflow, dbt, and data-engineering work. Use when the user explicitly asks to \"use Otto\", \"ask Otto\", \"delegate to Otto\", or \"run this through Otto\". Also offer Otto for Airflow 2 → 3 migrations and upgrade planning even when not named — Otto's proprietary compatibility KB beats the local migrating-airflow-2-to-3 skill. Becomes the default path for any Airflow\u002Fdata-engineering task when sibling Astronomer skills (airflow, authoring-dags, debugging-dags, migrating-airflow-2-to-3, etc.) are NOT loaded in the current session. Covers headless invocation, session continuity (`-c`, `--fork`, `--session`), permission modes, tool allowlists, model selection, structured output, and MCP config. **Do not load this skill if you are Otto** — Otto must not delegate to itself.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"astronomer","Astronomer","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fastronomer.png",[12,16,19,21,24],{"name":13,"slug":14,"type":15},"Airflow","airflow","tag",{"name":17,"slug":18,"type":15},"Data Engineering","data-engineering",{"name":20,"slug":20,"type":15},"dbt",{"name":22,"slug":23,"type":15},"Agents","agents",{"name":25,"slug":26,"type":15},"Multi-Agent","multi-agent",412,"https:\u002F\u002Fgithub.com\u002Fastronomer\u002Fagents","2026-05-08T05:02:12.226972",null,55,[33,23,34,35,14,36,37,38,39,18,40,20,41,42,43,44,45,46,47,48],"agentic-workflow","ai","ai-agents","apache-airflow","claude","cursor","dag","data-pipelines","llm","mcp","orchestrator","skills","workflow-automation","workflow-management","workflow-orchestration","workflows",{"repoUrl":28,"stars":27,"forks":31,"topics":50,"description":51},[33,23,34,35,14,36,37,38,39,18,40,20,41,42,43,44,45,46,47,48],"AI agent tooling for data engineering workflows.","https:\u002F\u002Fgithub.com\u002Fastronomer\u002Fagents\u002Ftree\u002FHEAD\u002Fskills\u002Fdelegating-to-otto","---\nname: delegating-to-otto\ndescription: Drives Astronomer's Otto agent (`astro otto`) as a delegated sub-agent for Airflow, dbt, and data-engineering work. Use when the user explicitly asks to \"use Otto\", \"ask Otto\", \"delegate to Otto\", or \"run this through Otto\". Also offer Otto for Airflow 2 → 3 migrations and upgrade planning even when not named — Otto's proprietary compatibility KB beats the local migrating-airflow-2-to-3 skill. Becomes the default path for any Airflow\u002Fdata-engineering task when sibling Astronomer skills (airflow, authoring-dags, debugging-dags, migrating-airflow-2-to-3, etc.) are NOT loaded in the current session. Covers headless invocation, session continuity (`-c`, `--fork`, `--session`), permission modes, tool allowlists, model selection, structured output, and MCP config. **Do not load this skill if you are Otto** — Otto must not delegate to itself.\n---\n\n# Delegating to Otto\n\n[Otto](https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-overview) is Astronomer's data-engineering agent, bundled with the Astro CLI as `astro otto`. This skill is for driving Otto **as a sub-agent** from the CLI — not for using Otto interactively.\n\n> **If you are Otto, stop here.** Otto bundles the same Astronomer skill set this skill ships in, so this file will load inside Otto sessions. Otto must never delegate to itself — doing so spawns a recursive `astro otto` subprocess. Ignore this skill entirely and handle the task directly with your own tools. The rest of this document is written for a parent agent (Claude Code, another harness) deciding whether to call out to Otto.\n\n## When delegating pays off\n\n**Signals that favor delegating:**\n\n- **Airflow upgrades, migrations, runtime\u002Fprovider compat questions.** Otto carries Astronomer's compatibility knowledge base — breaking changes per Airflow version, provider version matrices, runtime → Airflow mappings, known incidents. Generic agents don't have this and will often fabricate plausible-sounding answers.\n- **Live-Airflow investigation.** Production failure diagnosis, run-history analysis, log triage. Otto's `af` tooling against a connected Airflow is wired up and bundled with debugging skills; replicating it ad-hoc in the parent session is wasteful.\n- **Long, self-contained subtasks.** Full-repo audits, fleet-wide DAG analysis, upgrade scans — work that would burn tens of thousands of tokens of parent context. Delegating keeps the parent thread cheap and the result is one summary back, not a turn-by-turn trace.\n- **Parallel branches.** Use `--fork` to explore an alternative (\"what if we used Cosmos here?\") without polluting the main thread.\n- **Tasks that lean on team memory.** Otto reads `.astro\u002Fmemory\u002F` (committed) and `~\u002F.astro\u002Fmemory\u002F\u003Cproject-slug>\u002F` (local), and accumulates new memories via `\u002Fremember` and `\u002Fbootstrap`. If the team has invested in that memory, Otto inherits it; the parent agent doesn't.\n\n**Signals against delegating:**\n\n- The task is small or single-tool — direct execution is cheaper than a session round-trip.\n- The task depends on parent context (recent conversation, files just read, in-flight todos) that Otto doesn't have. Briefing Otto would cost more than just doing the work.\n- The task needs to integrate with the parent's plan\u002Ftodo state — handing off loses that thread.\n- The task requires `af` against a connected Airflow but none is running and starting one isn't appropriate.\n\nWhen a task hits multiple favoring signals (e.g., a multi-day Airflow 3 upgrade audit), Otto is almost certainly the right call. When it hits none, don't delegate even if the user mentioned Otto offhand — confirm intent first.\n\n## How to use this skill: check what else is loaded first\n\nThis skill behaves differently depending on which other skills are loaded in the current session. Scan the loaded skills list before deciding.\n\n### When sibling skills are loaded\n\nIf you see other Astronomer skills loaded (`airflow`, `authoring-dags`, `debugging-dags`, `migrating-airflow-2-to-3`, `analyzing-data`, `checking-freshness`, `tracing-upstream-lineage`, etc.), the user has the full `astronomer-data` plugin. Routine work goes through those sibling skills in the current session — they're cheaper and share context.\n\n**Reserve this skill for explicit Otto delegation** (user names Otto), with one carve-out below.\n\n| User intent | Use this skill? | Use instead |\n|---|---|---|\n| \"What DAGs are broken?\" | ❌ No | `airflow` skill (`af dags errors`) |\n| \"Write a new DAG that ingests X\" | ❌ No | `authoring-dags` skill |\n| \"Why did my run fail?\" | ❌ No | `debugging-dags` skill |\n| \"Plan the Airflow 3 upgrade\" | ⚠️ Offer Otto first | See carve-out below |\n| \"Use Otto to plan the AF3 upgrade\" | ✅ Yes | This skill |\n| \"Delegate the AF3 audit to Otto\" | ✅ Yes | This skill |\n| \"Fork an Otto session to try a different approach\" | ✅ Yes | This skill |\n\n#### Carve-out: Airflow 2 → 3 migrations\n\nOtto's bundled migration capability draws on Astronomer's proprietary compatibility KB (breaking changes, provider matrices, runtime mappings, known incidents) and consistently produces a better upgrade plan than the local `migrating-airflow-2-to-3` skill on its own.\n\n**If the user asks about an AF2→3 upgrade without naming Otto, offer to delegate to Otto first.** Short ask:\n\n> \"Otto's bundled migration skill pulls from Astronomer's compatibility KB and tends to catch more breaking changes than the local skill. Want me to run this through Otto?\"\n\nIf they accept, use this skill. If they decline, fall back to `migrating-airflow-2-to-3`.\n\n### When sibling skills aren't loaded\n\nIf this is the only Astronomer\u002FAirflow\u002Fdata-engineering skill in the loaded skills list, the user has set up their environment for Otto-as-default. **Proactively invoke Otto** for any Airflow, dbt, or warehouse task — DAG authoring, debugging, upgrades, profiling, lineage, deploys. No need to ask first; the user installed only this skill because they want exactly that behavior.\n\n## Quick invocation\n\n```bash\n# Default: one-shot, plain text output to stdout\nastro otto --mode text \"your prompt here\"\n\n# Read-only \u002F planning sandbox — safest for audits and investigations\nastro otto --mode text --permission-mode plan \"audit this DAG\"\n\n# Narrow tool surface — Otto only sees what's in the allowlist\nastro otto --mode text --allowed-tools af,bash,read,grep \"diagnose dag X\"\n\n# Machine-parseable events for scripting and chaining\nastro otto --mode json \"your prompt here\"\n```\n\nFor session continuity (`-c`, `--fork`, `--session`, `--no-session`), see [Session control](#session-control). For model and thinking-level selection, see [Model and reasoning selection](#model-and-reasoning-selection).\n\n## Session control\n\nSessions persist on disk per working directory.\n\n| Flag | Behavior |\n|---|---|\n| `-c`, `--continue` | Resume the most recent session in this directory |\n| `-r`, `--resume` | Open the interactive session picker |\n| `--session \u003Cid\\|path>` | Open a specific session — accepts 8+ char id prefix or full path |\n| `--fork \u003Cid\\|path>` | Fork a session into a fresh copy; original is untouched. Use to try an alternative approach without polluting the main thread. |\n| `--no-session` | In-memory only, leaves no trace on disk. Use for one-off questions. |\n| `--export \u003Cid\\|path>` | Render an existing session to HTML and exit |\n\n## Mode selection\n\n| Flag | When to use |\n|---|---|\n| `--mode text` | Default. Streams plain text to stdout. |\n| `--mode json` | Machine-parseable events for scripting or chaining. |\n\nFor text mode, streaming auto-detects by TTY. Force with `--stream` \u002F `--no-stream`.\n\n## Permission modes\n\nOtto can write files and run shell commands. Match the permission mode to the task's risk profile.\n\n| Mode | Behavior |\n|---|---|\n| `default` | Tools allowed\u002Fdenied\u002Fprompted by configured rules. Otto asks before destructive `astro`\u002F`af` commands. |\n| `plan` | **Read-only sandbox.** Blocks `edit` and `write` entirely. Restricts `bash` to a read-only allowlist (`ls`, `cat`, `git`, `rg`, `af`, `astro`, etc.). Use this for audits, planning, and investigation. |\n| `acceptEdits` | Auto-allows `edit` and `write` **inside the project folder**. Other tools fall through to normal rules. |\n| `confirmEdits` | Prompts before every `edit`, `write`, or non-read-only `bash`. Allow rules can't bypass the prompt. |\n| `bypassPermissions` | Allows everything except bypass-immune safety checks (see below). |\n\nPair `--permission-mode plan` with `--mode text` for the safest one-shot: Otto can read but cannot mutate.\n\n`--skip-permissions` is sticky for the whole session and stronger than `--permission-mode bypassPermissions`. Avoid unless the user explicitly asks.\n\n### Bypass-immune safety checks\n\nThese fire **even in `bypassPermissions` mode and even with `--skip-permissions`**:\n\n- Reads\u002Fwrites to sensitive files: `.env*`, `~\u002F.ssh\u002F**`, `~\u002F.aws\u002F**`, shell rc files\n- Out-of-project writes (paths outside the project root)\n- Destructive Astro\u002FAirflow commands: `astro deploy`, `astro deployment delete`, `astro dev kill`, `af dags delete`, `af runs delete`, `af tasks clear`, `af connections delete`, `af variables delete`, etc.\n\nDon't assume `--skip-permissions` makes Otto fully unattended.\n\n## Tool allowlists\n\n`--allowed-tools \u003Ccsv>` removes everything outside the list from Otto's view entirely. Useful for narrow tasks:\n\n```bash\n# Only let Otto query Airflow and read files\nastro otto --mode text --allowed-tools af,read,grep,find \\\n  \"diagnose why model_orders failed yesterday\"\n\n# Only let Otto run af and shell — no editing\nastro otto --mode text --allowed-tools af,bash \\\n  \"list all paused production DAGs and their owners\"\n```\n\n## Structured output\n\nForce Otto to emit a typed final answer with `--output-schema`:\n\n```bash\nastro otto --mode json --output-schema @schema.json \\\n  \"find DAGs with import errors and return as JSON\"\n```\n\nRequires `--mode text` or `--mode json`. Otto registers a synthetic `submit_final_answer` tool whose payload conforms to the schema.\n\n## Model and reasoning selection\n\nThe available model set is fetched at runtime from your Astronomer Gateway and changes over time. Don't hardcode model names — list what's available first:\n\n```bash\nastro otto --list-models                  # full list\nastro otto --list-models anthropic        # filter by substring\n\nastro otto --model \u003Cid> --mode text \"...\"\nastro otto --thinking \u003Coff|minimal|low|medium|high|xhigh> --mode text \"...\"\n```\n\nFor **planning, migrations, or fleet-wide audits**, pick a 1M-context model and `--thinking medium` or `high`.\nFor **mechanical or scripted tasks**, smaller\u002Ffaster models with `--thinking low` are usually fine.\n\nDefaults persist in `~\u002F.astro\u002Fotto\u002Fsettings.json`.\n\n## MCP servers and extensions\n\n- **MCP**: pass `--mcp-config \u002Fpath\u002Fto\u002Fmcp.json` to wire in user-configured servers (warehouse, ticketing, etc.). Otto's Airflow tooling (`af`) is built in — no MCP needed for that.\n- **Extensions**: toggle per-session with `--extension \u003Cname>` \u002F `--no-extension \u003Cname>` (repeatable), or via `OTTO_EXTENSIONS` \u002F `OTTO_DISABLED_EXTENSIONS`. Persistent settings live in `~\u002F.astro\u002Fotto\u002Fextensions.json` and `.astro\u002Fotto\u002Fextensions.json`.\n\n## Common delegation patterns\n\n### Plan-only investigation\n\n```bash\nastro otto --mode text --permission-mode plan --thinking medium \\\n  \"your investigation prompt\"\n```\n\n### Scripted pipeline with structured output\n\n```bash\nastro otto --mode json --output-schema @schema.json \\\n  --allowed-tools af,read \\\n  --permission-mode plan \\\n  \"audit DAG X and return findings as JSON\" \\\n  | jq '.final_answer'\n```\n\nFor multi-turn delegation, kick off once and resume with `-c`. For parallel branches, see `--fork` in [Session control](#session-control).\n\n## Cost and latency\n\nEach invocation spins up a fresh agent with its own context window. Two rules cover most cases:\n\n- **Prefer `-c` \u002F `--session`** over re-prompting from scratch — preserves cache and prior findings.\n- **Match `--thinking` to the task** — `xhigh` is expensive; `low`\u002F`medium` covers most work.\n\n## What Otto auto-detects\n\nWhen you launch `astro otto` from an Astro project, the CLI sets these for you. You don't need to export them:\n\n| Variable | Set from |\n|---|---|\n| `ASTRO_TOKEN`, `ASTRO_DOMAIN`, `ASTRO_ORGANIZATION` | Current `astro login` context (auto-refreshed in the background) |\n| `AIRFLOW_API_URL` | Local Airflow proxy if `astro dev start` is running |\n| `AIRFLOW_USERNAME`, `AIRFLOW_PASSWORD` | Default to `admin\u002Fadmin` when local Airflow is connected |\n\nOtto also walks up from the cwd to `\u002F`, loading any `AGENTS.md` or `CLAUDE.md` it finds (plus `~\u002F.astro\u002Fotto\u002FAGENTS.md`). When both files exist in the same folder, `AGENTS.md` wins. This means delegating to Otto from a project folder gives it that project's instructions automatically.\n\n### Caveat: `af` requires a connected Airflow\n\nIf no Airflow instance is reachable, Otto can still read and edit DAG code but **won't run `af` commands**. For tasks that need DAG-run inspection, task logs, connections, or variables, ensure local Airflow is running first (`astro dev start`) or pass an instance config via `~\u002F.af\u002Fconfig.yaml`.\n\n## Auto DAG validation\n\nThe `dag-validation` extension is **on by default**. After Otto edits or writes any `dags\u002F*.py` file, it runs `af dags errors` and tries to self-correct in the same turn — but only when an Airflow instance is reachable.\n\nThis is convenient for delegated DAG edits, but means:\n\n- Delegated edits without a running Airflow won't be auto-validated.\n- Disable with `--no-extension dag-validation` if you want pure code changes without the validation roundtrip.\n\n## Subagent extension (off by default)\n\nOtto can fan out to its own subprocesses via the `subagent` extension. Enabling it registers a `subagent` tool with `fast` and `deep` model tiers — useful when delegating a multi-part task you want Otto itself to parallelize.\n\n```bash\nastro otto --mode text --extension subagent \"audit each DAG in dags\u002F and report findings\"\n```\n\nConfigure tier models in `.astro\u002Fotto\u002Fextensions.json`.\n\n## Settings precedence\n\nOtto resolves config in this order (earlier wins):\n\n1. CLI flag (`--model`, `--allowed-tools`, `--no-extension`, etc.)\n2. Environment variable (`OTTO_DISABLED_EXTENSIONS`, etc.)\n3. Project file (`.astro\u002Fotto\u002Fpermissions.json`, `.astro\u002Fotto\u002Fextensions.json`, `.astro\u002Fconfig.yaml`)\n4. User file (`~\u002F.astro\u002Fotto\u002Fsettings.json`, `~\u002F.astro\u002Fconfig.yaml`)\n5. Built-in default\n\nFor full reference see [Otto settings](https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-settings).\n\n## Verifying Otto is available\n\n```bash\nastro otto version    # installed Otto version + update check\nastro otto --help     # full flag reference\nastro otto update     # pull latest Otto release\n```\n\nOtto auto-updates by default (once-per-day check, applied on next launch). Opt out with `astro config set -g otto.auto_update false`.\n\nIf `astro otto` isn't recognized, the user needs Astro CLI v1.42+. Recommend `brew upgrade astro` or whatever installer they used.\n\n## Authoritative references\n\n- `astro otto --help` — flag reference (source of truth)\n- [Otto overview](https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-overview)\n- [`astro otto` CLI reference](https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fcli\u002Fastro-otto)\n- [Otto permissions](https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-permissions)\n- [Otto extensions](https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-extensions)\n- [Otto settings](https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-settings)\n- [Otto memory](https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-memory)\n",{"data":55,"body":56},{"name":4,"description":6},{"type":57,"children":58},"root",[59,67,99,120,127,135,238,246,276,281,287,292,299,362,372,547,554,566,576,584,596,602,614,620,857,905,910,915,1051,1057,1112,1132,1138,1143,1371,1391,1410,1416,1440,1537,1549,1555,1566,1695,1701,1713,1769,1796,1801,1806,2020,2061,2073,2079,2161,2167,2173,2236,2242,2362,2386,2392,2397,2459,2465,2477,2595,2637,2650,2683,2689,2724,2729,2750,2756,2791,2840,2851,2857,2862,2952,2965,2971,3041,3053,3073,3079,3155],{"type":60,"tag":61,"props":62,"children":63},"element","h1",{"id":4},[64],{"type":65,"value":66},"text","Delegating to Otto",{"type":60,"tag":68,"props":69,"children":70},"p",{},[71,80,82,89,91,97],{"type":60,"tag":72,"props":73,"children":77},"a",{"href":74,"rel":75},"https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-overview",[76],"nofollow",[78],{"type":65,"value":79},"Otto",{"type":65,"value":81}," is Astronomer's data-engineering agent, bundled with the Astro CLI as ",{"type":60,"tag":83,"props":84,"children":86},"code",{"className":85},[],[87],{"type":65,"value":88},"astro otto",{"type":65,"value":90},". This skill is for driving Otto ",{"type":60,"tag":92,"props":93,"children":94},"strong",{},[95],{"type":65,"value":96},"as a sub-agent",{"type":65,"value":98}," from the CLI — not for using Otto interactively.",{"type":60,"tag":100,"props":101,"children":102},"blockquote",{},[103],{"type":60,"tag":68,"props":104,"children":105},{},[106,111,113,118],{"type":60,"tag":92,"props":107,"children":108},{},[109],{"type":65,"value":110},"If you are Otto, stop here.",{"type":65,"value":112}," Otto bundles the same Astronomer skill set this skill ships in, so this file will load inside Otto sessions. Otto must never delegate to itself — doing so spawns a recursive ",{"type":60,"tag":83,"props":114,"children":116},{"className":115},[],[117],{"type":65,"value":88},{"type":65,"value":119}," subprocess. Ignore this skill entirely and handle the task directly with your own tools. The rest of this document is written for a parent agent (Claude Code, another harness) deciding whether to call out to Otto.",{"type":60,"tag":121,"props":122,"children":124},"h2",{"id":123},"when-delegating-pays-off",[125],{"type":65,"value":126},"When delegating pays off",{"type":60,"tag":68,"props":128,"children":129},{},[130],{"type":60,"tag":92,"props":131,"children":132},{},[133],{"type":65,"value":134},"Signals that favor delegating:",{"type":60,"tag":136,"props":137,"children":138},"ul",{},[139,150,168,178,196],{"type":60,"tag":140,"props":141,"children":142},"li",{},[143,148],{"type":60,"tag":92,"props":144,"children":145},{},[146],{"type":65,"value":147},"Airflow upgrades, migrations, runtime\u002Fprovider compat questions.",{"type":65,"value":149}," Otto carries Astronomer's compatibility knowledge base — breaking changes per Airflow version, provider version matrices, runtime → Airflow mappings, known incidents. Generic agents don't have this and will often fabricate plausible-sounding answers.",{"type":60,"tag":140,"props":151,"children":152},{},[153,158,160,166],{"type":60,"tag":92,"props":154,"children":155},{},[156],{"type":65,"value":157},"Live-Airflow investigation.",{"type":65,"value":159}," Production failure diagnosis, run-history analysis, log triage. Otto's ",{"type":60,"tag":83,"props":161,"children":163},{"className":162},[],[164],{"type":65,"value":165},"af",{"type":65,"value":167}," tooling against a connected Airflow is wired up and bundled with debugging skills; replicating it ad-hoc in the parent session is wasteful.",{"type":60,"tag":140,"props":169,"children":170},{},[171,176],{"type":60,"tag":92,"props":172,"children":173},{},[174],{"type":65,"value":175},"Long, self-contained subtasks.",{"type":65,"value":177}," Full-repo audits, fleet-wide DAG analysis, upgrade scans — work that would burn tens of thousands of tokens of parent context. Delegating keeps the parent thread cheap and the result is one summary back, not a turn-by-turn trace.",{"type":60,"tag":140,"props":179,"children":180},{},[181,186,188,194],{"type":60,"tag":92,"props":182,"children":183},{},[184],{"type":65,"value":185},"Parallel branches.",{"type":65,"value":187}," Use ",{"type":60,"tag":83,"props":189,"children":191},{"className":190},[],[192],{"type":65,"value":193},"--fork",{"type":65,"value":195}," to explore an alternative (\"what if we used Cosmos here?\") without polluting the main thread.",{"type":60,"tag":140,"props":197,"children":198},{},[199,204,206,212,214,220,222,228,230,236],{"type":60,"tag":92,"props":200,"children":201},{},[202],{"type":65,"value":203},"Tasks that lean on team memory.",{"type":65,"value":205}," Otto reads ",{"type":60,"tag":83,"props":207,"children":209},{"className":208},[],[210],{"type":65,"value":211},".astro\u002Fmemory\u002F",{"type":65,"value":213}," (committed) and ",{"type":60,"tag":83,"props":215,"children":217},{"className":216},[],[218],{"type":65,"value":219},"~\u002F.astro\u002Fmemory\u002F\u003Cproject-slug>\u002F",{"type":65,"value":221}," (local), and accumulates new memories via ",{"type":60,"tag":83,"props":223,"children":225},{"className":224},[],[226],{"type":65,"value":227},"\u002Fremember",{"type":65,"value":229}," and ",{"type":60,"tag":83,"props":231,"children":233},{"className":232},[],[234],{"type":65,"value":235},"\u002Fbootstrap",{"type":65,"value":237},". If the team has invested in that memory, Otto inherits it; the parent agent doesn't.",{"type":60,"tag":68,"props":239,"children":240},{},[241],{"type":60,"tag":92,"props":242,"children":243},{},[244],{"type":65,"value":245},"Signals against delegating:",{"type":60,"tag":136,"props":247,"children":248},{},[249,254,259,264],{"type":60,"tag":140,"props":250,"children":251},{},[252],{"type":65,"value":253},"The task is small or single-tool — direct execution is cheaper than a session round-trip.",{"type":60,"tag":140,"props":255,"children":256},{},[257],{"type":65,"value":258},"The task depends on parent context (recent conversation, files just read, in-flight todos) that Otto doesn't have. Briefing Otto would cost more than just doing the work.",{"type":60,"tag":140,"props":260,"children":261},{},[262],{"type":65,"value":263},"The task needs to integrate with the parent's plan\u002Ftodo state — handing off loses that thread.",{"type":60,"tag":140,"props":265,"children":266},{},[267,269,274],{"type":65,"value":268},"The task requires ",{"type":60,"tag":83,"props":270,"children":272},{"className":271},[],[273],{"type":65,"value":165},{"type":65,"value":275}," against a connected Airflow but none is running and starting one isn't appropriate.",{"type":60,"tag":68,"props":277,"children":278},{},[279],{"type":65,"value":280},"When a task hits multiple favoring signals (e.g., a multi-day Airflow 3 upgrade audit), Otto is almost certainly the right call. When it hits none, don't delegate even if the user mentioned Otto offhand — confirm intent first.",{"type":60,"tag":121,"props":282,"children":284},{"id":283},"how-to-use-this-skill-check-what-else-is-loaded-first",[285],{"type":65,"value":286},"How to use this skill: check what else is loaded first",{"type":60,"tag":68,"props":288,"children":289},{},[290],{"type":65,"value":291},"This skill behaves differently depending on which other skills are loaded in the current session. Scan the loaded skills list before deciding.",{"type":60,"tag":293,"props":294,"children":296},"h3",{"id":295},"when-sibling-skills-are-loaded",[297],{"type":65,"value":298},"When sibling skills are loaded",{"type":60,"tag":68,"props":300,"children":301},{},[302,304,309,311,317,318,324,325,331,332,338,339,345,346,352,354,360],{"type":65,"value":303},"If you see other Astronomer skills loaded (",{"type":60,"tag":83,"props":305,"children":307},{"className":306},[],[308],{"type":65,"value":14},{"type":65,"value":310},", ",{"type":60,"tag":83,"props":312,"children":314},{"className":313},[],[315],{"type":65,"value":316},"authoring-dags",{"type":65,"value":310},{"type":60,"tag":83,"props":319,"children":321},{"className":320},[],[322],{"type":65,"value":323},"debugging-dags",{"type":65,"value":310},{"type":60,"tag":83,"props":326,"children":328},{"className":327},[],[329],{"type":65,"value":330},"migrating-airflow-2-to-3",{"type":65,"value":310},{"type":60,"tag":83,"props":333,"children":335},{"className":334},[],[336],{"type":65,"value":337},"analyzing-data",{"type":65,"value":310},{"type":60,"tag":83,"props":340,"children":342},{"className":341},[],[343],{"type":65,"value":344},"checking-freshness",{"type":65,"value":310},{"type":60,"tag":83,"props":347,"children":349},{"className":348},[],[350],{"type":65,"value":351},"tracing-upstream-lineage",{"type":65,"value":353},", etc.), the user has the full ",{"type":60,"tag":83,"props":355,"children":357},{"className":356},[],[358],{"type":65,"value":359},"astronomer-data",{"type":65,"value":361}," plugin. Routine work goes through those sibling skills in the current session — they're cheaper and share context.",{"type":60,"tag":68,"props":363,"children":364},{},[365,370],{"type":60,"tag":92,"props":366,"children":367},{},[368],{"type":65,"value":369},"Reserve this skill for explicit Otto delegation",{"type":65,"value":371}," (user names Otto), with one carve-out below.",{"type":60,"tag":373,"props":374,"children":375},"table",{},[376,400],{"type":60,"tag":377,"props":378,"children":379},"thead",{},[380],{"type":60,"tag":381,"props":382,"children":383},"tr",{},[384,390,395],{"type":60,"tag":385,"props":386,"children":387},"th",{},[388],{"type":65,"value":389},"User intent",{"type":60,"tag":385,"props":391,"children":392},{},[393],{"type":65,"value":394},"Use this skill?",{"type":60,"tag":385,"props":396,"children":397},{},[398],{"type":65,"value":399},"Use instead",{"type":60,"tag":401,"props":402,"children":403},"tbody",{},[404,436,458,479,497,515,531],{"type":60,"tag":381,"props":405,"children":406},{},[407,413,418],{"type":60,"tag":408,"props":409,"children":410},"td",{},[411],{"type":65,"value":412},"\"What DAGs are broken?\"",{"type":60,"tag":408,"props":414,"children":415},{},[416],{"type":65,"value":417},"❌ No",{"type":60,"tag":408,"props":419,"children":420},{},[421,426,428,434],{"type":60,"tag":83,"props":422,"children":424},{"className":423},[],[425],{"type":65,"value":14},{"type":65,"value":427}," skill (",{"type":60,"tag":83,"props":429,"children":431},{"className":430},[],[432],{"type":65,"value":433},"af dags errors",{"type":65,"value":435},")",{"type":60,"tag":381,"props":437,"children":438},{},[439,444,448],{"type":60,"tag":408,"props":440,"children":441},{},[442],{"type":65,"value":443},"\"Write a new DAG that ingests X\"",{"type":60,"tag":408,"props":445,"children":446},{},[447],{"type":65,"value":417},{"type":60,"tag":408,"props":449,"children":450},{},[451,456],{"type":60,"tag":83,"props":452,"children":454},{"className":453},[],[455],{"type":65,"value":316},{"type":65,"value":457}," skill",{"type":60,"tag":381,"props":459,"children":460},{},[461,466,470],{"type":60,"tag":408,"props":462,"children":463},{},[464],{"type":65,"value":465},"\"Why did my run fail?\"",{"type":60,"tag":408,"props":467,"children":468},{},[469],{"type":65,"value":417},{"type":60,"tag":408,"props":471,"children":472},{},[473,478],{"type":60,"tag":83,"props":474,"children":476},{"className":475},[],[477],{"type":65,"value":323},{"type":65,"value":457},{"type":60,"tag":381,"props":480,"children":481},{},[482,487,492],{"type":60,"tag":408,"props":483,"children":484},{},[485],{"type":65,"value":486},"\"Plan the Airflow 3 upgrade\"",{"type":60,"tag":408,"props":488,"children":489},{},[490],{"type":65,"value":491},"⚠️ Offer Otto first",{"type":60,"tag":408,"props":493,"children":494},{},[495],{"type":65,"value":496},"See carve-out below",{"type":60,"tag":381,"props":498,"children":499},{},[500,505,510],{"type":60,"tag":408,"props":501,"children":502},{},[503],{"type":65,"value":504},"\"Use Otto to plan the AF3 upgrade\"",{"type":60,"tag":408,"props":506,"children":507},{},[508],{"type":65,"value":509},"✅ Yes",{"type":60,"tag":408,"props":511,"children":512},{},[513],{"type":65,"value":514},"This skill",{"type":60,"tag":381,"props":516,"children":517},{},[518,523,527],{"type":60,"tag":408,"props":519,"children":520},{},[521],{"type":65,"value":522},"\"Delegate the AF3 audit to Otto\"",{"type":60,"tag":408,"props":524,"children":525},{},[526],{"type":65,"value":509},{"type":60,"tag":408,"props":528,"children":529},{},[530],{"type":65,"value":514},{"type":60,"tag":381,"props":532,"children":533},{},[534,539,543],{"type":60,"tag":408,"props":535,"children":536},{},[537],{"type":65,"value":538},"\"Fork an Otto session to try a different approach\"",{"type":60,"tag":408,"props":540,"children":541},{},[542],{"type":65,"value":509},{"type":60,"tag":408,"props":544,"children":545},{},[546],{"type":65,"value":514},{"type":60,"tag":548,"props":549,"children":551},"h4",{"id":550},"carve-out-airflow-2-3-migrations",[552],{"type":65,"value":553},"Carve-out: Airflow 2 → 3 migrations",{"type":60,"tag":68,"props":555,"children":556},{},[557,559,564],{"type":65,"value":558},"Otto's bundled migration capability draws on Astronomer's proprietary compatibility KB (breaking changes, provider matrices, runtime mappings, known incidents) and consistently produces a better upgrade plan than the local ",{"type":60,"tag":83,"props":560,"children":562},{"className":561},[],[563],{"type":65,"value":330},{"type":65,"value":565}," skill on its own.",{"type":60,"tag":68,"props":567,"children":568},{},[569,574],{"type":60,"tag":92,"props":570,"children":571},{},[572],{"type":65,"value":573},"If the user asks about an AF2→3 upgrade without naming Otto, offer to delegate to Otto first.",{"type":65,"value":575}," Short ask:",{"type":60,"tag":100,"props":577,"children":578},{},[579],{"type":60,"tag":68,"props":580,"children":581},{},[582],{"type":65,"value":583},"\"Otto's bundled migration skill pulls from Astronomer's compatibility KB and tends to catch more breaking changes than the local skill. Want me to run this through Otto?\"",{"type":60,"tag":68,"props":585,"children":586},{},[587,589,594],{"type":65,"value":588},"If they accept, use this skill. If they decline, fall back to ",{"type":60,"tag":83,"props":590,"children":592},{"className":591},[],[593],{"type":65,"value":330},{"type":65,"value":595},".",{"type":60,"tag":293,"props":597,"children":599},{"id":598},"when-sibling-skills-arent-loaded",[600],{"type":65,"value":601},"When sibling skills aren't loaded",{"type":60,"tag":68,"props":603,"children":604},{},[605,607,612],{"type":65,"value":606},"If this is the only Astronomer\u002FAirflow\u002Fdata-engineering skill in the loaded skills list, the user has set up their environment for Otto-as-default. ",{"type":60,"tag":92,"props":608,"children":609},{},[610],{"type":65,"value":611},"Proactively invoke Otto",{"type":65,"value":613}," for any Airflow, dbt, or warehouse task — DAG authoring, debugging, upgrades, profiling, lineage, deploys. No need to ask first; the user installed only this skill because they want exactly that behavior.",{"type":60,"tag":121,"props":615,"children":617},{"id":616},"quick-invocation",[618],{"type":65,"value":619},"Quick invocation",{"type":60,"tag":621,"props":622,"children":627},"pre",{"className":623,"code":624,"language":625,"meta":626,"style":626},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Default: one-shot, plain text output to stdout\nastro otto --mode text \"your prompt here\"\n\n# Read-only \u002F planning sandbox — safest for audits and investigations\nastro otto --mode text --permission-mode plan \"audit this DAG\"\n\n# Narrow tool surface — Otto only sees what's in the allowlist\nastro otto --mode text --allowed-tools af,bash,read,grep \"diagnose dag X\"\n\n# Machine-parseable events for scripting and chaining\nastro otto --mode json \"your prompt here\"\n","bash","",[628],{"type":60,"tag":83,"props":629,"children":630},{"__ignoreMap":626},[631,643,685,695,704,747,755,764,807,815,824],{"type":60,"tag":632,"props":633,"children":636},"span",{"class":634,"line":635},"line",1,[637],{"type":60,"tag":632,"props":638,"children":640},{"style":639},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[641],{"type":65,"value":642},"# Default: one-shot, plain text output to stdout\n",{"type":60,"tag":632,"props":644,"children":646},{"class":634,"line":645},2,[647,653,659,664,669,675,680],{"type":60,"tag":632,"props":648,"children":650},{"style":649},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[651],{"type":65,"value":652},"astro",{"type":60,"tag":632,"props":654,"children":656},{"style":655},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[657],{"type":65,"value":658}," otto",{"type":60,"tag":632,"props":660,"children":661},{"style":655},[662],{"type":65,"value":663}," --mode",{"type":60,"tag":632,"props":665,"children":666},{"style":655},[667],{"type":65,"value":668}," text",{"type":60,"tag":632,"props":670,"children":672},{"style":671},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[673],{"type":65,"value":674}," \"",{"type":60,"tag":632,"props":676,"children":677},{"style":655},[678],{"type":65,"value":679},"your prompt here",{"type":60,"tag":632,"props":681,"children":682},{"style":671},[683],{"type":65,"value":684},"\"\n",{"type":60,"tag":632,"props":686,"children":688},{"class":634,"line":687},3,[689],{"type":60,"tag":632,"props":690,"children":692},{"emptyLinePlaceholder":691},true,[693],{"type":65,"value":694},"\n",{"type":60,"tag":632,"props":696,"children":698},{"class":634,"line":697},4,[699],{"type":60,"tag":632,"props":700,"children":701},{"style":639},[702],{"type":65,"value":703},"# Read-only \u002F planning sandbox — safest for audits and investigations\n",{"type":60,"tag":632,"props":705,"children":707},{"class":634,"line":706},5,[708,712,716,720,724,729,734,738,743],{"type":60,"tag":632,"props":709,"children":710},{"style":649},[711],{"type":65,"value":652},{"type":60,"tag":632,"props":713,"children":714},{"style":655},[715],{"type":65,"value":658},{"type":60,"tag":632,"props":717,"children":718},{"style":655},[719],{"type":65,"value":663},{"type":60,"tag":632,"props":721,"children":722},{"style":655},[723],{"type":65,"value":668},{"type":60,"tag":632,"props":725,"children":726},{"style":655},[727],{"type":65,"value":728}," --permission-mode",{"type":60,"tag":632,"props":730,"children":731},{"style":655},[732],{"type":65,"value":733}," plan",{"type":60,"tag":632,"props":735,"children":736},{"style":671},[737],{"type":65,"value":674},{"type":60,"tag":632,"props":739,"children":740},{"style":655},[741],{"type":65,"value":742},"audit this DAG",{"type":60,"tag":632,"props":744,"children":745},{"style":671},[746],{"type":65,"value":684},{"type":60,"tag":632,"props":748,"children":750},{"class":634,"line":749},6,[751],{"type":60,"tag":632,"props":752,"children":753},{"emptyLinePlaceholder":691},[754],{"type":65,"value":694},{"type":60,"tag":632,"props":756,"children":758},{"class":634,"line":757},7,[759],{"type":60,"tag":632,"props":760,"children":761},{"style":639},[762],{"type":65,"value":763},"# Narrow tool surface — Otto only sees what's in the allowlist\n",{"type":60,"tag":632,"props":765,"children":767},{"class":634,"line":766},8,[768,772,776,780,784,789,794,798,803],{"type":60,"tag":632,"props":769,"children":770},{"style":649},[771],{"type":65,"value":652},{"type":60,"tag":632,"props":773,"children":774},{"style":655},[775],{"type":65,"value":658},{"type":60,"tag":632,"props":777,"children":778},{"style":655},[779],{"type":65,"value":663},{"type":60,"tag":632,"props":781,"children":782},{"style":655},[783],{"type":65,"value":668},{"type":60,"tag":632,"props":785,"children":786},{"style":655},[787],{"type":65,"value":788}," --allowed-tools",{"type":60,"tag":632,"props":790,"children":791},{"style":655},[792],{"type":65,"value":793}," af,bash,read,grep",{"type":60,"tag":632,"props":795,"children":796},{"style":671},[797],{"type":65,"value":674},{"type":60,"tag":632,"props":799,"children":800},{"style":655},[801],{"type":65,"value":802},"diagnose dag X",{"type":60,"tag":632,"props":804,"children":805},{"style":671},[806],{"type":65,"value":684},{"type":60,"tag":632,"props":808,"children":810},{"class":634,"line":809},9,[811],{"type":60,"tag":632,"props":812,"children":813},{"emptyLinePlaceholder":691},[814],{"type":65,"value":694},{"type":60,"tag":632,"props":816,"children":818},{"class":634,"line":817},10,[819],{"type":60,"tag":632,"props":820,"children":821},{"style":639},[822],{"type":65,"value":823},"# Machine-parseable events for scripting and chaining\n",{"type":60,"tag":632,"props":825,"children":827},{"class":634,"line":826},11,[828,832,836,840,845,849,853],{"type":60,"tag":632,"props":829,"children":830},{"style":649},[831],{"type":65,"value":652},{"type":60,"tag":632,"props":833,"children":834},{"style":655},[835],{"type":65,"value":658},{"type":60,"tag":632,"props":837,"children":838},{"style":655},[839],{"type":65,"value":663},{"type":60,"tag":632,"props":841,"children":842},{"style":655},[843],{"type":65,"value":844}," json",{"type":60,"tag":632,"props":846,"children":847},{"style":671},[848],{"type":65,"value":674},{"type":60,"tag":632,"props":850,"children":851},{"style":655},[852],{"type":65,"value":679},{"type":60,"tag":632,"props":854,"children":855},{"style":671},[856],{"type":65,"value":684},{"type":60,"tag":68,"props":858,"children":859},{},[860,862,868,869,874,875,881,882,888,890,896,898,904],{"type":65,"value":861},"For session continuity (",{"type":60,"tag":83,"props":863,"children":865},{"className":864},[],[866],{"type":65,"value":867},"-c",{"type":65,"value":310},{"type":60,"tag":83,"props":870,"children":872},{"className":871},[],[873],{"type":65,"value":193},{"type":65,"value":310},{"type":60,"tag":83,"props":876,"children":878},{"className":877},[],[879],{"type":65,"value":880},"--session",{"type":65,"value":310},{"type":60,"tag":83,"props":883,"children":885},{"className":884},[],[886],{"type":65,"value":887},"--no-session",{"type":65,"value":889},"), see ",{"type":60,"tag":72,"props":891,"children":893},{"href":892},"#session-control",[894],{"type":65,"value":895},"Session control",{"type":65,"value":897},". For model and thinking-level selection, see ",{"type":60,"tag":72,"props":899,"children":901},{"href":900},"#model-and-reasoning-selection",[902],{"type":65,"value":903},"Model and reasoning selection",{"type":65,"value":595},{"type":60,"tag":121,"props":906,"children":908},{"id":907},"session-control",[909],{"type":65,"value":895},{"type":60,"tag":68,"props":911,"children":912},{},[913],{"type":65,"value":914},"Sessions persist on disk per working directory.",{"type":60,"tag":373,"props":916,"children":917},{},[918,934],{"type":60,"tag":377,"props":919,"children":920},{},[921],{"type":60,"tag":381,"props":922,"children":923},{},[924,929],{"type":60,"tag":385,"props":925,"children":926},{},[927],{"type":65,"value":928},"Flag",{"type":60,"tag":385,"props":930,"children":931},{},[932],{"type":65,"value":933},"Behavior",{"type":60,"tag":401,"props":935,"children":936},{},[937,960,984,1001,1018,1034],{"type":60,"tag":381,"props":938,"children":939},{},[940,955],{"type":60,"tag":408,"props":941,"children":942},{},[943,948,949],{"type":60,"tag":83,"props":944,"children":946},{"className":945},[],[947],{"type":65,"value":867},{"type":65,"value":310},{"type":60,"tag":83,"props":950,"children":952},{"className":951},[],[953],{"type":65,"value":954},"--continue",{"type":60,"tag":408,"props":956,"children":957},{},[958],{"type":65,"value":959},"Resume the most recent session in this directory",{"type":60,"tag":381,"props":961,"children":962},{},[963,979],{"type":60,"tag":408,"props":964,"children":965},{},[966,972,973],{"type":60,"tag":83,"props":967,"children":969},{"className":968},[],[970],{"type":65,"value":971},"-r",{"type":65,"value":310},{"type":60,"tag":83,"props":974,"children":976},{"className":975},[],[977],{"type":65,"value":978},"--resume",{"type":60,"tag":408,"props":980,"children":981},{},[982],{"type":65,"value":983},"Open the interactive session picker",{"type":60,"tag":381,"props":985,"children":986},{},[987,996],{"type":60,"tag":408,"props":988,"children":989},{},[990],{"type":60,"tag":83,"props":991,"children":993},{"className":992},[],[994],{"type":65,"value":995},"--session \u003Cid|path>",{"type":60,"tag":408,"props":997,"children":998},{},[999],{"type":65,"value":1000},"Open a specific session — accepts 8+ char id prefix or full path",{"type":60,"tag":381,"props":1002,"children":1003},{},[1004,1013],{"type":60,"tag":408,"props":1005,"children":1006},{},[1007],{"type":60,"tag":83,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":65,"value":1012},"--fork \u003Cid|path>",{"type":60,"tag":408,"props":1014,"children":1015},{},[1016],{"type":65,"value":1017},"Fork a session into a fresh copy; original is untouched. Use to try an alternative approach without polluting the main thread.",{"type":60,"tag":381,"props":1019,"children":1020},{},[1021,1029],{"type":60,"tag":408,"props":1022,"children":1023},{},[1024],{"type":60,"tag":83,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":65,"value":887},{"type":60,"tag":408,"props":1030,"children":1031},{},[1032],{"type":65,"value":1033},"In-memory only, leaves no trace on disk. Use for one-off questions.",{"type":60,"tag":381,"props":1035,"children":1036},{},[1037,1046],{"type":60,"tag":408,"props":1038,"children":1039},{},[1040],{"type":60,"tag":83,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":65,"value":1045},"--export \u003Cid|path>",{"type":60,"tag":408,"props":1047,"children":1048},{},[1049],{"type":65,"value":1050},"Render an existing session to HTML and exit",{"type":60,"tag":121,"props":1052,"children":1054},{"id":1053},"mode-selection",[1055],{"type":65,"value":1056},"Mode selection",{"type":60,"tag":373,"props":1058,"children":1059},{},[1060,1075],{"type":60,"tag":377,"props":1061,"children":1062},{},[1063],{"type":60,"tag":381,"props":1064,"children":1065},{},[1066,1070],{"type":60,"tag":385,"props":1067,"children":1068},{},[1069],{"type":65,"value":928},{"type":60,"tag":385,"props":1071,"children":1072},{},[1073],{"type":65,"value":1074},"When to use",{"type":60,"tag":401,"props":1076,"children":1077},{},[1078,1095],{"type":60,"tag":381,"props":1079,"children":1080},{},[1081,1090],{"type":60,"tag":408,"props":1082,"children":1083},{},[1084],{"type":60,"tag":83,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":65,"value":1089},"--mode text",{"type":60,"tag":408,"props":1091,"children":1092},{},[1093],{"type":65,"value":1094},"Default. Streams plain text to stdout.",{"type":60,"tag":381,"props":1096,"children":1097},{},[1098,1107],{"type":60,"tag":408,"props":1099,"children":1100},{},[1101],{"type":60,"tag":83,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":65,"value":1106},"--mode json",{"type":60,"tag":408,"props":1108,"children":1109},{},[1110],{"type":65,"value":1111},"Machine-parseable events for scripting or chaining.",{"type":60,"tag":68,"props":1113,"children":1114},{},[1115,1117,1123,1125,1131],{"type":65,"value":1116},"For text mode, streaming auto-detects by TTY. Force with ",{"type":60,"tag":83,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":65,"value":1122},"--stream",{"type":65,"value":1124}," \u002F ",{"type":60,"tag":83,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":65,"value":1130},"--no-stream",{"type":65,"value":595},{"type":60,"tag":121,"props":1133,"children":1135},{"id":1134},"permission-modes",[1136],{"type":65,"value":1137},"Permission modes",{"type":60,"tag":68,"props":1139,"children":1140},{},[1141],{"type":65,"value":1142},"Otto can write files and run shell commands. Match the permission mode to the task's risk profile.",{"type":60,"tag":373,"props":1144,"children":1145},{},[1146,1161],{"type":60,"tag":377,"props":1147,"children":1148},{},[1149],{"type":60,"tag":381,"props":1150,"children":1151},{},[1152,1157],{"type":60,"tag":385,"props":1153,"children":1154},{},[1155],{"type":65,"value":1156},"Mode",{"type":60,"tag":385,"props":1158,"children":1159},{},[1160],{"type":65,"value":933},{"type":60,"tag":401,"props":1162,"children":1163},{},[1164,1195,1280,1317,1354],{"type":60,"tag":381,"props":1165,"children":1166},{},[1167,1176],{"type":60,"tag":408,"props":1168,"children":1169},{},[1170],{"type":60,"tag":83,"props":1171,"children":1173},{"className":1172},[],[1174],{"type":65,"value":1175},"default",{"type":60,"tag":408,"props":1177,"children":1178},{},[1179,1181,1186,1188,1193],{"type":65,"value":1180},"Tools allowed\u002Fdenied\u002Fprompted by configured rules. Otto asks before destructive ",{"type":60,"tag":83,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":65,"value":652},{"type":65,"value":1187},"\u002F",{"type":60,"tag":83,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":65,"value":165},{"type":65,"value":1194}," commands.",{"type":60,"tag":381,"props":1196,"children":1197},{},[1198,1207],{"type":60,"tag":408,"props":1199,"children":1200},{},[1201],{"type":60,"tag":83,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":65,"value":1206},"plan",{"type":60,"tag":408,"props":1208,"children":1209},{},[1210,1215,1217,1223,1224,1230,1232,1237,1239,1245,1246,1252,1253,1259,1260,1266,1267,1272,1273,1278],{"type":60,"tag":92,"props":1211,"children":1212},{},[1213],{"type":65,"value":1214},"Read-only sandbox.",{"type":65,"value":1216}," Blocks ",{"type":60,"tag":83,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":65,"value":1222},"edit",{"type":65,"value":229},{"type":60,"tag":83,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":65,"value":1229},"write",{"type":65,"value":1231}," entirely. Restricts ",{"type":60,"tag":83,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":65,"value":625},{"type":65,"value":1238}," to a read-only allowlist (",{"type":60,"tag":83,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":65,"value":1244},"ls",{"type":65,"value":310},{"type":60,"tag":83,"props":1247,"children":1249},{"className":1248},[],[1250],{"type":65,"value":1251},"cat",{"type":65,"value":310},{"type":60,"tag":83,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":65,"value":1258},"git",{"type":65,"value":310},{"type":60,"tag":83,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":65,"value":1265},"rg",{"type":65,"value":310},{"type":60,"tag":83,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":65,"value":165},{"type":65,"value":310},{"type":60,"tag":83,"props":1274,"children":1276},{"className":1275},[],[1277],{"type":65,"value":652},{"type":65,"value":1279},", etc.). Use this for audits, planning, and investigation.",{"type":60,"tag":381,"props":1281,"children":1282},{},[1283,1292],{"type":60,"tag":408,"props":1284,"children":1285},{},[1286],{"type":60,"tag":83,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":65,"value":1291},"acceptEdits",{"type":60,"tag":408,"props":1293,"children":1294},{},[1295,1297,1302,1303,1308,1310,1315],{"type":65,"value":1296},"Auto-allows ",{"type":60,"tag":83,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":65,"value":1222},{"type":65,"value":229},{"type":60,"tag":83,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":65,"value":1229},{"type":65,"value":1309}," ",{"type":60,"tag":92,"props":1311,"children":1312},{},[1313],{"type":65,"value":1314},"inside the project folder",{"type":65,"value":1316},". Other tools fall through to normal rules.",{"type":60,"tag":381,"props":1318,"children":1319},{},[1320,1329],{"type":60,"tag":408,"props":1321,"children":1322},{},[1323],{"type":60,"tag":83,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":65,"value":1328},"confirmEdits",{"type":60,"tag":408,"props":1330,"children":1331},{},[1332,1334,1339,1340,1345,1347,1352],{"type":65,"value":1333},"Prompts before every ",{"type":60,"tag":83,"props":1335,"children":1337},{"className":1336},[],[1338],{"type":65,"value":1222},{"type":65,"value":310},{"type":60,"tag":83,"props":1341,"children":1343},{"className":1342},[],[1344],{"type":65,"value":1229},{"type":65,"value":1346},", or non-read-only ",{"type":60,"tag":83,"props":1348,"children":1350},{"className":1349},[],[1351],{"type":65,"value":625},{"type":65,"value":1353},". Allow rules can't bypass the prompt.",{"type":60,"tag":381,"props":1355,"children":1356},{},[1357,1366],{"type":60,"tag":408,"props":1358,"children":1359},{},[1360],{"type":60,"tag":83,"props":1361,"children":1363},{"className":1362},[],[1364],{"type":65,"value":1365},"bypassPermissions",{"type":60,"tag":408,"props":1367,"children":1368},{},[1369],{"type":65,"value":1370},"Allows everything except bypass-immune safety checks (see below).",{"type":60,"tag":68,"props":1372,"children":1373},{},[1374,1376,1382,1384,1389],{"type":65,"value":1375},"Pair ",{"type":60,"tag":83,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":65,"value":1381},"--permission-mode plan",{"type":65,"value":1383}," with ",{"type":60,"tag":83,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":65,"value":1089},{"type":65,"value":1390}," for the safest one-shot: Otto can read but cannot mutate.",{"type":60,"tag":68,"props":1392,"children":1393},{},[1394,1400,1402,1408],{"type":60,"tag":83,"props":1395,"children":1397},{"className":1396},[],[1398],{"type":65,"value":1399},"--skip-permissions",{"type":65,"value":1401}," is sticky for the whole session and stronger than ",{"type":60,"tag":83,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":65,"value":1407},"--permission-mode bypassPermissions",{"type":65,"value":1409},". Avoid unless the user explicitly asks.",{"type":60,"tag":293,"props":1411,"children":1413},{"id":1412},"bypass-immune-safety-checks",[1414],{"type":65,"value":1415},"Bypass-immune safety checks",{"type":60,"tag":68,"props":1417,"children":1418},{},[1419,1421,1438],{"type":65,"value":1420},"These fire ",{"type":60,"tag":92,"props":1422,"children":1423},{},[1424,1426,1431,1433],{"type":65,"value":1425},"even in ",{"type":60,"tag":83,"props":1427,"children":1429},{"className":1428},[],[1430],{"type":65,"value":1365},{"type":65,"value":1432}," mode and even with ",{"type":60,"tag":83,"props":1434,"children":1436},{"className":1435},[],[1437],{"type":65,"value":1399},{"type":65,"value":1439},":",{"type":60,"tag":136,"props":1441,"children":1442},{},[1443,1470,1475],{"type":60,"tag":140,"props":1444,"children":1445},{},[1446,1448,1454,1455,1461,1462,1468],{"type":65,"value":1447},"Reads\u002Fwrites to sensitive files: ",{"type":60,"tag":83,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":65,"value":1453},".env*",{"type":65,"value":310},{"type":60,"tag":83,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":65,"value":1460},"~\u002F.ssh\u002F**",{"type":65,"value":310},{"type":60,"tag":83,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":65,"value":1467},"~\u002F.aws\u002F**",{"type":65,"value":1469},", shell rc files",{"type":60,"tag":140,"props":1471,"children":1472},{},[1473],{"type":65,"value":1474},"Out-of-project writes (paths outside the project root)",{"type":60,"tag":140,"props":1476,"children":1477},{},[1478,1480,1486,1487,1493,1494,1500,1501,1507,1508,1514,1515,1521,1522,1528,1529,1535],{"type":65,"value":1479},"Destructive Astro\u002FAirflow commands: ",{"type":60,"tag":83,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":65,"value":1485},"astro deploy",{"type":65,"value":310},{"type":60,"tag":83,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":65,"value":1492},"astro deployment delete",{"type":65,"value":310},{"type":60,"tag":83,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":65,"value":1499},"astro dev kill",{"type":65,"value":310},{"type":60,"tag":83,"props":1502,"children":1504},{"className":1503},[],[1505],{"type":65,"value":1506},"af dags delete",{"type":65,"value":310},{"type":60,"tag":83,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":65,"value":1513},"af runs delete",{"type":65,"value":310},{"type":60,"tag":83,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":65,"value":1520},"af tasks clear",{"type":65,"value":310},{"type":60,"tag":83,"props":1523,"children":1525},{"className":1524},[],[1526],{"type":65,"value":1527},"af connections delete",{"type":65,"value":310},{"type":60,"tag":83,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":65,"value":1534},"af variables delete",{"type":65,"value":1536},", etc.",{"type":60,"tag":68,"props":1538,"children":1539},{},[1540,1542,1547],{"type":65,"value":1541},"Don't assume ",{"type":60,"tag":83,"props":1543,"children":1545},{"className":1544},[],[1546],{"type":65,"value":1399},{"type":65,"value":1548}," makes Otto fully unattended.",{"type":60,"tag":121,"props":1550,"children":1552},{"id":1551},"tool-allowlists",[1553],{"type":65,"value":1554},"Tool allowlists",{"type":60,"tag":68,"props":1556,"children":1557},{},[1558,1564],{"type":60,"tag":83,"props":1559,"children":1561},{"className":1560},[],[1562],{"type":65,"value":1563},"--allowed-tools \u003Ccsv>",{"type":65,"value":1565}," removes everything outside the list from Otto's view entirely. Useful for narrow tasks:",{"type":60,"tag":621,"props":1567,"children":1569},{"className":623,"code":1568,"language":625,"meta":626,"style":626},"# Only let Otto query Airflow and read files\nastro otto --mode text --allowed-tools af,read,grep,find \\\n  \"diagnose why model_orders failed yesterday\"\n\n# Only let Otto run af and shell — no editing\nastro otto --mode text --allowed-tools af,bash \\\n  \"list all paused production DAGs and their owners\"\n",[1570],{"type":60,"tag":83,"props":1571,"children":1572},{"__ignoreMap":626},[1573,1581,1615,1632,1639,1647,1679],{"type":60,"tag":632,"props":1574,"children":1575},{"class":634,"line":635},[1576],{"type":60,"tag":632,"props":1577,"children":1578},{"style":639},[1579],{"type":65,"value":1580},"# Only let Otto query Airflow and read files\n",{"type":60,"tag":632,"props":1582,"children":1583},{"class":634,"line":645},[1584,1588,1592,1596,1600,1604,1609],{"type":60,"tag":632,"props":1585,"children":1586},{"style":649},[1587],{"type":65,"value":652},{"type":60,"tag":632,"props":1589,"children":1590},{"style":655},[1591],{"type":65,"value":658},{"type":60,"tag":632,"props":1593,"children":1594},{"style":655},[1595],{"type":65,"value":663},{"type":60,"tag":632,"props":1597,"children":1598},{"style":655},[1599],{"type":65,"value":668},{"type":60,"tag":632,"props":1601,"children":1602},{"style":655},[1603],{"type":65,"value":788},{"type":60,"tag":632,"props":1605,"children":1606},{"style":655},[1607],{"type":65,"value":1608}," af,read,grep,find",{"type":60,"tag":632,"props":1610,"children":1612},{"style":1611},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1613],{"type":65,"value":1614}," \\\n",{"type":60,"tag":632,"props":1616,"children":1617},{"class":634,"line":687},[1618,1623,1628],{"type":60,"tag":632,"props":1619,"children":1620},{"style":671},[1621],{"type":65,"value":1622},"  \"",{"type":60,"tag":632,"props":1624,"children":1625},{"style":655},[1626],{"type":65,"value":1627},"diagnose why model_orders failed yesterday",{"type":60,"tag":632,"props":1629,"children":1630},{"style":671},[1631],{"type":65,"value":684},{"type":60,"tag":632,"props":1633,"children":1634},{"class":634,"line":697},[1635],{"type":60,"tag":632,"props":1636,"children":1637},{"emptyLinePlaceholder":691},[1638],{"type":65,"value":694},{"type":60,"tag":632,"props":1640,"children":1641},{"class":634,"line":706},[1642],{"type":60,"tag":632,"props":1643,"children":1644},{"style":639},[1645],{"type":65,"value":1646},"# Only let Otto run af and shell — no editing\n",{"type":60,"tag":632,"props":1648,"children":1649},{"class":634,"line":749},[1650,1654,1658,1662,1666,1670,1675],{"type":60,"tag":632,"props":1651,"children":1652},{"style":649},[1653],{"type":65,"value":652},{"type":60,"tag":632,"props":1655,"children":1656},{"style":655},[1657],{"type":65,"value":658},{"type":60,"tag":632,"props":1659,"children":1660},{"style":655},[1661],{"type":65,"value":663},{"type":60,"tag":632,"props":1663,"children":1664},{"style":655},[1665],{"type":65,"value":668},{"type":60,"tag":632,"props":1667,"children":1668},{"style":655},[1669],{"type":65,"value":788},{"type":60,"tag":632,"props":1671,"children":1672},{"style":655},[1673],{"type":65,"value":1674}," af,bash",{"type":60,"tag":632,"props":1676,"children":1677},{"style":1611},[1678],{"type":65,"value":1614},{"type":60,"tag":632,"props":1680,"children":1681},{"class":634,"line":757},[1682,1686,1691],{"type":60,"tag":632,"props":1683,"children":1684},{"style":671},[1685],{"type":65,"value":1622},{"type":60,"tag":632,"props":1687,"children":1688},{"style":655},[1689],{"type":65,"value":1690},"list all paused production DAGs and their owners",{"type":60,"tag":632,"props":1692,"children":1693},{"style":671},[1694],{"type":65,"value":684},{"type":60,"tag":121,"props":1696,"children":1698},{"id":1697},"structured-output",[1699],{"type":65,"value":1700},"Structured output",{"type":60,"tag":68,"props":1702,"children":1703},{},[1704,1706,1712],{"type":65,"value":1705},"Force Otto to emit a typed final answer with ",{"type":60,"tag":83,"props":1707,"children":1709},{"className":1708},[],[1710],{"type":65,"value":1711},"--output-schema",{"type":65,"value":1439},{"type":60,"tag":621,"props":1714,"children":1716},{"className":623,"code":1715,"language":625,"meta":626,"style":626},"astro otto --mode json --output-schema @schema.json \\\n  \"find DAGs with import errors and return as JSON\"\n",[1717],{"type":60,"tag":83,"props":1718,"children":1719},{"__ignoreMap":626},[1720,1753],{"type":60,"tag":632,"props":1721,"children":1722},{"class":634,"line":635},[1723,1727,1731,1735,1739,1744,1749],{"type":60,"tag":632,"props":1724,"children":1725},{"style":649},[1726],{"type":65,"value":652},{"type":60,"tag":632,"props":1728,"children":1729},{"style":655},[1730],{"type":65,"value":658},{"type":60,"tag":632,"props":1732,"children":1733},{"style":655},[1734],{"type":65,"value":663},{"type":60,"tag":632,"props":1736,"children":1737},{"style":655},[1738],{"type":65,"value":844},{"type":60,"tag":632,"props":1740,"children":1741},{"style":655},[1742],{"type":65,"value":1743}," --output-schema",{"type":60,"tag":632,"props":1745,"children":1746},{"style":655},[1747],{"type":65,"value":1748}," @schema.json",{"type":60,"tag":632,"props":1750,"children":1751},{"style":1611},[1752],{"type":65,"value":1614},{"type":60,"tag":632,"props":1754,"children":1755},{"class":634,"line":645},[1756,1760,1765],{"type":60,"tag":632,"props":1757,"children":1758},{"style":671},[1759],{"type":65,"value":1622},{"type":60,"tag":632,"props":1761,"children":1762},{"style":655},[1763],{"type":65,"value":1764},"find DAGs with import errors and return as JSON",{"type":60,"tag":632,"props":1766,"children":1767},{"style":671},[1768],{"type":65,"value":684},{"type":60,"tag":68,"props":1770,"children":1771},{},[1772,1774,1779,1781,1786,1788,1794],{"type":65,"value":1773},"Requires ",{"type":60,"tag":83,"props":1775,"children":1777},{"className":1776},[],[1778],{"type":65,"value":1089},{"type":65,"value":1780}," or ",{"type":60,"tag":83,"props":1782,"children":1784},{"className":1783},[],[1785],{"type":65,"value":1106},{"type":65,"value":1787},". Otto registers a synthetic ",{"type":60,"tag":83,"props":1789,"children":1791},{"className":1790},[],[1792],{"type":65,"value":1793},"submit_final_answer",{"type":65,"value":1795}," tool whose payload conforms to the schema.",{"type":60,"tag":121,"props":1797,"children":1799},{"id":1798},"model-and-reasoning-selection",[1800],{"type":65,"value":903},{"type":60,"tag":68,"props":1802,"children":1803},{},[1804],{"type":65,"value":1805},"The available model set is fetched at runtime from your Astronomer Gateway and changes over time. Don't hardcode model names — list what's available first:",{"type":60,"tag":621,"props":1807,"children":1809},{"className":623,"code":1808,"language":625,"meta":626,"style":626},"astro otto --list-models                  # full list\nastro otto --list-models anthropic        # filter by substring\n\nastro otto --model \u003Cid> --mode text \"...\"\nastro otto --thinking \u003Coff|minimal|low|medium|high|xhigh> --mode text \"...\"\n",[1810],{"type":60,"tag":83,"props":1811,"children":1812},{"__ignoreMap":626},[1813,1834,1859,1866,1923],{"type":60,"tag":632,"props":1814,"children":1815},{"class":634,"line":635},[1816,1820,1824,1829],{"type":60,"tag":632,"props":1817,"children":1818},{"style":649},[1819],{"type":65,"value":652},{"type":60,"tag":632,"props":1821,"children":1822},{"style":655},[1823],{"type":65,"value":658},{"type":60,"tag":632,"props":1825,"children":1826},{"style":655},[1827],{"type":65,"value":1828}," --list-models",{"type":60,"tag":632,"props":1830,"children":1831},{"style":639},[1832],{"type":65,"value":1833},"                  # full list\n",{"type":60,"tag":632,"props":1835,"children":1836},{"class":634,"line":645},[1837,1841,1845,1849,1854],{"type":60,"tag":632,"props":1838,"children":1839},{"style":649},[1840],{"type":65,"value":652},{"type":60,"tag":632,"props":1842,"children":1843},{"style":655},[1844],{"type":65,"value":658},{"type":60,"tag":632,"props":1846,"children":1847},{"style":655},[1848],{"type":65,"value":1828},{"type":60,"tag":632,"props":1850,"children":1851},{"style":655},[1852],{"type":65,"value":1853}," anthropic",{"type":60,"tag":632,"props":1855,"children":1856},{"style":639},[1857],{"type":65,"value":1858},"        # filter by substring\n",{"type":60,"tag":632,"props":1860,"children":1861},{"class":634,"line":687},[1862],{"type":60,"tag":632,"props":1863,"children":1864},{"emptyLinePlaceholder":691},[1865],{"type":65,"value":694},{"type":60,"tag":632,"props":1867,"children":1868},{"class":634,"line":697},[1869,1873,1877,1882,1887,1892,1897,1902,1906,1910,1914,1919],{"type":60,"tag":632,"props":1870,"children":1871},{"style":649},[1872],{"type":65,"value":652},{"type":60,"tag":632,"props":1874,"children":1875},{"style":655},[1876],{"type":65,"value":658},{"type":60,"tag":632,"props":1878,"children":1879},{"style":655},[1880],{"type":65,"value":1881}," --model",{"type":60,"tag":632,"props":1883,"children":1884},{"style":671},[1885],{"type":65,"value":1886}," \u003C",{"type":60,"tag":632,"props":1888,"children":1889},{"style":655},[1890],{"type":65,"value":1891},"i",{"type":60,"tag":632,"props":1893,"children":1894},{"style":1611},[1895],{"type":65,"value":1896},"d",{"type":60,"tag":632,"props":1898,"children":1899},{"style":671},[1900],{"type":65,"value":1901},">",{"type":60,"tag":632,"props":1903,"children":1904},{"style":655},[1905],{"type":65,"value":663},{"type":60,"tag":632,"props":1907,"children":1908},{"style":655},[1909],{"type":65,"value":668},{"type":60,"tag":632,"props":1911,"children":1912},{"style":671},[1913],{"type":65,"value":674},{"type":60,"tag":632,"props":1915,"children":1916},{"style":655},[1917],{"type":65,"value":1918},"...",{"type":60,"tag":632,"props":1920,"children":1921},{"style":671},[1922],{"type":65,"value":684},{"type":60,"tag":632,"props":1924,"children":1925},{"class":634,"line":706},[1926,1930,1934,1939,1943,1948,1953,1958,1962,1967,1971,1976,1980,1985,1989,1994,1999,2004,2008,2012,2016],{"type":60,"tag":632,"props":1927,"children":1928},{"style":649},[1929],{"type":65,"value":652},{"type":60,"tag":632,"props":1931,"children":1932},{"style":655},[1933],{"type":65,"value":658},{"type":60,"tag":632,"props":1935,"children":1936},{"style":655},[1937],{"type":65,"value":1938}," --thinking",{"type":60,"tag":632,"props":1940,"children":1941},{"style":671},[1942],{"type":65,"value":1886},{"type":60,"tag":632,"props":1944,"children":1945},{"style":655},[1946],{"type":65,"value":1947},"off",{"type":60,"tag":632,"props":1949,"children":1950},{"style":671},[1951],{"type":65,"value":1952},"|",{"type":60,"tag":632,"props":1954,"children":1955},{"style":649},[1956],{"type":65,"value":1957},"minimal",{"type":60,"tag":632,"props":1959,"children":1960},{"style":671},[1961],{"type":65,"value":1952},{"type":60,"tag":632,"props":1963,"children":1964},{"style":649},[1965],{"type":65,"value":1966},"low",{"type":60,"tag":632,"props":1968,"children":1969},{"style":671},[1970],{"type":65,"value":1952},{"type":60,"tag":632,"props":1972,"children":1973},{"style":649},[1974],{"type":65,"value":1975},"medium",{"type":60,"tag":632,"props":1977,"children":1978},{"style":671},[1979],{"type":65,"value":1952},{"type":60,"tag":632,"props":1981,"children":1982},{"style":649},[1983],{"type":65,"value":1984},"high",{"type":60,"tag":632,"props":1986,"children":1987},{"style":671},[1988],{"type":65,"value":1952},{"type":60,"tag":632,"props":1990,"children":1991},{"style":649},[1992],{"type":65,"value":1993},"xhigh",{"type":60,"tag":632,"props":1995,"children":1996},{"style":1611},[1997],{"type":65,"value":1998},"> ",{"type":60,"tag":632,"props":2000,"children":2001},{"style":655},[2002],{"type":65,"value":2003},"--mode",{"type":60,"tag":632,"props":2005,"children":2006},{"style":655},[2007],{"type":65,"value":668},{"type":60,"tag":632,"props":2009,"children":2010},{"style":671},[2011],{"type":65,"value":674},{"type":60,"tag":632,"props":2013,"children":2014},{"style":655},[2015],{"type":65,"value":1918},{"type":60,"tag":632,"props":2017,"children":2018},{"style":671},[2019],{"type":65,"value":684},{"type":60,"tag":68,"props":2021,"children":2022},{},[2023,2025,2030,2032,2038,2039,2044,2046,2051,2053,2059],{"type":65,"value":2024},"For ",{"type":60,"tag":92,"props":2026,"children":2027},{},[2028],{"type":65,"value":2029},"planning, migrations, or fleet-wide audits",{"type":65,"value":2031},", pick a 1M-context model and ",{"type":60,"tag":83,"props":2033,"children":2035},{"className":2034},[],[2036],{"type":65,"value":2037},"--thinking medium",{"type":65,"value":1780},{"type":60,"tag":83,"props":2040,"children":2042},{"className":2041},[],[2043],{"type":65,"value":1984},{"type":65,"value":2045},".\nFor ",{"type":60,"tag":92,"props":2047,"children":2048},{},[2049],{"type":65,"value":2050},"mechanical or scripted tasks",{"type":65,"value":2052},", smaller\u002Ffaster models with ",{"type":60,"tag":83,"props":2054,"children":2056},{"className":2055},[],[2057],{"type":65,"value":2058},"--thinking low",{"type":65,"value":2060}," are usually fine.",{"type":60,"tag":68,"props":2062,"children":2063},{},[2064,2066,2072],{"type":65,"value":2065},"Defaults persist in ",{"type":60,"tag":83,"props":2067,"children":2069},{"className":2068},[],[2070],{"type":65,"value":2071},"~\u002F.astro\u002Fotto\u002Fsettings.json",{"type":65,"value":595},{"type":60,"tag":121,"props":2074,"children":2076},{"id":2075},"mcp-servers-and-extensions",[2077],{"type":65,"value":2078},"MCP servers and extensions",{"type":60,"tag":136,"props":2080,"children":2081},{},[2082,2107],{"type":60,"tag":140,"props":2083,"children":2084},{},[2085,2090,2092,2098,2100,2105],{"type":60,"tag":92,"props":2086,"children":2087},{},[2088],{"type":65,"value":2089},"MCP",{"type":65,"value":2091},": pass ",{"type":60,"tag":83,"props":2093,"children":2095},{"className":2094},[],[2096],{"type":65,"value":2097},"--mcp-config \u002Fpath\u002Fto\u002Fmcp.json",{"type":65,"value":2099}," to wire in user-configured servers (warehouse, ticketing, etc.). Otto's Airflow tooling (",{"type":60,"tag":83,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":65,"value":165},{"type":65,"value":2106},") is built in — no MCP needed for that.",{"type":60,"tag":140,"props":2108,"children":2109},{},[2110,2115,2117,2123,2124,2130,2132,2138,2139,2145,2147,2153,2154,2160],{"type":60,"tag":92,"props":2111,"children":2112},{},[2113],{"type":65,"value":2114},"Extensions",{"type":65,"value":2116},": toggle per-session with ",{"type":60,"tag":83,"props":2118,"children":2120},{"className":2119},[],[2121],{"type":65,"value":2122},"--extension \u003Cname>",{"type":65,"value":1124},{"type":60,"tag":83,"props":2125,"children":2127},{"className":2126},[],[2128],{"type":65,"value":2129},"--no-extension \u003Cname>",{"type":65,"value":2131}," (repeatable), or via ",{"type":60,"tag":83,"props":2133,"children":2135},{"className":2134},[],[2136],{"type":65,"value":2137},"OTTO_EXTENSIONS",{"type":65,"value":1124},{"type":60,"tag":83,"props":2140,"children":2142},{"className":2141},[],[2143],{"type":65,"value":2144},"OTTO_DISABLED_EXTENSIONS",{"type":65,"value":2146},". Persistent settings live in ",{"type":60,"tag":83,"props":2148,"children":2150},{"className":2149},[],[2151],{"type":65,"value":2152},"~\u002F.astro\u002Fotto\u002Fextensions.json",{"type":65,"value":229},{"type":60,"tag":83,"props":2155,"children":2157},{"className":2156},[],[2158],{"type":65,"value":2159},".astro\u002Fotto\u002Fextensions.json",{"type":65,"value":595},{"type":60,"tag":121,"props":2162,"children":2164},{"id":2163},"common-delegation-patterns",[2165],{"type":65,"value":2166},"Common delegation patterns",{"type":60,"tag":293,"props":2168,"children":2170},{"id":2169},"plan-only-investigation",[2171],{"type":65,"value":2172},"Plan-only investigation",{"type":60,"tag":621,"props":2174,"children":2176},{"className":623,"code":2175,"language":625,"meta":626,"style":626},"astro otto --mode text --permission-mode plan --thinking medium \\\n  \"your investigation prompt\"\n",[2177],{"type":60,"tag":83,"props":2178,"children":2179},{"__ignoreMap":626},[2180,2220],{"type":60,"tag":632,"props":2181,"children":2182},{"class":634,"line":635},[2183,2187,2191,2195,2199,2203,2207,2211,2216],{"type":60,"tag":632,"props":2184,"children":2185},{"style":649},[2186],{"type":65,"value":652},{"type":60,"tag":632,"props":2188,"children":2189},{"style":655},[2190],{"type":65,"value":658},{"type":60,"tag":632,"props":2192,"children":2193},{"style":655},[2194],{"type":65,"value":663},{"type":60,"tag":632,"props":2196,"children":2197},{"style":655},[2198],{"type":65,"value":668},{"type":60,"tag":632,"props":2200,"children":2201},{"style":655},[2202],{"type":65,"value":728},{"type":60,"tag":632,"props":2204,"children":2205},{"style":655},[2206],{"type":65,"value":733},{"type":60,"tag":632,"props":2208,"children":2209},{"style":655},[2210],{"type":65,"value":1938},{"type":60,"tag":632,"props":2212,"children":2213},{"style":655},[2214],{"type":65,"value":2215}," medium",{"type":60,"tag":632,"props":2217,"children":2218},{"style":1611},[2219],{"type":65,"value":1614},{"type":60,"tag":632,"props":2221,"children":2222},{"class":634,"line":645},[2223,2227,2232],{"type":60,"tag":632,"props":2224,"children":2225},{"style":671},[2226],{"type":65,"value":1622},{"type":60,"tag":632,"props":2228,"children":2229},{"style":655},[2230],{"type":65,"value":2231},"your investigation prompt",{"type":60,"tag":632,"props":2233,"children":2234},{"style":671},[2235],{"type":65,"value":684},{"type":60,"tag":293,"props":2237,"children":2239},{"id":2238},"scripted-pipeline-with-structured-output",[2240],{"type":65,"value":2241},"Scripted pipeline with structured output",{"type":60,"tag":621,"props":2243,"children":2245},{"className":623,"code":2244,"language":625,"meta":626,"style":626},"astro otto --mode json --output-schema @schema.json \\\n  --allowed-tools af,read \\\n  --permission-mode plan \\\n  \"audit DAG X and return findings as JSON\" \\\n  | jq '.final_answer'\n",[2246],{"type":60,"tag":83,"props":2247,"children":2248},{"__ignoreMap":626},[2249,2280,2297,2313,2334],{"type":60,"tag":632,"props":2250,"children":2251},{"class":634,"line":635},[2252,2256,2260,2264,2268,2272,2276],{"type":60,"tag":632,"props":2253,"children":2254},{"style":649},[2255],{"type":65,"value":652},{"type":60,"tag":632,"props":2257,"children":2258},{"style":655},[2259],{"type":65,"value":658},{"type":60,"tag":632,"props":2261,"children":2262},{"style":655},[2263],{"type":65,"value":663},{"type":60,"tag":632,"props":2265,"children":2266},{"style":655},[2267],{"type":65,"value":844},{"type":60,"tag":632,"props":2269,"children":2270},{"style":655},[2271],{"type":65,"value":1743},{"type":60,"tag":632,"props":2273,"children":2274},{"style":655},[2275],{"type":65,"value":1748},{"type":60,"tag":632,"props":2277,"children":2278},{"style":1611},[2279],{"type":65,"value":1614},{"type":60,"tag":632,"props":2281,"children":2282},{"class":634,"line":645},[2283,2288,2293],{"type":60,"tag":632,"props":2284,"children":2285},{"style":655},[2286],{"type":65,"value":2287},"  --allowed-tools",{"type":60,"tag":632,"props":2289,"children":2290},{"style":655},[2291],{"type":65,"value":2292}," af,read",{"type":60,"tag":632,"props":2294,"children":2295},{"style":1611},[2296],{"type":65,"value":1614},{"type":60,"tag":632,"props":2298,"children":2299},{"class":634,"line":687},[2300,2305,2309],{"type":60,"tag":632,"props":2301,"children":2302},{"style":655},[2303],{"type":65,"value":2304},"  --permission-mode",{"type":60,"tag":632,"props":2306,"children":2307},{"style":655},[2308],{"type":65,"value":733},{"type":60,"tag":632,"props":2310,"children":2311},{"style":1611},[2312],{"type":65,"value":1614},{"type":60,"tag":632,"props":2314,"children":2315},{"class":634,"line":697},[2316,2320,2325,2330],{"type":60,"tag":632,"props":2317,"children":2318},{"style":671},[2319],{"type":65,"value":1622},{"type":60,"tag":632,"props":2321,"children":2322},{"style":655},[2323],{"type":65,"value":2324},"audit DAG X and return findings as JSON",{"type":60,"tag":632,"props":2326,"children":2327},{"style":671},[2328],{"type":65,"value":2329},"\"",{"type":60,"tag":632,"props":2331,"children":2332},{"style":1611},[2333],{"type":65,"value":1614},{"type":60,"tag":632,"props":2335,"children":2336},{"class":634,"line":706},[2337,2342,2347,2352,2357],{"type":60,"tag":632,"props":2338,"children":2339},{"style":671},[2340],{"type":65,"value":2341},"  |",{"type":60,"tag":632,"props":2343,"children":2344},{"style":649},[2345],{"type":65,"value":2346}," jq",{"type":60,"tag":632,"props":2348,"children":2349},{"style":671},[2350],{"type":65,"value":2351}," '",{"type":60,"tag":632,"props":2353,"children":2354},{"style":655},[2355],{"type":65,"value":2356},".final_answer",{"type":60,"tag":632,"props":2358,"children":2359},{"style":671},[2360],{"type":65,"value":2361},"'\n",{"type":60,"tag":68,"props":2363,"children":2364},{},[2365,2367,2372,2374,2379,2381,2385],{"type":65,"value":2366},"For multi-turn delegation, kick off once and resume with ",{"type":60,"tag":83,"props":2368,"children":2370},{"className":2369},[],[2371],{"type":65,"value":867},{"type":65,"value":2373},". For parallel branches, see ",{"type":60,"tag":83,"props":2375,"children":2377},{"className":2376},[],[2378],{"type":65,"value":193},{"type":65,"value":2380}," in ",{"type":60,"tag":72,"props":2382,"children":2383},{"href":892},[2384],{"type":65,"value":895},{"type":65,"value":595},{"type":60,"tag":121,"props":2387,"children":2389},{"id":2388},"cost-and-latency",[2390],{"type":65,"value":2391},"Cost and latency",{"type":60,"tag":68,"props":2393,"children":2394},{},[2395],{"type":65,"value":2396},"Each invocation spins up a fresh agent with its own context window. Two rules cover most cases:",{"type":60,"tag":136,"props":2398,"children":2399},{},[2400,2421],{"type":60,"tag":140,"props":2401,"children":2402},{},[2403,2419],{"type":60,"tag":92,"props":2404,"children":2405},{},[2406,2408,2413,2414],{"type":65,"value":2407},"Prefer ",{"type":60,"tag":83,"props":2409,"children":2411},{"className":2410},[],[2412],{"type":65,"value":867},{"type":65,"value":1124},{"type":60,"tag":83,"props":2415,"children":2417},{"className":2416},[],[2418],{"type":65,"value":880},{"type":65,"value":2420}," over re-prompting from scratch — preserves cache and prior findings.",{"type":60,"tag":140,"props":2422,"children":2423},{},[2424,2437,2439,2444,2446,2451,2452,2457],{"type":60,"tag":92,"props":2425,"children":2426},{},[2427,2429,2435],{"type":65,"value":2428},"Match ",{"type":60,"tag":83,"props":2430,"children":2432},{"className":2431},[],[2433],{"type":65,"value":2434},"--thinking",{"type":65,"value":2436}," to the task",{"type":65,"value":2438}," — ",{"type":60,"tag":83,"props":2440,"children":2442},{"className":2441},[],[2443],{"type":65,"value":1993},{"type":65,"value":2445}," is expensive; ",{"type":60,"tag":83,"props":2447,"children":2449},{"className":2448},[],[2450],{"type":65,"value":1966},{"type":65,"value":1187},{"type":60,"tag":83,"props":2453,"children":2455},{"className":2454},[],[2456],{"type":65,"value":1975},{"type":65,"value":2458}," covers most work.",{"type":60,"tag":121,"props":2460,"children":2462},{"id":2461},"what-otto-auto-detects",[2463],{"type":65,"value":2464},"What Otto auto-detects",{"type":60,"tag":68,"props":2466,"children":2467},{},[2468,2470,2475],{"type":65,"value":2469},"When you launch ",{"type":60,"tag":83,"props":2471,"children":2473},{"className":2472},[],[2474],{"type":65,"value":88},{"type":65,"value":2476}," from an Astro project, the CLI sets these for you. You don't need to export them:",{"type":60,"tag":373,"props":2478,"children":2479},{},[2480,2496],{"type":60,"tag":377,"props":2481,"children":2482},{},[2483],{"type":60,"tag":381,"props":2484,"children":2485},{},[2486,2491],{"type":60,"tag":385,"props":2487,"children":2488},{},[2489],{"type":65,"value":2490},"Variable",{"type":60,"tag":385,"props":2492,"children":2493},{},[2494],{"type":65,"value":2495},"Set from",{"type":60,"tag":401,"props":2497,"children":2498},{},[2499,2538,2563],{"type":60,"tag":381,"props":2500,"children":2501},{},[2502,2525],{"type":60,"tag":408,"props":2503,"children":2504},{},[2505,2511,2512,2518,2519],{"type":60,"tag":83,"props":2506,"children":2508},{"className":2507},[],[2509],{"type":65,"value":2510},"ASTRO_TOKEN",{"type":65,"value":310},{"type":60,"tag":83,"props":2513,"children":2515},{"className":2514},[],[2516],{"type":65,"value":2517},"ASTRO_DOMAIN",{"type":65,"value":310},{"type":60,"tag":83,"props":2520,"children":2522},{"className":2521},[],[2523],{"type":65,"value":2524},"ASTRO_ORGANIZATION",{"type":60,"tag":408,"props":2526,"children":2527},{},[2528,2530,2536],{"type":65,"value":2529},"Current ",{"type":60,"tag":83,"props":2531,"children":2533},{"className":2532},[],[2534],{"type":65,"value":2535},"astro login",{"type":65,"value":2537}," context (auto-refreshed in the background)",{"type":60,"tag":381,"props":2539,"children":2540},{},[2541,2550],{"type":60,"tag":408,"props":2542,"children":2543},{},[2544],{"type":60,"tag":83,"props":2545,"children":2547},{"className":2546},[],[2548],{"type":65,"value":2549},"AIRFLOW_API_URL",{"type":60,"tag":408,"props":2551,"children":2552},{},[2553,2555,2561],{"type":65,"value":2554},"Local Airflow proxy if ",{"type":60,"tag":83,"props":2556,"children":2558},{"className":2557},[],[2559],{"type":65,"value":2560},"astro dev start",{"type":65,"value":2562}," is running",{"type":60,"tag":381,"props":2564,"children":2565},{},[2566,2582],{"type":60,"tag":408,"props":2567,"children":2568},{},[2569,2575,2576],{"type":60,"tag":83,"props":2570,"children":2572},{"className":2571},[],[2573],{"type":65,"value":2574},"AIRFLOW_USERNAME",{"type":65,"value":310},{"type":60,"tag":83,"props":2577,"children":2579},{"className":2578},[],[2580],{"type":65,"value":2581},"AIRFLOW_PASSWORD",{"type":60,"tag":408,"props":2583,"children":2584},{},[2585,2587,2593],{"type":65,"value":2586},"Default to ",{"type":60,"tag":83,"props":2588,"children":2590},{"className":2589},[],[2591],{"type":65,"value":2592},"admin\u002Fadmin",{"type":65,"value":2594}," when local Airflow is connected",{"type":60,"tag":68,"props":2596,"children":2597},{},[2598,2600,2605,2607,2613,2614,2620,2622,2628,2630,2635],{"type":65,"value":2599},"Otto also walks up from the cwd to ",{"type":60,"tag":83,"props":2601,"children":2603},{"className":2602},[],[2604],{"type":65,"value":1187},{"type":65,"value":2606},", loading any ",{"type":60,"tag":83,"props":2608,"children":2610},{"className":2609},[],[2611],{"type":65,"value":2612},"AGENTS.md",{"type":65,"value":1780},{"type":60,"tag":83,"props":2615,"children":2617},{"className":2616},[],[2618],{"type":65,"value":2619},"CLAUDE.md",{"type":65,"value":2621}," it finds (plus ",{"type":60,"tag":83,"props":2623,"children":2625},{"className":2624},[],[2626],{"type":65,"value":2627},"~\u002F.astro\u002Fotto\u002FAGENTS.md",{"type":65,"value":2629},"). When both files exist in the same folder, ",{"type":60,"tag":83,"props":2631,"children":2633},{"className":2632},[],[2634],{"type":65,"value":2612},{"type":65,"value":2636}," wins. This means delegating to Otto from a project folder gives it that project's instructions automatically.",{"type":60,"tag":293,"props":2638,"children":2640},{"id":2639},"caveat-af-requires-a-connected-airflow",[2641,2643,2648],{"type":65,"value":2642},"Caveat: ",{"type":60,"tag":83,"props":2644,"children":2646},{"className":2645},[],[2647],{"type":65,"value":165},{"type":65,"value":2649}," requires a connected Airflow",{"type":60,"tag":68,"props":2651,"children":2652},{},[2653,2655,2667,2669,2674,2676,2682],{"type":65,"value":2654},"If no Airflow instance is reachable, Otto can still read and edit DAG code but ",{"type":60,"tag":92,"props":2656,"children":2657},{},[2658,2660,2665],{"type":65,"value":2659},"won't run ",{"type":60,"tag":83,"props":2661,"children":2663},{"className":2662},[],[2664],{"type":65,"value":165},{"type":65,"value":2666}," commands",{"type":65,"value":2668},". For tasks that need DAG-run inspection, task logs, connections, or variables, ensure local Airflow is running first (",{"type":60,"tag":83,"props":2670,"children":2672},{"className":2671},[],[2673],{"type":65,"value":2560},{"type":65,"value":2675},") or pass an instance config via ",{"type":60,"tag":83,"props":2677,"children":2679},{"className":2678},[],[2680],{"type":65,"value":2681},"~\u002F.af\u002Fconfig.yaml",{"type":65,"value":595},{"type":60,"tag":121,"props":2684,"children":2686},{"id":2685},"auto-dag-validation",[2687],{"type":65,"value":2688},"Auto DAG validation",{"type":60,"tag":68,"props":2690,"children":2691},{},[2692,2694,2700,2702,2707,2709,2715,2717,2722],{"type":65,"value":2693},"The ",{"type":60,"tag":83,"props":2695,"children":2697},{"className":2696},[],[2698],{"type":65,"value":2699},"dag-validation",{"type":65,"value":2701}," extension is ",{"type":60,"tag":92,"props":2703,"children":2704},{},[2705],{"type":65,"value":2706},"on by default",{"type":65,"value":2708},". After Otto edits or writes any ",{"type":60,"tag":83,"props":2710,"children":2712},{"className":2711},[],[2713],{"type":65,"value":2714},"dags\u002F*.py",{"type":65,"value":2716}," file, it runs ",{"type":60,"tag":83,"props":2718,"children":2720},{"className":2719},[],[2721],{"type":65,"value":433},{"type":65,"value":2723}," and tries to self-correct in the same turn — but only when an Airflow instance is reachable.",{"type":60,"tag":68,"props":2725,"children":2726},{},[2727],{"type":65,"value":2728},"This is convenient for delegated DAG edits, but means:",{"type":60,"tag":136,"props":2730,"children":2731},{},[2732,2737],{"type":60,"tag":140,"props":2733,"children":2734},{},[2735],{"type":65,"value":2736},"Delegated edits without a running Airflow won't be auto-validated.",{"type":60,"tag":140,"props":2738,"children":2739},{},[2740,2742,2748],{"type":65,"value":2741},"Disable with ",{"type":60,"tag":83,"props":2743,"children":2745},{"className":2744},[],[2746],{"type":65,"value":2747},"--no-extension dag-validation",{"type":65,"value":2749}," if you want pure code changes without the validation roundtrip.",{"type":60,"tag":121,"props":2751,"children":2753},{"id":2752},"subagent-extension-off-by-default",[2754],{"type":65,"value":2755},"Subagent extension (off by default)",{"type":60,"tag":68,"props":2757,"children":2758},{},[2759,2761,2767,2769,2774,2776,2782,2783,2789],{"type":65,"value":2760},"Otto can fan out to its own subprocesses via the ",{"type":60,"tag":83,"props":2762,"children":2764},{"className":2763},[],[2765],{"type":65,"value":2766},"subagent",{"type":65,"value":2768}," extension. Enabling it registers a ",{"type":60,"tag":83,"props":2770,"children":2772},{"className":2771},[],[2773],{"type":65,"value":2766},{"type":65,"value":2775}," tool with ",{"type":60,"tag":83,"props":2777,"children":2779},{"className":2778},[],[2780],{"type":65,"value":2781},"fast",{"type":65,"value":229},{"type":60,"tag":83,"props":2784,"children":2786},{"className":2785},[],[2787],{"type":65,"value":2788},"deep",{"type":65,"value":2790}," model tiers — useful when delegating a multi-part task you want Otto itself to parallelize.",{"type":60,"tag":621,"props":2792,"children":2794},{"className":623,"code":2793,"language":625,"meta":626,"style":626},"astro otto --mode text --extension subagent \"audit each DAG in dags\u002F and report findings\"\n",[2795],{"type":60,"tag":83,"props":2796,"children":2797},{"__ignoreMap":626},[2798],{"type":60,"tag":632,"props":2799,"children":2800},{"class":634,"line":635},[2801,2805,2809,2813,2817,2822,2827,2831,2836],{"type":60,"tag":632,"props":2802,"children":2803},{"style":649},[2804],{"type":65,"value":652},{"type":60,"tag":632,"props":2806,"children":2807},{"style":655},[2808],{"type":65,"value":658},{"type":60,"tag":632,"props":2810,"children":2811},{"style":655},[2812],{"type":65,"value":663},{"type":60,"tag":632,"props":2814,"children":2815},{"style":655},[2816],{"type":65,"value":668},{"type":60,"tag":632,"props":2818,"children":2819},{"style":655},[2820],{"type":65,"value":2821}," --extension",{"type":60,"tag":632,"props":2823,"children":2824},{"style":655},[2825],{"type":65,"value":2826}," subagent",{"type":60,"tag":632,"props":2828,"children":2829},{"style":671},[2830],{"type":65,"value":674},{"type":60,"tag":632,"props":2832,"children":2833},{"style":655},[2834],{"type":65,"value":2835},"audit each DAG in dags\u002F and report findings",{"type":60,"tag":632,"props":2837,"children":2838},{"style":671},[2839],{"type":65,"value":684},{"type":60,"tag":68,"props":2841,"children":2842},{},[2843,2845,2850],{"type":65,"value":2844},"Configure tier models in ",{"type":60,"tag":83,"props":2846,"children":2848},{"className":2847},[],[2849],{"type":65,"value":2159},{"type":65,"value":595},{"type":60,"tag":121,"props":2852,"children":2854},{"id":2853},"settings-precedence",[2855],{"type":65,"value":2856},"Settings precedence",{"type":60,"tag":68,"props":2858,"children":2859},{},[2860],{"type":65,"value":2861},"Otto resolves config in this order (earlier wins):",{"type":60,"tag":2863,"props":2864,"children":2865},"ol",{},[2866,2893,2904,2929,2947],{"type":60,"tag":140,"props":2867,"children":2868},{},[2869,2871,2877,2878,2884,2885,2891],{"type":65,"value":2870},"CLI flag (",{"type":60,"tag":83,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":65,"value":2876},"--model",{"type":65,"value":310},{"type":60,"tag":83,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":65,"value":2883},"--allowed-tools",{"type":65,"value":310},{"type":60,"tag":83,"props":2886,"children":2888},{"className":2887},[],[2889],{"type":65,"value":2890},"--no-extension",{"type":65,"value":2892},", etc.)",{"type":60,"tag":140,"props":2894,"children":2895},{},[2896,2898,2903],{"type":65,"value":2897},"Environment variable (",{"type":60,"tag":83,"props":2899,"children":2901},{"className":2900},[],[2902],{"type":65,"value":2144},{"type":65,"value":2892},{"type":60,"tag":140,"props":2905,"children":2906},{},[2907,2909,2915,2916,2921,2922,2928],{"type":65,"value":2908},"Project file (",{"type":60,"tag":83,"props":2910,"children":2912},{"className":2911},[],[2913],{"type":65,"value":2914},".astro\u002Fotto\u002Fpermissions.json",{"type":65,"value":310},{"type":60,"tag":83,"props":2917,"children":2919},{"className":2918},[],[2920],{"type":65,"value":2159},{"type":65,"value":310},{"type":60,"tag":83,"props":2923,"children":2925},{"className":2924},[],[2926],{"type":65,"value":2927},".astro\u002Fconfig.yaml",{"type":65,"value":435},{"type":60,"tag":140,"props":2930,"children":2931},{},[2932,2934,2939,2940,2946],{"type":65,"value":2933},"User file (",{"type":60,"tag":83,"props":2935,"children":2937},{"className":2936},[],[2938],{"type":65,"value":2071},{"type":65,"value":310},{"type":60,"tag":83,"props":2941,"children":2943},{"className":2942},[],[2944],{"type":65,"value":2945},"~\u002F.astro\u002Fconfig.yaml",{"type":65,"value":435},{"type":60,"tag":140,"props":2948,"children":2949},{},[2950],{"type":65,"value":2951},"Built-in default",{"type":60,"tag":68,"props":2953,"children":2954},{},[2955,2957,2964],{"type":65,"value":2956},"For full reference see ",{"type":60,"tag":72,"props":2958,"children":2961},{"href":2959,"rel":2960},"https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-settings",[76],[2962],{"type":65,"value":2963},"Otto settings",{"type":65,"value":595},{"type":60,"tag":121,"props":2966,"children":2968},{"id":2967},"verifying-otto-is-available",[2969],{"type":65,"value":2970},"Verifying Otto is available",{"type":60,"tag":621,"props":2972,"children":2974},{"className":623,"code":2973,"language":625,"meta":626,"style":626},"astro otto version    # installed Otto version + update check\nastro otto --help     # full flag reference\nastro otto update     # pull latest Otto release\n",[2975],{"type":60,"tag":83,"props":2976,"children":2977},{"__ignoreMap":626},[2978,2999,3020],{"type":60,"tag":632,"props":2979,"children":2980},{"class":634,"line":635},[2981,2985,2989,2994],{"type":60,"tag":632,"props":2982,"children":2983},{"style":649},[2984],{"type":65,"value":652},{"type":60,"tag":632,"props":2986,"children":2987},{"style":655},[2988],{"type":65,"value":658},{"type":60,"tag":632,"props":2990,"children":2991},{"style":655},[2992],{"type":65,"value":2993}," version",{"type":60,"tag":632,"props":2995,"children":2996},{"style":639},[2997],{"type":65,"value":2998},"    # installed Otto version + update check\n",{"type":60,"tag":632,"props":3000,"children":3001},{"class":634,"line":645},[3002,3006,3010,3015],{"type":60,"tag":632,"props":3003,"children":3004},{"style":649},[3005],{"type":65,"value":652},{"type":60,"tag":632,"props":3007,"children":3008},{"style":655},[3009],{"type":65,"value":658},{"type":60,"tag":632,"props":3011,"children":3012},{"style":655},[3013],{"type":65,"value":3014}," --help",{"type":60,"tag":632,"props":3016,"children":3017},{"style":639},[3018],{"type":65,"value":3019},"     # full flag reference\n",{"type":60,"tag":632,"props":3021,"children":3022},{"class":634,"line":687},[3023,3027,3031,3036],{"type":60,"tag":632,"props":3024,"children":3025},{"style":649},[3026],{"type":65,"value":652},{"type":60,"tag":632,"props":3028,"children":3029},{"style":655},[3030],{"type":65,"value":658},{"type":60,"tag":632,"props":3032,"children":3033},{"style":655},[3034],{"type":65,"value":3035}," update",{"type":60,"tag":632,"props":3037,"children":3038},{"style":639},[3039],{"type":65,"value":3040},"     # pull latest Otto release\n",{"type":60,"tag":68,"props":3042,"children":3043},{},[3044,3046,3052],{"type":65,"value":3045},"Otto auto-updates by default (once-per-day check, applied on next launch). Opt out with ",{"type":60,"tag":83,"props":3047,"children":3049},{"className":3048},[],[3050],{"type":65,"value":3051},"astro config set -g otto.auto_update false",{"type":65,"value":595},{"type":60,"tag":68,"props":3054,"children":3055},{},[3056,3058,3063,3065,3071],{"type":65,"value":3057},"If ",{"type":60,"tag":83,"props":3059,"children":3061},{"className":3060},[],[3062],{"type":65,"value":88},{"type":65,"value":3064}," isn't recognized, the user needs Astro CLI v1.42+. Recommend ",{"type":60,"tag":83,"props":3066,"children":3068},{"className":3067},[],[3069],{"type":65,"value":3070},"brew upgrade astro",{"type":65,"value":3072}," or whatever installer they used.",{"type":60,"tag":121,"props":3074,"children":3076},{"id":3075},"authoritative-references",[3077],{"type":65,"value":3078},"Authoritative references",{"type":60,"tag":136,"props":3080,"children":3081},{},[3082,3093,3102,3117,3127,3137,3145],{"type":60,"tag":140,"props":3083,"children":3084},{},[3085,3091],{"type":60,"tag":83,"props":3086,"children":3088},{"className":3087},[],[3089],{"type":65,"value":3090},"astro otto --help",{"type":65,"value":3092}," — flag reference (source of truth)",{"type":60,"tag":140,"props":3094,"children":3095},{},[3096],{"type":60,"tag":72,"props":3097,"children":3099},{"href":74,"rel":3098},[76],[3100],{"type":65,"value":3101},"Otto overview",{"type":60,"tag":140,"props":3103,"children":3104},{},[3105],{"type":60,"tag":72,"props":3106,"children":3109},{"href":3107,"rel":3108},"https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fcli\u002Fastro-otto",[76],[3110,3115],{"type":60,"tag":83,"props":3111,"children":3113},{"className":3112},[],[3114],{"type":65,"value":88},{"type":65,"value":3116}," CLI reference",{"type":60,"tag":140,"props":3118,"children":3119},{},[3120],{"type":60,"tag":72,"props":3121,"children":3124},{"href":3122,"rel":3123},"https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-permissions",[76],[3125],{"type":65,"value":3126},"Otto permissions",{"type":60,"tag":140,"props":3128,"children":3129},{},[3130],{"type":60,"tag":72,"props":3131,"children":3134},{"href":3132,"rel":3133},"https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-extensions",[76],[3135],{"type":65,"value":3136},"Otto extensions",{"type":60,"tag":140,"props":3138,"children":3139},{},[3140],{"type":60,"tag":72,"props":3141,"children":3143},{"href":2959,"rel":3142},[76],[3144],{"type":65,"value":2963},{"type":60,"tag":140,"props":3146,"children":3147},{},[3148],{"type":60,"tag":72,"props":3149,"children":3152},{"href":3150,"rel":3151},"https:\u002F\u002Fwww.astronomer.io\u002Fdocs\u002Fastro\u002Fotto-memory",[76],[3153],{"type":65,"value":3154},"Otto memory",{"type":60,"tag":3156,"props":3157,"children":3158},"style",{},[3159],{"type":65,"value":3160},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3162,"total":3326},[3163,3179,3191,3208,3221,3237,3250,3262,3277,3291,3301,3314],{"slug":14,"name":14,"fn":3164,"description":3165,"org":3166,"tags":3167,"stars":27,"repoUrl":28,"updatedAt":3178},"manage and troubleshoot Airflow via CLI","Queries, manages, and troubleshoots Apache Airflow using the `af` CLI. Use when working with anything related to Airflow - a DAG, a DAG run, a task log, an import or parse error, a broken DAG, or any Airflow operation. Covers listing and triggering DAGs, retrying runs, reading task logs, diagnosing failures, debugging import and parse errors, checking connections, variables and pools, exploring the REST API, and monitoring health (for example \"trigger a pipeline\", \"retry a run\", \"list connections\", \"check Airflow health\", \"why did my DAG fail\"). This is the entrypoint that routes to sibling skills for authoring, testing, deploying, and migrating Airflow 2 to 3. Not for warehouse\u002FSQL analytics on Airflow metadata tables (use analyzing-data); for deep root-cause reports use debugging-dags or airflow-investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3168,3169,3172,3175],{"name":13,"slug":14,"type":15},{"name":3170,"slug":3171,"type":15},"CLI","cli",{"name":3173,"slug":3174,"type":15},"Data Pipeline","data-pipeline",{"name":3176,"slug":3177,"type":15},"Debugging","debugging","2026-04-06T18:01:43.992997",{"slug":3180,"name":3180,"fn":3181,"description":3182,"org":3183,"tags":3184,"stars":27,"repoUrl":28,"updatedAt":3190},"airflow-hitl","add human-in-the-loop steps to Airflow DAGs","Builds human-in-the-loop (HITL) Airflow workflows - approval gates, form input, and human-driven branching. Use when a DAG needs a human in the loop - an approval or reject step, sign-off before a task runs, a decision or approval UI, branching on a human choice, or collecting form input mid-run; also on mentions of ApprovalOperator, HITLOperator, HITLBranchOperator, HITLEntryOperator, or HITLTrigger. Requires Airflow 3.1+. Not for AI\u002FLLM task calls (see migrating-ai-sdk-to-common-ai).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3185,3186,3189],{"name":13,"slug":14,"type":15},{"name":3187,"slug":3188,"type":15},"Approvals","approvals",{"name":3173,"slug":3174,"type":15},"2026-04-06T18:01:46.758548",{"slug":3192,"name":3192,"fn":3193,"description":3194,"org":3195,"tags":3196,"stars":27,"repoUrl":28,"updatedAt":3207},"airflow-plugins","build Airflow UI plugins","Builds Airflow 3.1+ plugins that embed FastAPI apps, custom UI pages, React components, middleware, macros, and operator links directly into the Airflow UI. Use when building anything custom inside Airflow 3.1+ that involves Python and a browser-facing interface - creating an Airflow plugin, adding a custom UI page or nav entry, building FastAPI-backed endpoints inside Airflow, serving static assets from a plugin, embedding a React app, adding middleware to the API server, creating custom operator extra links, or calling the Airflow REST API from inside a plugin; also when AirflowPlugin, fastapi_apps, external_views, react_apps, or plugin registration come up.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3197,3198,3201,3204],{"name":13,"slug":14,"type":15},{"name":3199,"slug":3200,"type":15},"Plugin Development","plugin-development",{"name":3202,"slug":3203,"type":15},"Python","python",{"name":3205,"slug":3206,"type":15},"UI Components","ui-components","2026-04-06T18:01:56.827891",{"slug":3209,"name":3209,"fn":3210,"description":3211,"org":3212,"tags":3213,"stars":27,"repoUrl":28,"updatedAt":3220},"airflow-state-store","persist Airflow task and asset state","Persists task and asset state across retries and DAG runs using Airflow 3.3's AIP-103 key\u002Fvalue stores (`task_state_store`, `asset_state_store`) and the crash-safe `ResumableJobMixin`. Use when the user asks about task state store, checkpointing in tasks, persisting state across retries, job IDs surviving worker crashes, watermarks, asset metadata, resumable tasks, crash-safe operators, or \"what's new in Airflow 3.3\". Also use proactively when reading a DAG that uses Variables or XCom for intra-task coordination state — flag the anti-pattern and recommend task_state_store or asset_state_store instead. Requires Airflow 3.3+.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3214,3215,3216,3217],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3218,"slug":3219,"type":15},"Operations","operations","2026-07-07T06:43:11.160671",{"slug":337,"name":337,"fn":3222,"description":3223,"org":3224,"tags":3225,"stars":27,"repoUrl":28,"updatedAt":3236},"query data warehouses for business questions","Queries the data warehouse with SQL and answers business questions about data. Use when answering anything that needs warehouse data - counts, metrics, trends, aggregations, joins across tables, data lookups, or ad-hoc SQL analysis (for example \"who uses X\", \"how many Y\", \"show me Z\", \"find customers\", \"what is the count\").",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3226,3229,3232,3233],{"name":3227,"slug":3228,"type":15},"Analytics","analytics",{"name":3230,"slug":3231,"type":15},"Data Analysis","data-analysis",{"name":17,"slug":18,"type":15},{"name":3234,"slug":3235,"type":15},"SQL","sql","2026-04-06T18:01:49.599775",{"slug":3238,"name":3238,"fn":3239,"description":3240,"org":3241,"tags":3242,"stars":27,"repoUrl":28,"updatedAt":3249},"annotating-task-lineage","annotate Airflow tasks with data lineage","Annotate Airflow tasks with data lineage using inlets and outlets. Use when the user wants to add lineage metadata to tasks, specify input\u002Foutput datasets, or enable lineage tracking for operators without built-in OpenLineage extraction.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3243,3244,3245,3246],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3247,"slug":3248,"type":15},"Observability","observability","2026-04-06T18:02:03.487365",{"slug":316,"name":316,"fn":3251,"description":3252,"org":3253,"tags":3254,"stars":27,"repoUrl":28,"updatedAt":3261},"author Airflow DAGs","Workflow and best practices for writing Apache Airflow DAGs. Use when creating a new DAG, write pipeline code, handling questions about DAG patterns and conventions or extending an existing DAG with a follow-up\u002Fdownstream task. ANY request shaped like 'add a DAG named X', 'write a pipeline', 'add a task that runs after Y', or 'extend the DAG'. For testing and debugging DAGs, see the testing-dags skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3255,3256,3257,3260],{"name":13,"slug":14,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3258,"slug":3259,"type":15},"ETL","etl",{"name":3202,"slug":3203,"type":15},"2026-04-06T18:01:52.679888",{"slug":3263,"name":3263,"fn":3264,"description":3265,"org":3266,"tags":3267,"stars":27,"repoUrl":28,"updatedAt":3276},"authoring-go-sdk-tasks","implement Airflow tasks in Go","Writes Airflow task logic in Go using the Airflow Go SDK. Use when the user wants to implement Airflow tasks in Go, asks about `BundleProvider`\u002F`RegisterDags`, the `bundlev1` Registry\u002FDag interfaces, registering Go tasks (`AddTask`\u002F`AddTaskWithName`), dependency injection by parameter type (`context.Context`, `sdk.TIRunContext`, `*slog.Logger`, `sdk.Client`), or reading connections\u002Fvariables\u002FXComs from Go. This skill covers the Go-specific native API; the shared Python-stub pattern and conceptual model live in authoring-language-sdk-tasks. For building\u002Fpacking\u002Fshipping the bundle see deploying-go-sdk-bundles; for coordinator config see configuring-airflow-language-sdks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3268,3269,3272,3273],{"name":13,"slug":14,"type":15},{"name":3270,"slug":3271,"type":15},"API Development","api-development",{"name":3173,"slug":3174,"type":15},{"name":3274,"slug":3275,"type":15},"Go","go","2026-07-11T05:39:13.552213",{"slug":3278,"name":3278,"fn":3279,"description":3280,"org":3281,"tags":3282,"stars":27,"repoUrl":28,"updatedAt":3290},"authoring-java-sdk-tasks","implement Airflow tasks in Java","Writes Airflow task logic in Java, Kotlin, or any JVM language using the Airflow Java SDK. Use when the user wants to implement Airflow tasks in Java\u002FJVM, asks about `@Builder.Dag`\u002F`@Builder.Task`\u002F`@Builder.XCom`, the `Task`\u002F`BundleBuilder` interfaces, reading connections\u002Fvariables\u002FXComs from Java, the JSON-to-Java type mapping, or logging from Java tasks. This skill covers the Java-specific native API; the shared Python-stub pattern and conceptual model live in authoring-language-sdk-tasks. For building\u002Fshipping the bundle see deploying-java-sdk-bundles; for coordinator config see configuring-airflow-language-sdks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3283,3284,3287],{"name":3173,"slug":3174,"type":15},{"name":3285,"slug":3286,"type":15},"Engineering","engineering",{"name":3288,"slug":3289,"type":15},"Java","java","2026-07-18T05:48:13.374003",{"slug":3292,"name":3292,"fn":3293,"description":3294,"org":3295,"tags":3296,"stars":27,"repoUrl":28,"updatedAt":3300},"authoring-language-sdk-tasks","implement non-Python Airflow tasks","The language-neutral foundation for Airflow language SDKs — implement task logic in a non-Python language while the DAG stays in Python. Use when the user wants to run an Airflow task in another language (Java, Kotlin, Go, or other JVM\u002Fnative languages), asks how the Python `@task.stub` pairs with native task code, how task\u002FDAG IDs must match across the two sides, how data passes via XCom as JSON, or which language SDKs exist. This skill owns the shared Python-stub pattern and conceptual model; for a specific language's native API, build, and runtime, use that language's skill (e.g. authoring-java-sdk-tasks, authoring-go-sdk-tasks).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3297,3298,3299],{"name":13,"slug":14,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3285,"slug":3286,"type":15},"2026-07-18T05:11:54.496539",{"slug":3302,"name":3302,"fn":3303,"description":3304,"org":3305,"tags":3306,"stars":27,"repoUrl":28,"updatedAt":3313},"blueprint","build reusable Airflow task group templates","Define reusable Airflow task group templates with Pydantic validation and compose DAGs from YAML. Use when creating blueprint templates, composing DAGs from YAML, validating configurations, or enabling no-code DAG authoring for non-engineers.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3307,3308,3309,3310],{"name":13,"slug":14,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3258,"slug":3259,"type":15},{"name":3311,"slug":3312,"type":15},"Templates","templates","2026-04-06T18:01:45.361425",{"slug":344,"name":344,"fn":3315,"description":3316,"org":3317,"tags":3318,"stars":27,"repoUrl":28,"updatedAt":3325},"check data freshness in warehouses","Quick data freshness check. Use when the user asks if data is up to date, when a table was last updated, if data is stale, or needs to verify data currency before using it.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3319,3320,3321,3324],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3322,"slug":3323,"type":15},"Data Quality","data-quality",{"name":3258,"slug":3259,"type":15},"2026-04-06T18:02:02.138565",34,{"items":3328,"total":3326},[3329,3336,3342,3349,3356,3363,3370],{"slug":14,"name":14,"fn":3164,"description":3165,"org":3330,"tags":3331,"stars":27,"repoUrl":28,"updatedAt":3178},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3332,3333,3334,3335],{"name":13,"slug":14,"type":15},{"name":3170,"slug":3171,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3176,"slug":3177,"type":15},{"slug":3180,"name":3180,"fn":3181,"description":3182,"org":3337,"tags":3338,"stars":27,"repoUrl":28,"updatedAt":3190},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3339,3340,3341],{"name":13,"slug":14,"type":15},{"name":3187,"slug":3188,"type":15},{"name":3173,"slug":3174,"type":15},{"slug":3192,"name":3192,"fn":3193,"description":3194,"org":3343,"tags":3344,"stars":27,"repoUrl":28,"updatedAt":3207},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3345,3346,3347,3348],{"name":13,"slug":14,"type":15},{"name":3199,"slug":3200,"type":15},{"name":3202,"slug":3203,"type":15},{"name":3205,"slug":3206,"type":15},{"slug":3209,"name":3209,"fn":3210,"description":3211,"org":3350,"tags":3351,"stars":27,"repoUrl":28,"updatedAt":3220},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3352,3353,3354,3355],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3218,"slug":3219,"type":15},{"slug":337,"name":337,"fn":3222,"description":3223,"org":3357,"tags":3358,"stars":27,"repoUrl":28,"updatedAt":3236},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3359,3360,3361,3362],{"name":3227,"slug":3228,"type":15},{"name":3230,"slug":3231,"type":15},{"name":17,"slug":18,"type":15},{"name":3234,"slug":3235,"type":15},{"slug":3238,"name":3238,"fn":3239,"description":3240,"org":3364,"tags":3365,"stars":27,"repoUrl":28,"updatedAt":3249},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3366,3367,3368,3369],{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3247,"slug":3248,"type":15},{"slug":316,"name":316,"fn":3251,"description":3252,"org":3371,"tags":3372,"stars":27,"repoUrl":28,"updatedAt":3261},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3373,3374,3375,3376],{"name":13,"slug":14,"type":15},{"name":3173,"slug":3174,"type":15},{"name":3258,"slug":3259,"type":15},{"name":3202,"slug":3203,"type":15}]