| name | analyzing-data |
| description | Queries the data warehouse with SQL and answers business questions about data. Use when answering anything that needs warehouse data - counts, metrics, trends, aggregations, joins across tables, data lookups, or ad-hoc SQL analysis (for example "who uses X", "how many Y", "show me Z", "find customers", "what is the count"). |
Data Analysis
Answer business questions by querying the data warehouse. The kernel auto-starts on first exec call.
All CLI commands below are relative to this skill's directory. Before running any scripts/cli.py command, cd to the directory containing this file.
Workflow
-
Pattern lookup — Check for a cached query strategy:
uv run scripts/cli.py pattern lookup "<user's question>"
If a pattern exists, follow its strategy. Record the outcome after executing:
uv run scripts/cli.py pattern record <name> --success
-
Concept lookup — Find known table mappings:
uv run scripts/cli.py concept lookup <concept>
-
Table discovery — If cache misses, search the codebase (Grep pattern="<concept>" glob="**/*.sql") or query INFORMATION_SCHEMA. See reference/discovery-warehouse.md.
-
Execute query:
uv run scripts/cli.py exec "df = run_sql('SELECT ...')"
uv run scripts/cli.py exec "print(df)"
-
Cache learnings — Always cache before presenting results:
uv run scripts/cli.py concept learn <concept> <TABLE> -k <KEY_COL>
uv run scripts/cli.py pattern learn <name> -q "question" -s "step" -t "TABLE" -g "gotcha"
-
Present findings to user.
Kernel Functions
| Function | Returns |
|---|
run_sql(query, limit=100) | Polars DataFrame |
run_sql_pandas(query, limit=100) | Pandas DataFrame |
run_sql_many(queries, limit=100) | List of Polars DataFrames (one per query) |
pl (Polars) and pd (Pandas) are pre-imported.
Run independent queries together with run_sql_many — they execute concurrently (Snowflake async / connection-pool fan-out) instead of one at a time:
uv run scripts/cli.py exec "dfs = run_sql_many(['SELECT ...', 'SELECT ...']); print(dfs[0])"
run_sql_many is fail-fast: if any query errors, the call raises and the results of the queries that succeeded are discarded. Use separate run_sql calls if you need partial results.
Timeouts: exec waits up to 120s by default, then interrupts the query and returns a "client stopped waiting" message (the query may still finish server-side). Raise it for known long-running queries: uv run scripts/cli.py exec "..." -t 600.
Idle kernel: the kernel self-terminates after 2h idle (preserving state until then). Override with ASTRO_KERNEL_IDLE_TIMEOUT (seconds; 0 disables).
CLI Reference
Kernel
uv run scripts/cli.py warehouse list
uv run scripts/cli.py start [-w name]
uv run scripts/cli.py exec "..."
uv run scripts/cli.py status
uv run scripts/cli.py restart
uv run scripts/cli.py stop
uv run scripts/cli.py install <pkg>
Concept Cache
uv run scripts/cli.py concept lookup <name>
uv run scripts/cli.py concept learn <name> <TABLE> -k <KEY_COL>
uv run scripts/cli.py concept list
uv run scripts/cli.py concept import -p /path/to/warehouse.md
Pattern Cache
uv run scripts/cli.py pattern lookup "question"
uv run scripts/cli.py pattern learn <name> -q "..." -s "..." -t "TABLE" -g "gotcha"
uv run scripts/cli.py pattern record <name> --success
uv run scripts/cli.py pattern list
uv run scripts/cli.py pattern delete <name>
Table Schema Cache
uv run scripts/cli.py table lookup <TABLE>
uv run scripts/cli.py table cache <TABLE> -c '[...]'
uv run scripts/cli.py table list
uv run scripts/cli.py table delete <TABLE>
Cache Management
uv run scripts/cli.py cache status
uv run scripts/cli.py cache clear [--stale-only]
References