nao publishes six context-engineering skills β standard SKILL.md files (YAML frontmatter + markdown) that any agentic CLI (Claude Code, Codex, Cursor, the Claude Agent SDK, β¦) can load and invoke.Each skill is a self-contained workflow that automates one stage of the Context Engineering lifecycle: scoping a project, writing rules, building a test suite, auditing whatβs there, adding a semantic layer once tests show metric gaps, and deploying context to production via CI.
These skills are for the human/agent driving nao (in their IDE or terminal). They are different from the runtime skills the chat agent calls at query time β see Tools, MCPs, Skills for those.
Run from the root of the project where nao_config.yaml lives. Re-run any time to pick up updates; pass through --force to overwrite local edits.
Once installed, the skills are auto-discovered by Claude Code, Codex, and other agentic CLIs that load .claude/skills/. Trigger one by name (e.g. βuse the setup-context skillβ) or let the agent route on the skill description.
Takes the user from pip install nao-core to a synced project with a starter RULES.md. First-time install only β for editing rules, generating tests, or reviewing an existing context, use the other skills below.Steps
Ask everything in one round β warehouse + auth, scope (which tables, β€100 with 20 as the target), extra context (dbt / ETL / BI repos, Notion, internal docs), LLM provider.
Owns RULES.md. Generates the six standard sections, section by section, showing the user each block before moving on. If RULES.md already has content, runs an audit-and-fill flow that fills only whatβs missing.Steps
## Business overview β Product + Business model (sourced from web search + databases/ + dbt repo).
## Data architecture β Warehouse, data stack, layers, sources.
## Core data models β ### Most Used Tables (one-line pointers) + ### Tables detail (Purpose, Granularity, Key Columns β€10, Use For).
## Date filtering β three example formulas (last X weeks / last X days / current month) keyed off the userβs week-boundary and current-period-inclusion conventions.
## Analysis Process β five subsections: Understand β Select Table β Write Query β Validate β Context.
Validate metrics with the user β confirm every source-of-truth pointer in the metrics reference.
Date filtering, with the user β pick week boundary (Sunday vs Monday) and current-period inclusion.
# RULES.md> Included with every message sent to the nao agent. Keep it lean.> Per-table detail belongs in `databases/<table>.md`, not here.## Business overview**Product**: β¦**Business model**: β¦## Data architecture**Warehouse:** β¦**Data stack:** β¦**Data layers:** β¦**Data sources:** β¦## Core data models### Most Used Tables- `<table>` β one-line purpose. See `databases/.../table=<table>/` folder.### Tables detail#### `<table>`**Purpose**: β¦**Granularity**: One row per β¦**Key Columns**: (β€10)**Use For**: β¦## Key Metrics Reference### <Category>- **<metric>** β `<table>.<column>`, `<formula>`## Date filtering> Convention: e.g. "Week starts Monday; 'last X weeks' excludes the current incomplete week."### Last X weeks```sqlβ¦```### Last X days### Current month## Analysis Process### 1. Understand the Question### 2. Select the Right Table(s)### 3. Write Efficient Queries### 4. Validate Results### 5. Provide Context
Generates a test suite of natural-language β SQL pairs that becomes the reliability benchmark. nao test runs each prompt through the agent, executes both the agentβs SQL and the testβs expected SQL, and diffs the result data row-by-row. See Evaluation for the scoring model.Two authoring rules
Prompts read like real chat. Short, vague, no table / column / method hints. "How's churn looking this quarter?", not "What was the churn rate from fct_subscriptions in Q1?".
Output column names encode format / unit, not source.churn_rate_float_0_1, not churn_rate_from_fct_subscriptions.
Steps
Ask once β does the user have trusted source-of-truth queries (Looker, dashboards, prior benchmarks)? Transform each into a test; for metrics without a trusted query, draft new ones.
Save flat under tests/ (no subfolders), one YAML file per test.
Have the user validate β prompts match their teamβs phrasing, SQL matches their definition of truth.
Run nao test -m <model_id> -t 10 β recap pass rate, token cost, wall-clock time as the baseline.
Diagnose failures β read tests/outputs/, identify the rule gap, route to write-context-rules for the smallest fix. Re-run between fixes so impact is attributable.
name: churn_rate_last_quarterprompt: How's churn looking this quarter?sql: | SELECT SAFE_DIVIDE(churned, total) AS churn_rate_float_0_1 FROM ( SELECT COUNTIF(churned_at IS NOT NULL) AS churned, COUNT(*) AS total FROM <project>.<schema>.fct_subscriptions WHERE started_at < DATE_TRUNC(CURRENT_DATE, QUARTER) );# Optional:# category: revenue | activity | conversion | churn | retention | β¦# difficulty: easy | medium | hard# notes: why this test matters / what failure mode it catches
Diagnoses a nao context. Finds gaps, MECE violations, failure root causes, and bloat. Output is a short in-conversation report ending in a prioritized plan. Diagnose only β never fixes. Routes fixes to write-context-rules / add-semantic-layer / create-context-tests. Run any time: right after setup-context, mid-build, before a release, or when behavior gets surprising.Steps β six checks in order
Synced context β whatβs wired in (warehouse, repos, Notion, semantic layer, MCPs) vs missing. Has nao sync run? Scope check: β€100 tables hard ceiling, β€20 ideal. Oversized scope is the biggest predictor of reliability failure β flag it explicitly.
RULES.md vs target structure β six sections from write-context-rules. Per section, mark present / missing / thin. Flag placeholders, TODO: markers, and metric entries with no source-of-truth pointer.
Per-table coverage β every table in databases/: is it in ## Most Used Tables? Has a ## Tables detail block? dbt context (schema.yml)? Per-table gaps: undocumented columns, calculated fields with no explanation, foreign keys with no relation.
Data model consistency (MECE) β two tables computing the same metric differently? Asked metrics no in-scope table can answer? Duplicated columns under different names? Ambiguous columns (amount without unit, status without enum values)?
Test coverage β if tests/ is empty, recommend create-context-tests. Otherwise read tests/outputs/ and categorize each failure (data model / date selection / test issue / interpretation / metric definition) with the smallest rule change per failure.
Token optimization β files >40KB, ## Tables detail blocks past the 10-column cap, duplication between RULES.md and databases/<table>.md, in-scope tables with no mention in any test.
OutputLead with a one-paragraph summary (sync state | scope wideness | rules quality (N/6 sections substantive) | test coverage), deep-dive only sections with findings, end with a prioritized plan that names the skill that does each fix:
Wires a semantic layer into the agent so metric queries go through a single canonical definition. Only after nao test shows metric-reliability failures β not before. A semantic layer reduces the scope of answerable questions; the trade-off only pays off when reliability is the bottleneck. Schema gaps or date logic failures are rule-fixes, not semantic-layer fixes.Steps
Pick the tool
Option
Type
When
dbt MetricFlow
Metric store
Already running dbt Cloud with the Semantic Layer enabled.
Snowflake views / semantic
Semantic layer
Snowflake; using curated views or native semantic views.
nao semantic files
Semantic layer
No existing layer. Want a lightweight in-repo YAML.
Other (Looker, Cube, β¦)
Varies
Search the MCP registry; otherwise fall back to nao YAML.
Install the matching MCP under .claude/mcp.json (dbt-mcp / mcp-server-snowflake / Cortex MCP, etc.). Credentials via ${ENV_VAR} only β never inline.
Hand off to write-context-rules to route every metric in ## Key Metrics Reference through the new layer (e.g. MRR β query via dbt MCP query_metric (semantic layer)).
Validate β nao chat one of the userβs top questions, confirm the agent uses the semantic layer, then nao test and compare to the pre-semantic-layer baseline pass rate. Reliability is the only reason to do this β measure it.
dimensions: - name: date type: date description: Calendar date. Use this for any time-based slicing. - name: plan type: categorical description: Subscription plan tier. values: [free, pro, enterprise]metrics: - name: mrr definition: Monthly Recurring Revenue from active paying subscriptions, in USD. source: table: fct_stripe_mrr column: mrr_amount aggregation: SUM # SUM | COUNT | COUNT_DISTINCT | AVG | MIN | MAX grain: month # day | week | month | quarter | year dimensions: [date, plan, country] filters: - "status = 'active'"
For the dbt MetricFlow / Snowflake / Cortex paths, the metric definitions live upstream β this skill installs the MCP and routes RULES.md to it instead of writing local YAML.
Wires a GitHub Actions workflow that runs nao deploy on every push to main, so context changes go live automatically. Handles API key creation, GitHub Secrets setup, .naoignore hardening, and the workflow file itself.Steps
Prerequisites check β remote URL, repo, project_name, confirm who can mint an API key.
API key creation β open Settings -> Organization Settings and use the Organization API Keys card. The key is shown once; store it as a GitHub Secret, never in the workflow or nao_config.yaml.
GitHub Secrets β NAO_URL and NAO_API_KEY, plus optional warehouse/Notion secrets if the user also wants nao sync in CI. For multi-environment teams, use GitHub Environments.
.naoignore hardening β review the always-excluded set (.git, .venv, .env, node_modules, __pycache__, repos, *.pyc) and add project-specific patterns.
Workflow file β .github/workflows/nao-deploy.yml with on: push: branches: [main], workflow_dispatch, concurrency serialization, and the API key passed via env: (never a CLI literal).
Optional nao sync step β most teams keep sync on a cron and let its commit trigger the deploy workflow.
End-to-end verification β trigger a push, watch for the success message, confirm the remote project matches main.
Guardrails: never commit secrets; one API key per repo/environment; no pull_request trigger (forks could exfiltrate the key); every deploy is a full replacement.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"nao Labs","colors":{"primary":"#522BFF","light":"#FAFAFD","dark":"#1D1F24"},"logo":{"light":"https://mintcdn.com/naolabs/GfySj0mWgsca4SVG/logo/light.svg?fit=max\u0026auto=format\u0026n=GfySj0mWgsca4SVG\u0026q=85\u0026s=b70099fe6c9ac8679aeb115e3819d55c","dark":"https://mintcdn.com/naolabs/GfySj0mWgsca4SVG/logo/dark.svg?fit=max\u0026auto=format\u0026n=GfySj0mWgsca4SVG\u0026q=85\u0026s=af44c01c99c28a86b3862898cd71efd5"},"favicon":"https://mintcdn.com/naolabs/m5BzQr8fEtipgbHO/favicon.svg?fit=max\u0026auto=format\u0026n=m5BzQr8fEtipgbHO\u0026q=85\u0026s=e6a1d84767c52f778ba3f8ac93c2adf2","background":{"color":{"light":"#FAFAFD","dark":"#1D1F24"}},"navbar":{"links":[{"href":"https://getnao.io/blog","label":"Blog"},{"href":"mailto:claire@getnao.io","label":"Support"}]},"footer":{"socials":{"slack":"https://join.slack.com/t/naolabs/shared_invite/zt-4080jlm79-nm52x5nZhG2N1ben8zwpiQ"}},"errors":{"404":{"redirect":false,"title":"404: Data Not Found","description":"This page returned **NULL**. Looks like this query didn't find what you were looking for! Try checking the [navigation](/nao-ide/get-started/welcome) or use our [search](/nao-ide/get-started/welcome) to find what you need."}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/getnao/nao"},{"anchor":"Slack","icon":"slack","href":"https://join.slack.com/t/naolabs/shared_invite/zt-4080jlm79-nm52x5nZhG2N1ben8zwpiQ"},{"anchor":"Blog","icon":"book","href":"https://getnao.io/blog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"naolabs","hasAudioNarration":false,"actualSubdomain":"naolabs","customDomains":["docs.getnao.io"],"gitSource":{"type":"github","owner":"getnao","repo":"nao-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad770a974c27b150078e962","collectionId":"84d38ed9-a70f-4b32-8df0-40ada12e8ca2","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad770a974c27b150078e962"},"entitlements":{},"buildId":"6ad770a974c27b150078e962","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"nao Open Source Agent","count":54},{"language":"default","tag":"nao IDE","count":32},{"language":"default","tag":"Chat Interface","count":17},{"language":"default","tag":"Get Started","count":11},{"language":"default","tag":"Context Builder","count":10},{"language":"default","tag":"Admin","count":7},{"language":"default","tag":"Capabilities","count":7},{"language":"default","tag":"Context Providers","count":7},{"language":"default","tag":"nao AI","count":7},{"language":"default","tag":"Connectors","count":6}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"styles.css","content":"@font-face{font-family:'Borna';src:url(/fonts/Borna/Borna-Regular.otf) format('opentype');font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:'Borna';src:url(/fonts/Borna/Borna-Medium.otf) format('opentype');font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:'Borna';src:url(/fonts/Borna/Borna-SemiBold.otf) format('opentype');font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:'Borna';src:url(/fonts/Borna/Borna-Bold.otf) format('opentype');font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:'Geist';src:url(/fonts/Geist/webfonts/Geist-Regular.woff2) format('woff2');font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:'Geist';src:url(/fonts/Geist/webfonts/Geist-Medium.woff2) format('woff2');font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:'Geist';src:url(/fonts/Geist/webfonts/Geist-SemiBold.woff2) format('woff2');font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:'Geist';src:url(/fonts/Geist/webfonts/Geist-Bold.woff2) format('woff2');font-weight:700;font-style:normal;font-display:swap}:root{--font-heading:'Borna', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;--font-body:'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif}.mdx-heading,.title,[class*=heading]{font-family:var(--font-heading)}.mdx-content,[class*=content],body,div,p,span{font-family:var(--font-body)}h1,h2,h3,h4,h5,h6{font-family:var(--font-heading)!important;font-weight:500!important}.sidebar-title{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif!important}.highlight,.highlight *,.highlight code,.highlight pre,.hljs,.hljs *,.shiki,.shiki *,.shiki code,.shiki code *,.shiki pre,.shiki pre *,.token,[class*=Code],[class*=Code] *,[class*=code],[class*=code] *,code,code *,div code,div pre,div[class*=Code],div[class*=code],pre,pre *,pre code,pre code *{font-family:'SF Mono','Monaco','Inconsolata','Fira Code','Droid Sans Mono','Source Code Pro','Courier New',Courier,monospace!important}.eyebrow,.eyebrow.dark\\:text-primary-light,.eyebrow.text-primary,[class*=eyebrow]{color:#000!important;font-weight:400!important}img{border-radius:10px!important}img[alt*=\"Nao logo\"],img[alt*=\"nao logo\"],img[alt=nao],img[src*=\"/logo/\"]{border-radius:0!important}.Card,.card,[class*=Card],[class*=card]{background-color:#fafafd!important;border:0!important;box-shadow:none!important}.dark .Card,.dark .card,.dark [class*=Card],.dark [class*=card]{background-color:#1d1f24!important;border:0!important;box-shadow:none!important}"}],"page":{"pagePath":"nao-agent/context-engineering/skills","slug":"/nao-agent/context-engineering/skills","pageMetadata":{"title":"Skills","description":"Six published nao skills that automate the context-engineering lifecycle inside Claude Code, Codex, Cursor, or any agent that loads SKILL.md files","href":"/nao-agent/context-engineering/skills"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Six published nao skills that automate the context-engineering lifecycle inside Claude Code, Codex, Cursor, or any agent that loads SKILL.md files\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedFrame,Table,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedFrame)_missingMdxReference(`OptimizedFrame`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`what-these-skills-are`,children:`What these skills are`}),`\n`,_jsxs(_components.p,{children:[`nao publishes six `,_jsx(_components.strong,{children:`context-engineering skills`}),` β standard `,_jsx(_components.code,{children:`SKILL.md`}),` files (YAML frontmatter + markdown) that any agentic CLI (Claude Code, Codex, Cursor, the Claude Agent SDK, β¦) can load and invoke.`]}),`\n`,_jsxs(_components.p,{children:[`Each skill is a self-contained workflow that automates one stage of the `,_jsx(_components.a,{href:`/nao-agent/context-engineering/playbook`,children:`Context Engineering lifecycle`}),`: scoping a project, writing rules, building a test suite, auditing whatβs there, adding a semantic layer once tests show metric gaps, and deploying context to production via CI.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`These skills are `,_jsx(_components.strong,{children:`for the human/agent driving nao`}),` (in their IDE or terminal). They are different from the runtime skills the chat agent calls at query time β see `,_jsx(_components.a,{href:`/nao-agent/chat/capabilities/tools-mcps-skills`,children:`Tools, MCPs, Skills`}),` for those.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`demo`,children:`Demo`}),`\n`,_jsx(`div`,{style:{maxWidth:`1400px`,margin:`1.5rem auto 0`},children:_jsx(OptimizedFrame,{className:`mint-w-full mint-aspect-video mint-rounded-xl`,src:`https://www.youtube.com/embed/2U5MJyQlL7k?modestbranding=1\u0026rel=0\u0026iv_load_policy=3\u0026showinfo=0`,title:`nao skills demo`,allow:`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture`,allowFullScreen:true})}),`\n`,_jsx(Heading,{level:`2`,id:`install`,children:`Install`}),`\n`,_jsxs(_components.p,{children:[`The published source of truth lives at `,_jsx(_components.a,{href:`https://github.com/getnao/nao/tree/main/skills`,children:`github.com/getnao/nao/tree/main/skills`}),`. Install all five into the current projectβs `,_jsx(_components.code,{children:`.claude/skills/`}),` with:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`nao`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` skills`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` getnao/nao`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`nao skills`}),` is a thin wrapper around the `,_jsxs(_components.a,{href:`https://github.com/vercel-labs/skills`,children:[`open-source `,_jsx(_components.code,{children:`skills`}),` CLI from Vercel Labs`]}),`, so the equivalent direct call also works:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`npx`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` skills`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` add`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` getnao/nao`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Run from the root of the project where `,_jsx(_components.code,{children:`nao_config.yaml`}),` lives. Re-run any time to pick up updates; pass through `,_jsx(_components.code,{children:`--force`}),` to overwrite local edits.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Once installed, the skills are auto-discovered by Claude Code, Codex, and other agentic CLIs that load `,_jsx(_components.code,{children:`.claude/skills/`}),`. Trigger one by name (e.g. βuse the setup-context skillβ) or let the agent route on the skill description.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`the-six-skills`,children:`The six skills`}),`\n`,_jsx(Heading,{level:`3`,id:`setup-context`,children:`setup-context`}),`\n`,_jsxs(_components.p,{children:[`Takes the user from `,_jsx(_components.code,{children:`pip install nao-core`}),` to a synced project with a starter `,_jsx(_components.code,{children:`RULES.md`}),`. `,_jsx(_components.strong,{children:`First-time install only`}),` β for editing rules, generating tests, or reviewing an existing context, use the other skills below.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Steps`})}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Ask everything in one round`}),` β warehouse + auth, scope (which tables, β€100 with 20 as the target), extra context (dbt / ETL / BI repos, Notion, internal docs), LLM provider.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Look up the warehouse-specific config`}),` from `,_jsx(_components.a,{href:`/nao-agent/context-builder/databases`,children:`docs.getnao.io/nao-agent/context-builder/databases`}),`, write `,_jsx(_components.code,{children:`nao_config.yaml`}),`, run `,_jsx(_components.code,{children:`nao init`}),`, then print a summary for the user to confirm before continuing.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`nao sync`})}),` β populate `,_jsx(_components.code,{children:`databases/`}),`, `,_jsx(_components.code,{children:`repos/`}),`, `,_jsx(_components.code,{children:`docs/`}),`, `,_jsx(_components.code,{children:`semantics/`}),`. Donβt move on until sync is clean.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Generate `,_jsx(_components.code,{children:`RULES.md`})]}),` by handing off to `,_jsx(_components.code,{children:`write-context-rules`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Wire up the LLM key`}),` via `,_jsx(_components.code,{children:\"${ANTHROPIC_API_KEY}\"}),` (or equivalent) β never paste keys into chat.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Recommend next steps`}),` β smoke test with `,_jsx(_components.code,{children:`nao chat`}),`, review `,_jsx(_components.code,{children:`RULES.md`}),`, then `,_jsx(_components.code,{children:`create-context-tests`}),`.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`write-context-rules`,children:`write-context-rules`}),`\n`,_jsxs(_components.p,{children:[`Owns `,_jsx(_components.code,{children:`RULES.md`}),`. Generates the six standard sections, section by section, showing the user each block before moving on. If `,_jsx(_components.code,{children:`RULES.md`}),` already has content, runs an audit-and-fill flow that fills only whatβs missing.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Steps`})}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`## Business overview`})}),` β Product + Business model (sourced from web search + `,_jsx(_components.code,{children:`databases/`}),` + dbt repo).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`## Data architecture`})}),` β Warehouse, data stack, layers, sources.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`## Core data models`})}),` β `,_jsx(_components.code,{children:`### Most Used Tables`}),` (one-line pointers) + `,_jsx(_components.code,{children:`### Tables detail`}),` (Purpose, Granularity, Key Columns β€10, Use For).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`## Key Metrics Reference`})}),` β grouped by category; `,_jsx(_components.code,{children:`**metric** β table, column, formula`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`## Date filtering`})}),` β three example formulas (last X weeks / last X days / current month) keyed off the userβs week-boundary and current-period-inclusion conventions.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`## Analysis Process`})}),` β five subsections: Understand β Select Table β Write Query β Validate β Context.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Validate metrics with the user`}),` β confirm every source-of-truth pointer in the metrics reference.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Date filtering, with the user`}),` β pick week boundary (Sunday vs Monday) and current-period inclusion.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Template`}),` β `,_jsx(_components.a,{href:`https://github.com/getnao/nao/blob/main/skills/write-context-rules/templates/RULES.md`,children:_jsx(_components.code,{children:`templates/RULES.md`})}),`, the six-section scaffold:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`45`,language:`markdown`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`markdown`,children:_jsxs(_components.code,{language:`markdown`,numberOfLines:`45`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`# RULES.md`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#6A9955`},children:`>`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#D4D4D4`},children:` Included with every message sent to the nao agent. Keep it lean.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#6A9955`},children:`>`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#D4D4D4`},children:` Per-table detail belongs in `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`databases/\u003ctable>.md`\"}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#D4D4D4`},children:`, not here.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Business overview`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Product**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: β¦`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Business model**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: β¦`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Data architecture`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Warehouse:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` β¦`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Data stack:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` β¦`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Data layers:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` β¦`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Data sources:**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` β¦`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Core data models`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Most Used Tables`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\" `\u003ctable>`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` β one-line purpose. See `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`databases/.../table=\u003ctable>/`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` folder.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Tables detail`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`#### `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#CE9178`,\"--shiki-dark-font-weight\":`bold`},children:\"`\u003ctable>`\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Purpose**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: β¦`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Granularity**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: One row per β¦`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Key Columns**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: (β€10)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**Use For**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: β¦`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Key Metrics Reference`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#808080`,\"--shiki-dark-font-weight\":`bold`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`Category`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#808080`,\"--shiki-dark-font-weight\":`bold`},children:`>`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#6796E6`},children:`-`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:` **`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#808080`,\"--shiki-dark-font-weight\":`bold`},children:`\u003c`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`metric`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#808080`,\"--shiki-dark-font-weight\":`bold`},children:`>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` β `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`\u003ctable>.\u003ccolumn>`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:\"`\u003cformula>`\"})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Date filtering`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#6A9955`},children:`>`}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#D4D4D4`},children:` Convention: e.g. \"Week starts Monday; 'last X weeks' excludes the current incomplete week.\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Last X weeks`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:\"```sql\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`β¦`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:\"```\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Last X days`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### Current month`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`## Analysis Process`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### 1. Understand the Question`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### 2. Select the Right Table(s)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### 3. Write Efficient Queries`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### 4. Validate Results`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-light-font-weight\":`bold`,\"--shiki-dark\":`#569CD6`,\"--shiki-dark-font-weight\":`bold`},children:`### 5. Provide Context`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`create-context-tests`,children:`create-context-tests`}),`\n`,_jsxs(_components.p,{children:[`Generates a test suite of natural-language β SQL pairs that becomes the reliability benchmark. `,_jsx(_components.code,{children:`nao test`}),` runs each prompt through the agent, executes both the agentβs SQL and the testβs expected SQL, and `,_jsx(_components.strong,{children:`diffs the result data row-by-row`}),`. See `,_jsx(_components.a,{href:`/nao-agent/context-engineering/evaluation`,children:`Evaluation`}),` for the scoring model.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Two authoring rules`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Prompts read like real chat.`}),` Short, vague, no table / column / method hints. `,_jsx(_components.code,{children:`\"How's churn looking this quarter?\"`}),`, not `,_jsx(_components.code,{children:`\"What was the churn rate from fct_subscriptions in Q1?\"`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Output column names encode format / unit, not source.`}),` `,_jsx(_components.code,{children:`churn_rate_float_0_1`}),`, not `,_jsx(_components.code,{children:`churn_rate_from_fct_subscriptions`}),`.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Steps`})}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Ask once`}),` β does the user have trusted source-of-truth queries (Looker, dashboards, prior benchmarks)? Transform each into a test; for metrics without a trusted query, draft new ones.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Save flat under `,_jsx(_components.code,{children:`tests/`})]}),` (no subfolders), one YAML file per test.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Have the user validate`}),` β prompts match their teamβs phrasing, SQL matches their definition of truth.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Run `,_jsx(_components.code,{children:`nao test -m \u003cmodel_id> -t 10`})]}),` β recap pass rate, token cost, wall-clock time as the baseline.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Diagnose failures`}),` β read `,_jsx(_components.code,{children:`tests/outputs/`}),`, identify the rule gap, route to `,_jsx(_components.code,{children:`write-context-rules`}),` for the smallest fix. Re-run between fixes so impact is attributable.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Template`}),` β `,_jsx(_components.a,{href:`https://github.com/getnao/nao/blob/main/skills/create-context-tests/templates/test.yaml`,children:_jsx(_components.code,{children:`templates/test.yaml`})}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`churn_rate_last_quarter`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`prompt`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`How's churn looking this quarter?`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`sql`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`|`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` SELECT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` SAFE_DIVIDE(churned, total) AS churn_rate_float_0_1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` FROM (`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` SELECT`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` COUNTIF(churned_at IS NOT NULL) AS churned,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` COUNT(*) AS total`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` FROM \u003cproject>.\u003cschema>.fct_subscriptions`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` WHERE started_at \u003c DATE_TRUNC(CURRENT_DATE, QUARTER)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` );`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Optional:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# category: revenue | activity | conversion | churn | retention | β¦`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# difficulty: easy | medium | hard`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# notes: why this test matters / what failure mode it catches`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`audit-context`,children:`audit-context`}),`\n`,_jsxs(_components.p,{children:[`Diagnoses a nao context. Finds gaps, MECE violations, failure root causes, and bloat. Output is a short in-conversation report ending in a prioritized plan. `,_jsx(_components.strong,{children:`Diagnose only β never fixes.`}),` Routes fixes to `,_jsx(_components.code,{children:`write-context-rules`}),` / `,_jsx(_components.code,{children:`add-semantic-layer`}),` / `,_jsx(_components.code,{children:`create-context-tests`}),`. Run any time: right after `,_jsx(_components.code,{children:`setup-context`}),`, mid-build, before a release, or when behavior gets surprising.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Steps β six checks in order`})}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Synced context`}),` β whatβs wired in (warehouse, repos, Notion, semantic layer, MCPs) vs missing. Has `,_jsx(_components.code,{children:`nao sync`}),` run? Scope check: β€100 tables hard ceiling, β€20 ideal. Oversized scope is the biggest predictor of reliability failure β flag it explicitly.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`RULES.md`}),` vs target structure`]}),` β six sections from `,_jsx(_components.code,{children:`write-context-rules`}),`. Per section, mark `,_jsx(_components.strong,{children:`present / missing / thin`}),`. Flag placeholders, `,_jsx(_components.code,{children:`TODO:`}),` markers, and metric entries with no source-of-truth pointer.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Per-table coverage`}),` β every table in `,_jsx(_components.code,{children:`databases/`}),`: is it in `,_jsx(_components.code,{children:`## Most Used Tables`}),`? Has a `,_jsx(_components.code,{children:`## Tables detail`}),` block? dbt context (`,_jsx(_components.code,{children:`schema.yml`}),`)? Per-table gaps: undocumented columns, calculated fields with no explanation, foreign keys with no relation.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Data model consistency (MECE)`}),` β two tables computing the same metric differently? Asked metrics no in-scope table can answer? Duplicated columns under different names? Ambiguous columns (`,_jsx(_components.code,{children:`amount`}),` without unit, `,_jsx(_components.code,{children:`status`}),` without enum values)?`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Test coverage`}),` β if `,_jsx(_components.code,{children:`tests/`}),` is empty, recommend `,_jsx(_components.code,{children:`create-context-tests`}),`. Otherwise read `,_jsx(_components.code,{children:`tests/outputs/`}),` and categorize each failure (data model / date selection / test issue / interpretation / metric definition) with the smallest rule change per failure.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Token optimization`}),` β files >40KB, `,_jsx(_components.code,{children:`## Tables detail`}),` blocks past the 10-column cap, duplication between `,_jsx(_components.code,{children:`RULES.md`}),` and `,_jsx(_components.code,{children:`databases/\u003ctable>.md`}),`, in-scope tables with no mention in any test.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Output`})}),`\n`,_jsxs(_components.p,{children:[`Lead with a one-paragraph summary (`,_jsx(_components.code,{children:`sync state | scope wideness | rules quality (N/6 sections substantive) | test coverage`}),`), deep-dive only sections with findings, end with a prioritized plan that names the skill that does each fix:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`6`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`## Plan`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`1. (easy / 5 min) β¦ β write-context-rules`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`2. (small / 30 min) β¦ β create-context-tests`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`3. (medium / 1-2 hr) β¦ β audit-context (rerun after)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`4. (large / multi-session) β¦ β add-semantic-layer`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`add-semantic-layer`,children:`add-semantic-layer`}),`\n`,_jsxs(_components.p,{children:[`Wires a semantic layer into the agent so metric queries go through a single canonical definition. `,_jsxs(_components.strong,{children:[`Only after `,_jsx(_components.code,{children:`nao test`}),` shows metric-reliability failures`]}),` β not before. A semantic layer reduces the scope of answerable questions; the trade-off only pays off when reliability is the bottleneck. Schema gaps or date logic failures are rule-fixes, not semantic-layer fixes.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Steps`})}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Pick the tool`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Option`}),_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`When`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`dbt MetricFlow`})}),_jsx(_components.td,{children:`Metric store`}),_jsx(_components.td,{children:`Already running dbt Cloud with the Semantic Layer enabled.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Snowflake views / semantic`})}),_jsx(_components.td,{children:`Semantic layer`}),_jsx(_components.td,{children:`Snowflake; using curated views or native semantic views.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`nao semantic files`})}),_jsx(_components.td,{children:`Semantic layer`}),_jsx(_components.td,{children:`No existing layer. Want a lightweight in-repo YAML.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Other`}),` (Looker, Cube, β¦)`]}),_jsx(_components.td,{children:`Varies`}),_jsx(_components.td,{children:`Search the MCP registry; otherwise fall back to nao YAML.`})]})]})]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Install the matching MCP`}),` under `,_jsx(_components.code,{children:`.claude/mcp.json`}),` (dbt-mcp / mcp-server-snowflake / Cortex MCP, etc.). Credentials via `,_jsx(_components.code,{children:\"${ENV_VAR}\"}),` only β never inline.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Hand off to `,_jsx(_components.code,{children:`write-context-rules`})]}),` to route every metric in `,_jsx(_components.code,{children:`## Key Metrics Reference`}),` through the new layer (e.g. `,_jsx(_components.code,{children:`MRR β query via dbt MCP query_metric (semantic layer)`}),`).`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Validate`}),` β `,_jsx(_components.code,{children:`nao chat`}),` one of the userβs top questions, confirm the agent uses the semantic layer, then `,_jsx(_components.code,{children:`nao test`}),` and `,_jsx(_components.strong,{children:`compare to the pre-semantic-layer baseline pass rate`}),`. Reliability is the only reason to do this β measure it.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Template β nao YAML option`}),` (`,_jsx(_components.a,{href:`https://github.com/getnao/nao/blob/main/skills/add-semantic-layer/templates/semantic.yaml`,children:_jsx(_components.code,{children:`templates/semantic.yaml`})}),`):`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`21`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`21`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`dimensions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`date`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`date`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` description`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Calendar date. Use this for any time-based slicing.`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`plan`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` type`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`categorical`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` description`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Subscription plan tier.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` values`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`free`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`pro`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`enterprise`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`metrics`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`mrr`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` definition`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`Monthly Recurring Revenue from active paying subscriptions, in USD.`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` source`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` table`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`fct_stripe_mrr`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` column`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`mrr_amount`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` aggregation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`SUM`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # SUM | COUNT | COUNT_DISTINCT | AVG | MIN | MAX`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` grain`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`month`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # day | week | month | quarter | year`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` dimensions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`plan`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`country`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` filters`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"status = 'active'\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`For the dbt MetricFlow / Snowflake / Cortex paths, the metric definitions live upstream β this skill installs the MCP and routes `,_jsx(_components.code,{children:`RULES.md`}),` to it instead of writing local YAML.`]}),`\n`,_jsx(Heading,{level:`3`,id:`deploy-context`,children:`deploy-context`}),`\n`,_jsxs(_components.p,{children:[`Wires a GitHub Actions workflow that runs `,_jsx(_components.code,{children:`nao deploy`}),` on every push to `,_jsx(_components.code,{children:`main`}),`, so context changes go live automatically. Handles API key creation, GitHub Secrets setup, `,_jsx(_components.code,{children:`.naoignore`}),` hardening, and the workflow file itself.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Steps`})}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Prerequisites check`}),` β remote URL, repo, `,_jsx(_components.code,{children:`project_name`}),`, confirm who can mint an API key.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`API key creation`}),` β open `,_jsx(_components.strong,{children:`Settings`}),` -> `,_jsx(_components.strong,{children:`Organization Settings`}),` and use the `,_jsx(_components.strong,{children:`Organization API Keys`}),` card. The key is shown once; store it as a GitHub Secret, never in the workflow or `,_jsx(_components.code,{children:`nao_config.yaml`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`GitHub Secrets`}),` β `,_jsx(_components.code,{children:`NAO_URL`}),` and `,_jsx(_components.code,{children:`NAO_API_KEY`}),`, plus optional warehouse/Notion secrets if the user also wants `,_jsx(_components.code,{children:`nao sync`}),` in CI. For multi-environment teams, use GitHub Environments.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[_jsx(_components.code,{children:`.naoignore`}),` hardening`]}),` β review the always-excluded set (`,_jsx(_components.code,{children:`.git`}),`, `,_jsx(_components.code,{children:`.venv`}),`, `,_jsx(_components.code,{children:`.env`}),`, `,_jsx(_components.code,{children:`node_modules`}),`, `,_jsx(_components.code,{children:`__pycache__`}),`, `,_jsx(_components.code,{children:`repos`}),`, `,_jsx(_components.code,{children:`*.pyc`}),`) and add project-specific patterns.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Workflow file`}),` β `,_jsx(_components.code,{children:`.github/workflows/nao-deploy.yml`}),` with `,_jsx(_components.code,{children:`on: push: branches: [main]`}),`, `,_jsx(_components.code,{children:`workflow_dispatch`}),`, concurrency serialization, and the API key passed via `,_jsx(_components.code,{children:`env:`}),` (never a CLI literal).`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Optional `,_jsx(_components.code,{children:`nao sync`}),` step`]}),` β most teams keep sync on a cron and let its commit trigger the deploy workflow.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`End-to-end verification`}),` β trigger a push, watch for the success message, confirm the remote project matches `,_jsx(_components.code,{children:`main`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Guardrails`}),`: never commit secrets; one API key per repo/environment; no `,_jsx(_components.code,{children:`pull_request`}),` trigger (forks could exfiltrate the key); every deploy is a full replacement.`]}),`\n`,_jsx(Heading,{level:`2`,id:`when-to-use-which`,children:`When to use which`}),`\n`,_jsx(CodeBlock,{numberOfLines:`17`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`17`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`setup-context β write-context-rules β create-context-tests β audit-context (anytime)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`(first time only) (any rules change) (benchmark + extend) (diagnose, never fix)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` β`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` βΌ`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` tests reveal metric`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` reliability gaps?`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` β`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` βΌ`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` add-semantic-layer`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` (then back to write-context-rules)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Ready to ship?`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` β`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` βΌ`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`deploy-context`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`(CI/CD to production)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`If you want toβ¦`}),_jsx(_components.th,{children:`Use`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Set up nao on a brand-new project`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`setup-context`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Generate or rewrite `,_jsx(_components.code,{children:`RULES.md`})]}),_jsx(_components.td,{children:_jsx(_components.code,{children:`write-context-rules`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Add tests for a new metric, or build the first benchmark`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`create-context-tests`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Find out whatβs missing, broken, or bloated`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`audit-context`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Make metric calculations consistent across questions`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`add-semantic-layer`}),` (only after tests show the gap)`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Refine `,_jsx(_components.code,{children:`RULES.md`}),` because the agent keeps making the same miss`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`write-context-rules`}),` (preceded by `,_jsx(_components.code,{children:`audit-context`}),` if unsure)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Auto-deploy context to production on every push`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`deploy-context`})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`source-material`,children:`Source material`}),`\n`,_jsx(_components.p,{children:`The skills are distilled from the public Context Engineering content:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/nao-agent/context-engineering/playbook`,children:`Playbook`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/nao-agent/context-engineering/principles`,children:`Principles`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/nao-agent/context-builder/rules-context`,children:`RULES.md`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/nao-agent/context-engineering/evaluation`,children:`Evaluation`})}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Read each skillβs source `,_jsx(_components.code,{children:`SKILL.md`}),` in the repo: `,_jsx(_components.a,{href:`https://github.com/getnao/nao/tree/main/skills`,children:`github.com/getnao/nao/tree/main/skills`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Skills","description":"Six published nao skills that automate the context-engineering lifecycle inside Claude Code, Codex, Cursor, or any agent that loads SKILL.md files","href":"/nao-agent/context-engineering/skills"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What these skills are","slug":"what-these-skills-are","depth":2,"children":[]},{"title":"Demo","slug":"demo","depth":2,"children":[]},{"title":"Install","slug":"install","depth":2,"children":[]},{"title":"The six skills","slug":"the-six-skills","depth":2,"children":[{"title":"setup-context","slug":"setup-context","depth":3,"children":[]},{"title":"write-context-rules","slug":"write-context-rules","depth":3,"children":[]},{"title":"create-context-tests","slug":"create-context-tests","depth":3,"children":[]},{"title":"audit-context","slug":"audit-context","depth":3,"children":[]},{"title":"add-semantic-layer","slug":"add-semantic-layer","depth":3,"children":[]},{"title":"deploy-context","slug":"deploy-context","depth":3,"children":[]}]},{"title":"When to use which","slug":"when-to-use-which","depth":2,"children":[]},{"title":"Source material","slug":"source-material","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"dynamicCss":".mint-aspect-video {\n aspect-ratio: 16 / 9\n}\n.mint-w-full {\n width: 100%\n}\n.mint-rounded-xl {\n border-radius: 0.75rem\n}","subdomain":"naolabs","siteName":"nao Labs","title":"Skills - nao Labs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-18T18:30:15.402Z","originalFileLocation":"nao-agent/context-engineering/skills.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Six published nao skills that automate the context-engineering lifecycle inside Claude Code, Codex, Cursor, or any agent that loads SKILL.md files\">\u003cmeta data-mint-head name=\"application-name\" content=\"nao Labs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Skills - nao Labs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Six published nao skills that automate the context-engineering lifecycle inside Claude Code, Codex, Cursor, or any agent that loads SKILL.md files\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"nao Labs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.getnao.io/nao-agent/context-engineering/skills\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://naolabs.mintlify.app/_mintlify/api/og/v2?division=Context+Engineering\u0026amp;title=Skills\u0026amp;description=Six+published+nao+skills+that+automate+the+context-engineering+lifecycle+inside+Claude+Code%2C+Codex%2C+Cursor%2C+or+any+agent+that+loads+SKILL.md+files\u0026amp;theme=328c4407a0572aa3bc93c201\u0026amp;signature=7b1413b3a6e0958176910f7e252d84ffd382790dcac86f0329df0b7c17cd88d4\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Skills - nao Labs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Six published nao skills that automate the context-engineering lifecycle inside Claude Code, Codex, Cursor, or any agent that loads SKILL.md files\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://naolabs.mintlify.app/_mintlify/api/og/v2?division=Context+Engineering\u0026amp;title=Skills\u0026amp;description=Six+published+nao+skills+that+automate+the+context-engineering+lifecycle+inside+Claude+Code%2C+Codex%2C+Cursor%2C+or+any+agent+that+loads+SKILL.md+files\u0026amp;theme=328c4407a0572aa3bc93c201\u0026amp;signature=7b1413b3a6e0958176910f7e252d84ffd382790dcac86f0329df0b7c17cd88d4\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/naolabs/0gNtSQeCliXzNtsF/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"nao Labs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#522BFF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.getnao.io/nao-agent/context-engineering/skills\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/nao-agent/context-engineering/skills.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.getnao.io/#organization\",\"name\":\"nao Labs\",\"url\":\"https://docs.getnao.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/naolabs/GfySj0mWgsca4SVG/logo/light.svg?fit=max\u0026auto=format\u0026n=GfySj0mWgsca4SVG\u0026q=85\u0026s=b70099fe6c9ac8679aeb115e3819d55c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.getnao.io#website\",\"name\":\"nao Labs\",\"url\":\"https://docs.getnao.io\",\"publisher\":{\"@id\":\"https://docs.getnao.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.getnao.io/nao-agent/context-engineering/skills#webpage\",\"url\":\"https://docs.getnao.io/nao-agent/context-engineering/skills\",\"name\":\"Skills\",\"description\":\"Six published nao skills that automate the context-engineering lifecycle inside Claude Code, Codex, Cursor, or any agent that loads SKILL.md files\",\"dateModified\":\"2026-09-18T18:30:15.402Z\",\"isPartOf\":{\"@id\":\"https://docs.getnao.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.getnao.io/nao-agent/context-engineering/skills#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.getnao.io/nao-agent/context-engineering/skills#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Context Engineering\",\"item\":\"https://docs.getnao.io/nao-agent/context-engineering/principles\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Skills\",\"item\":\"https://docs.getnao.io/nao-agent/context-engineering/skills\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.getnao.io/nao-agent/context-engineering/skills#article\",\"headline\":\"Skills\",\"name\":\"Skills\",\"description\":\"Six published nao skills that automate the context-engineering lifecycle inside Claude Code, Codex, Cursor, or any agent that loads SKILL.md files\",\"url\":\"https://docs.getnao.io/nao-agent/context-engineering/skills\",\"mainEntityOfPage\":{\"@id\":\"https://docs.getnao.io/nao-agent/context-engineering/skills#webpage\"},\"dateModified\":\"2026-09-18T18:30:15.402Z\",\"publisher\":{\"@id\":\"https://docs.getnao.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.getnao.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"nao Labs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"nao Labs","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/getnao/nao"},{"anchor":"Slack","icon":"slack","href":"https://join.slack.com/t/naolabs/shared_invite/zt-4080jlm79-nm52x5nZhG2N1ben8zwpiQ"},{"anchor":"Blog","icon":"book","href":"https://getnao.io/blog"}]},"tabs":[{"tab":"nao Open Source Agent","groups":[{"group":"Get Started","pages":[{"title":"Welcome to nao","href":""},{"title":"Watch Demo π¬","mode":"wide","href":"/nao-agent/demo"},{"title":"Quickstart","href":"/nao-agent/quickstart"}]},{"group":"Context Builder","pages":[{"title":"Overview","href":"/nao-agent/context-builder/overview"},{"group":"Setup","pages":[{"title":"Configuration","href":"/nao-agent/context-builder/configuration"},{"title":"Git Repository Setup","href":"/nao-agent/context-builder/git-repository"}]},{"group":"Context Providers","pages":[{"title":"Databases","href":"/nao-agent/context-builder/databases"},{"title":"Repositories","href":"/nao-agent/context-builder/repos"},{"title":"Semantic Layer (dbt MetricFlow)","href":"/nao-agent/context-builder/semantic-layer"},{"title":"Business tools","href":"/nao-agent/context-builder/business-tools"},{"title":"Rules","href":"/nao-agent/context-builder/rules-context"},{"title":"System Prompts","href":"/nao-agent/context-builder/system-prompts"},{"title":"Custom Context","href":"/nao-agent/context-builder/custom-context"}]}]},{"group":"Context Engineering","pages":[{"title":"Principles","href":"/nao-agent/context-engineering/principles"},{"title":"Playbook","href":"/nao-agent/context-engineering/playbook"},{"title":"Contributor Guide","href":"/nao-agent/context-engineering/contributing"},{"title":"Evaluation","href":"/nao-agent/context-engineering/evaluation"},{"title":"Recommendations","description":"Close the feedback loop - nao audits its own usage to recommend context fixes (online evals)","href":"/nao-agent/context-engineering/recommendations"},{"title":"Skills","href":"/nao-agent/context-engineering/skills"}]},{"group":"Chat Interface","pages":[{"title":"Overview","description":"Interact with your analytics agent through natural language","href":"/nao-agent/chat/overview"},{"group":"Capabilities","pages":[{"title":"Overview","href":"/nao-agent/chat/capabilities/overview"},{"title":"Visualizations","href":"/nao-agent/chat/capabilities/visualizations"},{"title":"Files and Storage","href":"/nao-agent/chat/capabilities/files-and-storage"},{"title":"Tools, MCPs, Skills","href":"/nao-agent/chat/capabilities/tools-mcps-skills"},{"title":"Memory","href":"/nao-agent/chat/capabilities/memory"},{"title":"Stories","href":"/nao-agent/chat/capabilities/stories"},{"title":"Automations","href":"/nao-agent/chat/capabilities/automations"}]},{"group":"BI","pages":[{"title":"Stories","href":"/nao-agent/chat/bi/stories"},{"title":"Migrate your BI to nao","href":"/nao-agent/chat/bi/migrate-bi"}]},{"group":"Admin","pages":[{"title":"Setup","href":"/nao-agent/chat/admin/setup"},{"title":"User Groups","href":"/nao-agent/chat/admin/user-groups"},{"title":"Git","href":"/nao-agent/chat/admin/git"},{"title":"File Explorer","href":"/nao-agent/chat/admin/file-explorer"},{"title":"Monitoring","href":"/nao-agent/chat/admin/monitoring"},{"title":"Budgets","href":"/nao-agent/chat/admin/budgets"},{"title":"Agent Settings","href":"/nao-agent/chat/admin/agent-settings"}]}]},{"group":"Connectors","pages":[{"title":"nao MCP","href":"/nao-agent/connectors/mcp"},{"group":"Bots","pages":[{"title":"Slack Bot","href":"/nao-agent/connectors/slack"},{"title":"Telegram Bot","href":"/nao-agent/connectors/telegram"},{"title":"WhatsApp Bot","href":"/nao-agent/connectors/whatsapp"},{"title":"Microsoft Teams Bot","href":"/nao-agent/connectors/microsoft_teams"},{"title":"Mattermost Bot","href":"/nao-agent/connectors/mattermost"}]}]},{"group":"Self-Hosting","pages":[{"group":"Deployment Guide","pages":[{"title":"General","href":"/nao-agent/self-hosting/deployment-guide"},{"title":"Kubernetes (Helm)","href":"/nao-agent/self-hosting/kubernetes"},{"title":"AWS","href":"/nao-agent/self-hosting/deploy-aws"}]},{"group":"Advanced deployment","pages":[{"title":"Host Multiple Projects","href":"/nao-agent/self-hosting/multiple-projects"},{"title":"Deployment-managed context files","href":"/nao-agent/self-hosting/context-source"},{"title":"LLM Observability","href":"/nao-agent/self-hosting/observability"}]}]},{"group":"nao Cloud","pages":[{"title":"Get Started","href":"/nao-agent/cloud/get-started"}]},{"group":"nao Enterprise","pages":[{"title":"Overview","href":"/nao-agent/enterprise/overview"},{"title":"Authentication","href":"/nao-agent/enterprise/authentication"},{"title":"Permissions","href":"/nao-agent/enterprise/permissions"},{"title":"White-Label Branding","href":"/nao-agent/enterprise/white-label"}]},{"group":"Developers","pages":[{"title":"Contributing to nao","href":"/nao-agent/developers/overview"}]}]},{"tab":"nao IDE","pages":[{"title":"nao IDE","href":"/nao-ide/get-started/welcome"}]}]},"title":"Skills - nao Labs","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":[],"chunks":[]}