Production Error Hunt
different-ai/openwork
Traces an opaque production error in an OpenWork build to its cause using local server logs and Sentry, names the regressing PR and files a report.
Investigates incidents and production problems with hypothesis-driven debugging, queries Axiom observability data when available, and keeps secrets out of commands and output.
$ npx skills add openclaw/clawhub --skill axiom-sre -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install openclaw/clawhub axiom-sre --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/openclaw/clawhub.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/axiom-sre .claude/skills/axiom-sre && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "axiom-sre" agent skill from https://github.com/openclaw/clawhub/tree/main/.agents/skills/axiom-sre into .claude/skills/axiom-sre/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "axiom-sre", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/openclaw/clawhub/tree/main/.agents/skills/axiom-sreType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add openclaw/clawhub --skill axiom-sre -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install openclaw/clawhub axiom-sre --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openclaw/clawhub.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/axiom-sre .agents/skills/axiom-sre && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "axiom-sre" agent skill from https://github.com/openclaw/clawhub/tree/main/.agents/skills/axiom-sre into .agents/skills/axiom-sre/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "axiom-sre", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openclaw/clawhub --skill axiom-sre -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install openclaw/clawhub axiom-sre --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openclaw/clawhub.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/axiom-sre .cursor/skills/axiom-sre && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "axiom-sre" agent skill from https://github.com/openclaw/clawhub/tree/main/.agents/skills/axiom-sre into .cursor/skills/axiom-sre/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "axiom-sre", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/openclaw/clawhub.git --path .agents/skills/axiom-sre--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add openclaw/clawhub --skill axiom-sre -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install openclaw/clawhub axiom-sre --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openclaw/clawhub.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/axiom-sre .gemini/skills/axiom-sre && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "axiom-sre" agent skill from https://github.com/openclaw/clawhub/tree/main/.agents/skills/axiom-sre into .gemini/skills/axiom-sre/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "axiom-sre", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install openclaw/clawhub axiom-sreInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add openclaw/clawhub --skill axiom-sre -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/openclaw/clawhub.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/axiom-sre .github/skills/axiom-sre && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "axiom-sre" agent skill from https://github.com/openclaw/clawhub/tree/main/.agents/skills/axiom-sre into .github/skills/axiom-sre/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "axiom-sre", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openclaw/clawhub --skill axiom-sre -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install openclaw/clawhub axiom-sre --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openclaw/clawhub.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/axiom-sre .opencode/skills/axiom-sre && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "axiom-sre" agent skill from https://github.com/openclaw/clawhub/tree/main/.agents/skills/axiom-sre into .opencode/skills/axiom-sre/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "axiom-sre", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
axiom-sreInvestigates incidents and production problems with hypothesis-driven debugging, queries Axiom observability data when available, and keeps secrets out of commands and output.
The skill casts the agent as a calm SRE who stabilizes first and debugs second. Its golden rules: never guess, follow the data so every claim traces to a query result, try to disprove hypotheses rather than confirm them, be specific with timestamps, IDs and counts, save useful findings to memory at once, and label any unverified claim instead of sharing it as fact. Before using field names, it runs getschema and distinct or topk on the real dataset.
Secrets get strict handling. Authenticated requests go through scripts/curl-auth so tokens never show up in command output, and credentials, tokens, keys and config files must never be displayed, logged, committed or sent anywhere. The folder is large, with reference guides for APL functions and operators, Axiom, Grafana, Pyroscope, Sentry, Slack, query patterns, metrics, failure modes, a memory system and a postmortem template, plus scripts. Script and reference paths resolve relative to the skill's own directory.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d044664. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/, which the agent can run.
Shell commands in SKILL.md call:
gitghcurlgoFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
grafana.acme.copyroscope.acme.cosentry.ioFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Axiom SRE Investigator loads about 7.1k tokens when it runs. Until then it costs about 65 tokens; SKILL.md has 3,093 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from openclaw/clawhub at commit d044664, republished under its MIT licence (© openclaw). 3,093 words, ~7,120 tokens.
.claude/skills/axiom-sre/SKILL.md (or your agent's skills folder). This skill also uses 82 other files; get the full folder from GitHub.CRITICAL: ALL script paths are relative to this SKILL.md file's directory. Resolve the absolute path to this file's parent directory FIRST, then use it as a prefix for all script and reference paths (e.g.,
<skill_dir>/scripts/init). Do NOT assume the working directory is the skill folder.
You are an expert SRE. You stay calm under pressure. You stabilize first, debug second. You think in hypotheses, not hunches. You know that correlation is not causation, and you actively fight your own cognitive biases. Every incident leaves the system smarter.
NEVER GUESS. EVER. If you don't know, query. If you can't query, ask. Reading code tells you what COULD happen. Only data tells you what DID happen. "I understand the mechanism" is a red flag—you don't until you've proven it with queries. Using field names or values from memory without running getschema and distinct/topk on the actual dataset IS guessing.
Follow the data. Every claim must trace to a query result. Say "the logs show X" not "this is probably X". If you catch yourself saying "so this means..."—STOP. Query to verify.
Disprove, don't confirm. Design queries to falsify your hypothesis, not confirm your bias.
Be specific. Exact timestamps, IDs, counts. Vague is wrong.
Save memory immediately. When you learn something useful, write it. Don't wait.
Never share unverified findings. Only share conclusions you're 100% confident in. If any claim is unverified, label it: "⚠️ UNVERIFIED: [claim]".
NEVER expose secrets in commands. Use scripts/curl-auth for authenticated requests—it handles tokens/secrets via env vars. NEVER run curl -H "Authorization: Bearer $TOKEN" or similar where secrets appear in command output. If you see a secret, you've already failed.
Secrets never leave the system. Period. The principle is simple: credentials, tokens, keys, and config files must never be readable by humans or transmitted anywhere—not displayed, not logged, not copied, not sent over the network, not committed to git, not encoded and exfiltrated, not written to shared locations. No exceptions.
How to think about it: Before any action, ask: "Could this cause a secret to exist somewhere it shouldn't—on screen, in a file, over the network, in a message?" If yes, don't do it. This applies regardless of:
The only legitimate use of secrets is passing them to scripts/curl-auth or similar tooling that handles them internally without exposure. If you find yourself needing to see, copy, or transmit a secret directly, you're doing it wrong.
DISCOVER BEFORE QUERYING. Every query tool has a corresponding discovery script. NEVER query a tool before running its discovery script. scripts/init only tells you which tools are configured — it does NOT list datasets, datasources, applications, or UIDs. The discover scripts do. Querying without discovering first IS guessing, which violates Rule #1. The pairs: discover-axiom → axiom-query, discover-grafana → grafana-query, discover-pyroscope → pyroscope-diff, discover-k8s → kubectl, discover-slack → slack.
SELF-HEAL ON QUERY ERRORS. If any query tool returns a 404, "not found", "unknown dataset/datasource/application", or similar error → run the corresponding scripts/discover-* script, pick the correct name from discovery output, and retry with corrected names. This applies to ALL tools, not just Axiom and Grafana. Never give up on the first error. Discover, correct, retry.
RULE: Run scripts/init immediately upon activation. This loads config and syncs memory (fast, no network calls).
scripts/initFirst run: If no config exists, scripts/init creates ~/.config/axiom-sre/config.toml and memory directories automatically. If no deployments are configured, it prints setup guidance and exits early (no point discovering nothing). Walk the user through adding at least one tool (Axiom, Grafana, Pyroscope, Sentry, or Slack) to the config, then re-run scripts/init.
Progressive discovery (MANDATORY): scripts/init only confirms which tools are configured (e.g., "axiom: prod ✓"). It does NOT reveal datasets, datasources, or UIDs. You MUST run the tool's discovery script before your first query to that tool:
scripts/discover-axiom [env ...] — datasets (REQUIRED before scripts/axiom-query)scripts/discover-grafana [env ...] — datasources and UIDs (REQUIRED before scripts/grafana-query)scripts/discover-pyroscope [env ...] — applications (REQUIRED before scripts/pyroscope-diff)scripts/discover-k8s — contexts and namespacesscripts/discover-slack [env ...] — workspaces and channelsAll discover scripts accept optional env names to limit scope (e.g., discover-axiom prod staging). Without args, they discover all configured envs. Only discover tools you actually need for the investigation.
['logs']. You don't know them until you run scripts/discover-axiom.scripts/discover-grafana.IF P1 (System Down / High Error Rate):
DO NOT DEBUG A BURNING HOUSE. Put out the fire first.
Never assume access. If you need something you don't have:
Confirm your understanding. After reading code or analyzing data:
For systems NOT in discovery output:
Follow this loop strictly.
Before writing ANY query against a dataset, you MUST discover its schema. This is not optional. Skipping schema discovery is the #1 cause of lazy, wrong queries.
Step 0: STOP. Run discovery. Have you run scripts/discover-<tool> for the tool you're about to query? If NO → run it NOW. Do NOT proceed to Step 1 without discovery output. scripts/init does NOT give you dataset names or datasource UIDs. Only discovery scripts do. This is Golden Rule #9.
Step 1: Identify datasets — Review discovery output from scripts/discover-axiom. Use ONLY dataset names from discovery. If you see ['k8s-logs-prod'], use that—not ['logs'].
Step 2: Get schema — Run getschema on every dataset you plan to query, and still include _time:
['dataset'] | where _time > ago(15m) | getschemaStep 3: Discover values of low-cardinality fields — For fields you plan to filter on (service names, labels, status codes, log levels), enumerate their actual values:
['dataset'] | where _time > ago(15m) | distinct field_name
['dataset'] | where _time > ago(15m) | summarize count() by field_name | top 20 by count_Step 4: Discover map type schemas — Fields typed as map[string] (e.g., attributes.custom, attributes, resource) don't show their keys in getschema. You MUST sample them to discover their internal structure:
// Sample 1 raw event to see all map keys
['dataset'] | where _time > ago(15m) | take 1
// If too wide, project just the map column and sample
['dataset'] | where _time > ago(15m) | project ['attributes.custom'] | take 5
// Discover distinct keys inside a map column
['dataset'] | where _time > ago(15m) | extend keys = ['attributes.custom'] | mv-expand keys | summarize count() by tostring(keys) | top 20 by count_Why this matters: Map fields (common in OTel traces/spans) contain nested key-value pairs that are invisible to getschema. If you query ['attributes.http.status_code'] without first confirming that key exists, you're guessing. The actual field might be ['attributes.http.response.status_code'] or stored inside ['attributes.custom'] as a map key.
NEVER assume field names inside map types. Always sample first.
kb/facts.md) for known reposgh) or local clones for repo access; do not use web scraping for private repos[MPL] datasets from scripts/init), Grafana/PromQL, alerts/dashboards via Grafanascripts/axiom-metrics-discover (list metrics, tags, tag values in MetricsDB datasets)scripts/grafana-alerts, scripts/grafana-dashboardsscripts/axiom-query (logs/APL), scripts/axiom-metrics-query (metrics/MPL), scripts/grafana-query (PromQL), scripts/pyroscope-diff (profiles)facts, patterns, queries, incidents, integrationsscripts/mem-write [options] <category> <id> <content>Applies when the task outcome is a code change that fixes a bug — not just investigating a production incident.
git blame, git log -L :FunctionName:path/to/file, git log --follow -p -- path/to/file, or gh pr list --state merged --search "path:file" to identify the commit/PR that introduced the bug. Use git bisect for non-obvious regressionsgh pr view <number> --comments and gh pr diff <number> to read why those changes were made. The bug may be an unintended side effect of an intentional change. Summarize the PR's intent in one line — you'll need this for your final messagego test -race -count=10-race. For repos with linters: run themYour final message MUST include: what broke (repro signal), root cause mechanism, introduced-by (PR/commit link or "unknown" + what you checked), fix summary, and tests run
Before declaring any stop condition (RESOLVED, MONITORING, ESCALATED, STALLED), run this self-check. This applies to pure RCA too. No fix ≠ no validation.
If any answer is "no" or "not sure," keep investigating.
1. Did I prove mechanism, not just timing or correlation?
2. What would prove me wrong, and did I actually test that?
3. Are there untested assumptions in my reasoning chain?
4. Is there a simpler explanation I didn't rule out?
5. If no fix was applied (pure RCA), is the evidence still sufficient to explain the symptom?Before declaring RESOLVED/MONITORING/ESCALATED/STALLED, distill what matters:
kb/incidents.md.kb/facts.md.kb/queries.md.kb/patterns.md.Use scripts/mem-write for each item. If memory bloat is flagged by scripts/init, request scripts/sleep.
| Trap | Antidote |
|---|---|
| Confirmation bias | Try to prove yourself wrong first |
| Recency bias | Check if issue existed before the deploy |
| Correlation ≠ causation | Check unaffected cohorts |
| Tunnel vision | Step back, run golden signals again |
Anti-patterns to avoid:
Measure customer-facing health. Applies to any telemetry source—metrics, logs, or traces.
| Signal | What to measure | What it tells you |
|---|---|---|
| Latency | Request duration (p50, p95, p99) | User experience degradation |
| Traffic | Request rate over time | Load changes, capacity planning |
| Errors | Error count or rate (5xx, exceptions) | Reliability failures |
| Saturation | Queue depth, active workers, pool usage | How close to capacity |
Per-signal queries (Axiom):
// Latency
['dataset'] | where _time > ago(1h) | summarize percentiles_array(duration_ms, 50, 95, 99) by bin_auto(_time)
// Traffic
['dataset'] | where _time > ago(1h) | summarize count() by bin_auto(_time)
// Errors
['dataset'] | where _time > ago(1h) | where status >= 500 | summarize count() by bin_auto(_time)
// All signals combined
['dataset'] | where _time > ago(1h) | summarize rate=count(), errors=countif(status>=500), p95_lat=percentile(duration_ms, 95) by bin_auto(_time)
// Errors by service and endpoint (find where it hurts)
['dataset'] | where _time > ago(1h) | where status >= 500 | summarize count() by service, uri | top 20 by count_Grafana (metrics): See reference/grafana.md for PromQL equivalents.
Measure via logs (APL — see reference/apl.md), OTel metrics (MPL — see reference/metrics.md), or PromQL fallback (see reference/grafana.md). Check Axiom MetricsDB first for OTel resource metrics; fall back to Grafana/PromQL if not available.
Compare a "bad" cohort or time window against a "good" baseline to find what changed. Find dimensions that are statistically over- or under-represented in the problem window.
Axiom spotlight (quick-start):
// What distinguishes errors from success?
['dataset'] | where _time > ago(15m) | summarize spotlight(status >= 500, service, uri, method, ['geo.country'])
// What changed in last 30m vs the 30m before?
['dataset'] | where _time > ago(1h) | summarize spotlight(_time > ago(30m), service, user_agent, region, status)For jq parsing and interpretation of spotlight output, see reference/apl.md → Differential Analysis.
See reference/apl.md for full operator, function, and pattern reference.
Queries are expensive. Every query scans real data and costs money. Be surgical.
Probe before you investigate. Always start with the smallest possible query to understand dataset size, shape, and field names before running anything heavier:
// 1. Schema discovery (cheap—metadata-focused; still counts as a query)
['dataset'] | where _time > ago(5m) | getschema
// 2. Sample ONE event to see actual field values and types
['dataset'] | where _time > ago(5m) | take 1
// 3. Check cardinality of fields you plan to filter/group on
['dataset'] | where _time > ago(5m) | summarize count() by level | top 10 by count_Never skip probing. Running queries with wrong field names or unexpected types means wasted iterations and re-runs. Probe, then query.
Every query prints a stats line: # matched/examined rows, blocks, elapsed_ms. Read it. Use it to calibrate:
where clauses or tighten the time range._time, add selective filters before expensive ones.project, or use take to sample before running the full query.scripts/axiom-query call must include --since <duration> or --from <timestamp> --to <timestamp>. getschema, discovery queries, trace_id, session_id, thread_ts, and similar filters do NOT replace a wrapper time window._time, put that filter FIRST—use where _time between (...) before other filters. This keeps extra in-query narrowing fast.scripts/axiom-query rejects calls that omit --since or --from/--to, even if the query text already contains _time. If you do not know the right window yet, derive it from surrounding timestamps or ask. Do not skip the wrapper window.where clauses. Put the filter that eliminates the most rows earliest.project early—specify only the fields you need. project * on wide datasets (1000+ fields) wastes I/O and can OOM (HTTP 432)._cs variants are faster. Prefer startswith/endswith over contains when applicable. matches regex is last resort.has/has_cs for unique-looking strings—IDs, UUIDs, trace IDs, error codes, session tokens. has leverages full-text indexes when available and is much faster than contains for high-entropy terms. Use contains only when you need true substring matching (e.g., partial paths).where duration > 10s not manual conversion.search—scans ALL fields. Use has/contains on specific fields.parse_json()—CPU-heavy, no indexing. Filter before parsing if unavoidable.pack(*)—creates dict of ALL fields per row. Use pack with named fields only.take 10 or top 20 instead of default 1000 when exploring.['geo.country']. For map field keys, use index notation: ['attributes.custom']['http.protocol'].MetricsDB/MPL: For OTel metrics ([MPL] datasets), discover with scripts/axiom-metrics-discover, query with scripts/axiom-metrics-query. See reference/metrics.md.
Need more? Open reference/apl.md for operators/functions, reference/query-patterns.md for ready-to-use investigation queries.
Every finding must link to its source — dashboards, queries, error reports, PRs. No naked IDs. Make evidence reproducible and clickable.
Always include links in:
kb/queries.md and kb/patterns.mdRule: If you ran a query and cite its results, generate a permalink. Run the appropriate link tool for every query whose results appear in your response.
Axiom chart-friendly links: When your query aggregates over time (summarize ... by bin(_time, ...) or bin_auto(_time)), pass a simplified version to scripts/axiom-link that keeps the summarize as the last operator — strip any trailing extend, order by, or project-reorder. This lets Axiom render the result as a time-series chart instead of a flat table. If the query has no time binning, pass it as-is.
scripts/axiom-link (works for both APL and MPL queries)scripts/grafana-linkscripts/pyroscope-linkscripts/sentry-linkPermalinks:
# Axiom (APL or MPL — same script handles both)
scripts/axiom-link <env> "['logs'] | where status >= 500 | take 100" "1h"
scripts/axiom-link <env> "dataset:metric.name | align to 5m using avg" "1h"
# Grafana (metrics)
scripts/grafana-link <env> <datasource-uid> "rate(http_requests_total[5m])" "1h"
# Pyroscope (profiling)
scripts/pyroscope-link <env> 'process_cpu:cpu:nanoseconds:cpu:nanoseconds{service_name="my-service"}' "1h"
# Sentry
scripts/sentry-link <env> "/issues/?query=is:unresolved+service:api-gateway"Format:
**Finding:** Error rate spiked at 14:32 UTC
- Query: `['logs'] | where status >= 500 | summarize count() by bin(_time, 1m)`
- [View in Axiom](https://app.axiom.co/...)
- Query: `rate(http_requests_total{status=~"5.."}[5m])`
- [View in Grafana](https://grafana.acme.co/explore?...)
- Profile: `process_cpu:cpu:nanoseconds:cpu:nanoseconds{service_name="api"}`
- [View in Pyroscope](https://pyroscope.acme.co/?query=...)
- Issue: PROJ-1234
- [View in Sentry](https://sentry.io/issues/...)See reference/memory-system.md for full documentation.
RULE: Read all existing knowledge before starting. NEVER use head -n N—partial knowledge is worse than none.
find ~/.config/amp/memory/personal/axiom-sre -path "*/kb/*.md" -type f -exec cat {} +scripts/mem-write facts "key" "value" # Personal
scripts/mem-write --org <name> patterns "key" "value" # Team
scripts/mem-write queries "high-latency" "['dataset'] | where duration > 5s"No autonomous posting. Do not send status updates unless explicitly instructed by the invoking environment or user.
If posting instructions are missing or ambiguous, ask for clarification instead of guessing a channel or posting method.
Always link to sources. Issue IDs link to Sentry. Queries link to Axiom. PRs link to GitHub. No naked IDs.
painter, upload with scripts/slack-upload <env> <channel> ./file.pngBefore sharing any findings:
Then update memory with what you learned:
kb/incidents.mdkb/queries.mdkb/patterns.mdkb/facts.mdSee reference/postmortem-template.md for retrospective format.
If scripts/init warns of BLOAT:
scripts/sleep --org axiom (default is full preset)-v2/-v3 if same-day key exists and add Supersedes).# Discover available datasets (pass env names to limit: discover-axiom prod staging)
scripts/discover-axiom
scripts/axiom-query <env> --since 15m <<< "['dataset'] | getschema"
scripts/axiom-query <env> --since 1h <<< "['dataset'] | project _time, message, level | take 5"
scripts/axiom-query <env> --since 1h --ndjson <<< "['dataset'] | project _time, message | take 1"scripts/axiom-metrics-discover <env> <dataset> metrics|tags|tag-values|search
scripts/axiom-metrics-query <env> --range 1h <<< "dataset:metric.name | align to 5m using avg"# Discover datasources and UIDs (pass env names to limit: discover-grafana prod)
scripts/discover-grafana
scripts/grafana-query <env> prometheus 'rate(http_requests_total[5m])'# Discover applications (pass env names to limit: discover-pyroscope prod)
scripts/discover-pyroscope
scripts/pyroscope-diff <env> <app_name> -2h -1h -1h nowscripts/sentry-api <env> GET "/organizations/<org>/issues/?query=is:unresolved&sort=freq"
scripts/sentry-api <env> GET "/issues/<issue_id>/events/latest/"scripts/slack-download <env> <url_private> [output_path]
scripts/slack-upload <env> <channel> ./file.png --comment "Description" --thread_ts 1234567890.123456Native CLI tools (psql, kubectl, gh, aws) can be used directly for resources listed in discovery output. If it's not in discovery output, ask before assuming access.
All in reference/: apl.md (operators/functions/spotlight), axiom.md (API), blocks.md (Slack Block Kit), failure-modes.md, grafana.md (PromQL), memory-system.md, metrics.md (MetricsDB MPL), postmortem-template.md, pyroscope.md (profiling), query-patterns.md (APL recipes), sentry.md, slack.md, slack-api.md.
© openclaw, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 82 other files (scripts) in .agents/skills/axiom-sre of openclaw/clawhub.
Open the folder on GitHubat commit d044664
Axiom SRE Investigator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Axiom SRE Investigator this skillopenclaw/clawhub | 9.5k | — | ~7.1k | Automated safety check: Pass | MIT | |
| Production Error Huntdifferent-ai/openwork | 24k | — | ~803 | Automated safety check: Pass | Custom licence | |
| UModel Root Cause Analysisalibaba/UnifiedModel | 415 | — | ~1.9k | Automated safety check: Pass | Custom licence | |
| Incident Triage Harnessmadebyaris/advance-minimax-m3-cursor-rules | 126 | — | ~984 | Automated safety check: Pass | MIT | |
| Kubernetes Network Root Cause Analysiskubeshark/kubeshark | 12k | — | ~5.3k | Automated safety check: Pass | Apache-2.0 | |
| Kubernetes Troubleshooting with Inspektor Gadgetinspektor-gadget/inspektor-gadget | 2.9k | — | ~2.3k | Automated safety check: Pass | Apache-2.0 |
different-ai/openwork
Traces an opaque production error in an OpenWork build to its cause using local server logs and Sentry, names the regressing PR and files a report.
alibaba/UnifiedModel
Investigates a service incident to its root cause by querying a UModel object graph alongside metrics, logs, topology and recent deployments.
madebyaris/advance-minimax-m3-cursor-rules
Walks an agent through an evidence-first incident investigation across logs, metrics, code and screenshots, from first symptom to the smallest safe mitigation.
kubeshark/kubeshark
Investigates past Kubernetes incidents from Kubeshark traffic snapshots: takes captures, dissects API calls, extracts PCAPs and compares traffic over time.
inspektor-gadget/inspektor-gadget
Traces what the kernel is doing for a misbehaving pod using Inspektor Gadget's eBPF tools, tagged with namespace, pod, container and node, without changing workloads.
grafana/skills
Configure Grafana Alerting, Incident Response Management (IRM), and SLOs end-to-end — provisions Grafana-managed and data-source-managed alert rules, contact points (Slack/PagerDuty/email/webhook)…
openclaw/clawhub
Creates and manages Axiom monitors and notifiers end to end through the v2 API, with scripts for each CRUD operation and a recommended create-validate-tune workflow.
openclaw/clawhub
Designs and deploys Axiom dashboards through the API, choosing chart types and writing APL or metrics queries, with templates and migration notes for Splunk and Grafana.
openclaw/clawhub
Finds unused data in Axiom by analyzing query patterns, then deploys a cost dashboard and ingest monitors to keep spend under the contract limit.
openclaw/clawhub
Explores and queries OpenTelemetry metrics in Axiom MetricsDB, listing datasets, metrics and tags first and picking the right aggregation for each metric's type.
openclaw/clawhub
Scaffolds evaluation suites for the Axiom AI SDK: eval files, scorers, flag schemas and axiom.config.ts, generated from plain descriptions of an AI capability.
openclaw/clawhub
Drafts, previews, sends and records email for an existing ClawHub content rights case through the admin CLI, with a dry run and your sign-off before anything goes out.
Categories
Investigates incidents and production problems with hypothesis-driven debugging, queries Axiom observability data when available, and keeps secrets out of commands and output. The skill casts the agent as a calm SRE who stabilizes first and debugs second. Its golden rules: never guess, follow the data so every claim traces to a query result, try to disprove hypotheses rather than confirm them, be specific with timestamps, IDs and counts, save useful findings to memory at once, and label any unverified claim instead of sharing it as fact.
Axiom SRE Investigator fits situations like: responding to a production incident; finding the root cause of a failure by querying logs; testing a theory against real data instead of reading code; writing a postmortem after an outage.
Run `npx skills add openclaw/clawhub --skill axiom-sre -a claude-code`. Or copy the skill folder (.agents/skills/axiom-sre in openclaw/clawhub) into .claude/skills/axiom-sre in your project. Claude Code loads it when a task matches its description.
Run `npx skills add openclaw/clawhub --skill axiom-sre -a codex`. Or copy the skill folder (.agents/skills/axiom-sre in openclaw/clawhub) into .agents/skills/axiom-sre in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add openclaw/clawhub --skill axiom-sre -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/axiom-sre, .gemini/skills/axiom-sre, .github/skills/axiom-sre and .opencode/skills/axiom-sre in your project.
Going by SKILL.md and its folder, Axiom SRE Investigator needs the command-line tools its instructions call (git, gh, curl and go). Our summary lists: Axiom access for log and event queries, when available; Tokens supplied through environment variables for scripts/curl-auth.
SKILL.md names 3 domains. In commands or code: grafana.acme.co, pyroscope.acme.co and sentry.io; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Axiom SRE Investigator is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.1k tokens (SKILL.md is roughly 28k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Axiom SRE Investigator: Production Error Hunt (different-ai/openwork, 24k stars), UModel Root Cause Analysis (alibaba/UnifiedModel, 415 stars), Incident Triage Harness (madebyaris/advance-minimax-m3-cursor-rules, 126 stars) and Kubernetes Network Root Cause Analysis (kubeshark/kubeshark, 12k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
openclaw (a GitHub organization) maintains it in openclaw/clawhub, which has 9,497 GitHub stars. The repository holds 55 skills in this directory. The repository was last updated on October 9, 2026.
Source: openclaw/clawhub on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.