Monitoring Ingestion Pipeline
PostHog/posthog
Guide for using the Grafana MCP to monitor and diagnose the Node.js ingestion pipeline workers in production.
Analyze ClickHouse Keeper stress-test results from play.clickhouse.com / keeperstresstests data warehouse.
$ npx skills add ClickHouse/ClickHouse --skill keeper-stress-analysis -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ClickHouse/ClickHouse keeper-stress-analysis --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/ClickHouse/ClickHouse.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/keeper-stress-analysis .claude/skills/keeper-stress-analysis && 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 "keeper-stress-analysis" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/keeper-stress-analysis into .claude/skills/keeper-stress-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keeper-stress-analysis", 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/ClickHouse/ClickHouse/tree/master/.claude/skills/keeper-stress-analysisType 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 ClickHouse/ClickHouse --skill keeper-stress-analysis -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ClickHouse/ClickHouse keeper-stress-analysis --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/keeper-stress-analysis .agents/skills/keeper-stress-analysis && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "keeper-stress-analysis" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/keeper-stress-analysis into .agents/skills/keeper-stress-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keeper-stress-analysis", 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 ClickHouse/ClickHouse --skill keeper-stress-analysis -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ClickHouse/ClickHouse keeper-stress-analysis --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/keeper-stress-analysis .cursor/skills/keeper-stress-analysis && 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 "keeper-stress-analysis" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/keeper-stress-analysis into .cursor/skills/keeper-stress-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keeper-stress-analysis", 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/ClickHouse/ClickHouse.git --path .claude/skills/keeper-stress-analysis--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 ClickHouse/ClickHouse --skill keeper-stress-analysis -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ClickHouse/ClickHouse keeper-stress-analysis --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/keeper-stress-analysis .gemini/skills/keeper-stress-analysis && 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 "keeper-stress-analysis" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/keeper-stress-analysis into .gemini/skills/keeper-stress-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keeper-stress-analysis", 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 ClickHouse/ClickHouse keeper-stress-analysisInstalls 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 ClickHouse/ClickHouse --skill keeper-stress-analysis -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/keeper-stress-analysis .github/skills/keeper-stress-analysis && 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 "keeper-stress-analysis" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/keeper-stress-analysis into .github/skills/keeper-stress-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keeper-stress-analysis", 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 ClickHouse/ClickHouse --skill keeper-stress-analysis -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ClickHouse/ClickHouse keeper-stress-analysis --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/keeper-stress-analysis .opencode/skills/keeper-stress-analysis && 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 "keeper-stress-analysis" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/keeper-stress-analysis into .opencode/skills/keeper-stress-analysis/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "keeper-stress-analysis", 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.
keeper-stress-analysisAnalyze ClickHouse Keeper stress-test results from play.clickhouse.com / keeperstresstests data warehouse.
Keeper Stress Analysis is an agent skill from ClickHouse/ClickHouse. Analyze ClickHouse Keeper stress-test results from play.clickhouse.com / keeperstresstests data warehouse. Use whenever the user asks about Keeper performance, validates Keeper PRs against stress dashboards, investigates regressions or improvements in Keeper nightlies, asks about specific date windows / SHAs / PR-sets in Keeper stress tests, wants per-PR or window-vs-window comparisons, asks "did this PR break Keeper", asks "what changed in Keeper between dates", or wants a summary report of Keeper stress runs…
Its SKILL.md is about 4.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 29 other files, including scripts and reference files (for example `examples/sample_outputs/PR_PERF_TABLE.md`, `references/known_confounds.md` and `references/methodology.md`).
It sits in Databases, covering Load testing and Data warehousing. It works with ClickHouse and Grafana. The repository describes itself as: ClickHouse® is a real-time analytics database management system. The licence is Apache-2.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d741c98. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
Bash(curl:*)Bash(python3:*)Bash(awk:*)Bash(mkdir:*)Bash(ls:*)Bash(wc:*)Bash(grep:*)Bash(sort:*)Bash(cat:*)Bash(gh:*)…and 9 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Ships 4 files in scripts/ (Python, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
python3ghcurlFrom 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:
play.clickhouse.comFrom 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.
Keeper Stress Analysis loads about 4.7k tokens when it runs, and up to ~12k if it reads all its reference files. Until then it costs about 248 tokens; SKILL.md has 1,853 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 ClickHouse/ClickHouse at commit d741c98, republished under its Apache-2.0 licence (© ClickHouse). 1,853 words, ~4,704 tokens.
.claude/skills/keeper-stress-analysis/SKILL.md (or your agent's skills folder). This skill also uses 24 other files; get the full folder from GitHub.Analyse ClickHouse Keeper stress-test results from keeper_stress_tests.keeper_metrics_ts on play.clickhouse.com (the same data warehouse the Grafana keeper-stress-run-details dashboard reads from). The skill captures a tested end-to-end workflow plus hard-earned methodology lessons — use it instead of re-deriving the analysis each time.
This skill triggers on these kinds of requests:
The skill does NOT touch any other CI data — it's specific to the Keeper stress framework.
~/.claude/skills/keeper-stress-analysis/, or<repo>/.claude/skills/keeper-stress-analysis/.
Both work; scripts/rebuild.sh resolves the home from its own location.tmp/keeper_stress_skill/ under the user's current directoryscripts/rebuild.sh accepts a working-dir argument as $1, a lower-bound TS-filter as $2, and an optional upper-bound TS-filter as $3 (default 9999-12-31 = unbounded)Parse the user's request into one of these shapes:
| Request shape | Indicators | Pipeline to run |
|---|---|---|
| Date-range window | "between A and B", "since X", "last N weeks" | Cumulative-gains pipeline (Method B in references/methodology.md) |
| PR set | List of PR numbers, "validate these PRs", "33 PRs" | Per-PR + per-nightly pipeline |
| Single PR drill-down | One PR number, "did #X cause", "regression from #X" | Per-PR card with adjacent-nightly + PR-branch isolation |
| Free-form analytical | "Why did metric M change on date D?" | Time-series check + cross-reference references/known_confounds.md |
If the user hasn't given a window, ask (date range OR PR set OR specific question). Default window: from 2026-03-25 (when the current framework began) to today.
Always run all 6 SQL queries first into <work_dir>/staging/:
# Locate the skill home (works for either ~/.claude/skills/... or <repo>/.claude/skills/...)
SKILL_HOME="$(find ~/.claude/skills .claude/skills -maxdepth 2 -type d -name keeper-stress-analysis 2>/dev/null | head -1)"
"$SKILL_HOME/scripts/rebuild.sh" tmp/keeper_stress_skill 2026-03-25rebuild.sh takes three optional args: $1 work dir, $2 lower-bound timestamp filter (default 2026-03-25, when the current keeper-stress framework went live), and $3 upper-bound timestamp filter (default 9999-12-31, i.e. unbounded — same behaviour as a single-arg invocation). The bounds are injected into the SQL via {{TS_FILTER}} / {{TS_FILTER_END}} placeholders and exported to the Python pipeline as KEEPER_SKILL_THRESHOLD / KEEPER_SKILL_THRESHOLD_END (read by build_pr_nightly_map.py and compute_deltas.py for the in-window vs out-of-window split). The upper bound is exclusive (ts < $3), so for "between A and B" inclusive on B, pass B+1 day. To analyse a different window, pass new values — no source edits needed.
For a closed date-range analysis like "what changed between 2026-04-01 and 2026-05-01?", invoke:
"$SKILL_HOME/scripts/rebuild.sh" tmp/keeper_stress_skill 2026-04-01 2026-05-01The rebuild.sh script:
queries/*.sql and scripts/*.py into the work dir.https://play.clickhouse.com/?user=play via curl --data-urlencode.{{TS_FILTER}} placeholder if present in the SQL.merged_metrics.tsv (one row per scenario × backend × commit; ~95+ columns covering bench, prom, mntr, container metrics).<work_dir>/../pr_meta.tsv exists, builds the per-PR pipeline too.cumulative_gains.tsv and cumulative_gains_summary.tsv.The 6 staging files dropped under staging/:
bench_summary.tsv — bench-side summary (rps, p99, errors, ops, mem)prom_rates.tsv — Keeper prom counters as rates per nodeprom_gauges.tsv — Keeper prom gauges + cumulative-failure countersmntr.tsv — ZK 4LW mntr outputscontainer.tsv — cgroup CPU + memorypr_branches.tsv — PR-branch smoke stress runs (3 scenarios per branch)Pick the right script(s) based on Phase 1's intent:
All Python steps are dispatched through keeper_stress.py:
| Intent | Run |
|---|---|
| Date-range window | python3 keeper_stress.py cumulative |
| PR set | python3 keeper_stress.py prmap + deltas + prmetrics (requires pr_meta.tsv) |
| PR-branch isolation | python3 keeper_stress.py prisol (reads PR list + branch from pr_to_nightly.tsv) |
| Two-commit Δ | python3 keeper_stress.py diff <shaA> <shaB> (8-char prefix or full; reads merged_metrics.tsv) |
| Noise calibration | python3 keeper_stress.py noise (per-(scenario, backend, metric) median / stddev / cv / p95 across the window) |
| Free-form | none — query merged_metrics.tsv directly with awk/python |
The individual step files (build_metrics_table.py, build_pr_nightly_map.py, etc.) are still importable modules; keeper_stress.py dispatches to their main() entrypoints.
The per-PR markdown matrix is not generated by a script — Claude composes it directly from per_pr_metrics_long.tsv (long-form per-PR Δ rows) plus per_pr_summary.tsv (cumulative window numbers), using examples/sample_outputs/PR_PERF_TABLE.md as the structural template. Verdicts are Claude's judgment based on the data + Phase 5 caveats — there is no canonical lookup table.
For PR-set work, the user needs to provide a pr_meta.tsv mapping PR number → title, mergedAt, mergeCommit, base, headRefName. If absent, generate it via gh:
{
printf 'pr\ttitle\tmergedAt\tmergeCommit\tbase\theadRefName\n'
for pr in <numbers>
do
out=$(gh pr view "$pr" --repo ClickHouse/ClickHouse \
--json title,mergedAt,mergeCommit,baseRefName,headRefName \
-q '[.title,.mergedAt,.mergeCommit.oid,.baseRefName,.headRefName] | @tsv' 2>/dev/null)
printf '%s\t%s\n' "$pr" "$out"
done
} > tmp/keeper_stress_skill/../pr_meta.tsv(The pr_meta.tsv lives one level above the work dir so all scripts can find it. headRefName is required for build_pr_branch_isolated.py — without it, that step silently produces no rows.)
Pick the deliverable that matches the request:
| User wants | Where to look |
|---|---|
| Summary report | references/report_templates.md (full / tight / one-liner monospace templates with placeholders) |
| Per-PR Markdown table | examples/sample_outputs/PR_PERF_TABLE.md (canonical example: data-backed per-PR table with co-merge attribution and noise-floor caveats) |
| Cumulative-gains write-up | Build from cumulative_gains_summary.tsv using references/report_templates.md formatting |
| Per-PR mover matrix / progress attribution | Build from per_pr_metrics_long.tsv (produced by build_per_pr_metrics_tsv.py) and per_pr_summary.tsv (from compute_deltas.py) |
| Full validation report | Compose from the per-PR table + cumulative-gains + caveats sections; mirror the structure of examples/sample_outputs/PR_PERF_TABLE.md |
Cross-reference the canonical example when filling templates. Never invent prose without a backing data source.
Common questions that don't need a new pipeline — just awk over an existing TSV:
# Did <PR> regress fault scenarios specifically?
awk -F'\t' '$1=="<PR>" && $3 ~ /-fault\[/' tmp/keeper_stress_skill/per_pr_scenario_deltas.tsv
# Single-scenario validation (one row, all metric Δs):
awk -F'\t' '$1=="<PR>" && $3=="prod-mix-no-fault[default]"' tmp/keeper_stress_skill/per_pr_scenario_deltas.tsv
# Co-merge diagnosis when a PR's delta looks suspicious — check the `co_merged`
# column in per_pr_summary; if non-empty, the delta is jointly attributable.
awk -F'\t' 'NR==1 || $1=="<PR>"' tmp/keeper_stress_skill/per_pr_summary.tsv
# Per-commit time-series for one (scenario, backend, metric) — emits
# `run_ended\tsha8\tvalue` rows sorted ascending by ts.
awk -F'\t' 'NR==1 {for(i=1;i<=NF;i++) if($i=="<METRIC>") c=i; next}
$1=="<scenario>" && $2=="<backend>" && $c!="" {print $5, $4, $c}' \
tmp/keeper_stress_skill/merged_metrics.tsv | sortThese three patterns cover the bulk of "drill into one slice of the data" requests; reach for the pipeline only when the slice doesn't already exist as a column or row in merged_metrics.tsv / per_pr_*.tsv.
Before quoting any number, run these checks:
If a memory delta > 5 % is reported, separately query:
container_memory_bytes (the cgroup peak — sensitive to bench page cache)KeeperApproximateDataSize (Keeper's own state report)If the cgroup moved but KeeperApproximateDataSize did NOT, the delta is bench-side, not Keeper-side. See references/known_confounds.md for PR #100670 example.
# Quick check pattern:
awk -F'\t' '
NR==1 {next}
$1==SCENARIO && $2==BACKEND {
date=$5; gsub(/ .*/, "", date)
printf "%s sha=%s KeeperApproxDataSize=%5.2fGB container_peak=%5.2fGB\n",
date, $4, $7/1e9, $72+0
}' merged_metrics.tsv | sortIf a metric changes as a single-day step across multiple unrelated scenarios, it's almost certainly bench-side. Cross-reference references/known_confounds.md:
#100670 "keeper-bench: go faster" landed 2026-04-04 — affects read-heavy memory + multi-write error_pct#101801 "keeper-bench: more features" landed 2026-04-11 — affects rocks-side write-multi memoryThe single-nightly Δ noise floor is ±3-5 % on rps/p99. The typos PR #102739 (which cannot affect Keeper performance) shows ±5 % rps Δ via PR-branch isolation — that's the floor. Never claim sub-3 % per-PR effects without an isolation method.
The PR-branch isolation pool widens to ±1 ISO week if the same-week pool has fewer than 2 entries (using datetime arithmetic so year/W01/W52-53 boundaries are handled). Same-branch runs are excluded from the pool so prior WIP commits don't bias the median toward the PR's own change. Full method in references/methodology.md Method C and the docstring at the top of scripts/build_pr_branch_isolated.py.
container_cpu_usage_usec rates can spike to spurious 18-38 cores from counter discontinuities. Always use p95_cpu_cores, never max_cpu_cores. See references/metric_glossary.md.
Always verify these four counters are ZERO across the entire window:
KeeperCommitsFailedKeeperSnapshotCreationsFailedKeeperSnapshotApplysFailedKeeperRequestRejectedDueToSoftMemoryLimitCountAny non-zero value overrides any positive verdict.
There are two scopes to check, with different sources:
compute_deltas.py already counts these in
the first nightly that includes the PR and emits server_failures_post
in per_pr_summary.tsv. A non-zero value flips the PR's verdict to
regression(server-failure).awk recipe below against
staging/prom_gauges.tsv to confirm zero across every master nightly in
the window. This is the gate; the per-PR check is the per-PR symptom.# Across-window gate — must produce no rows
awk -F'\t' '
NR>1 && $4 ~ /(CommitsFailed|SnapshotCreationsFailed|SnapshotApplysFailed|RejectedSoftMemoryLimit)/ && $5+0 > 0 {
print
}' staging/prom_gauges.tsv
# (empty result = clean across all nightlies)When the user provides a PR list and you compute master adjacent-nightly Δs, the same Δ is jointly attributable to all PRs that landed in the same nightly window. Always include a co_merged column in per-PR tables. Never credit a single PR for joint-window deltas at >5 % effect size.
When you need deeper guidance, read these into context:
references/methodology.md — comparison-method choice (adjacent-nightly vs median-of-3 vs PR-branch isolation), significance bands, environment-offset correction.references/known_confounds.md — catalog of bench-harness PRs that move dashboard metrics; updated as new ones are observed.references/metric_glossary.md — what every column in keeper_metrics_ts measures, and which ones to NOT use (e.g. max_cpu_cores, raw container_memory_bytes for "Keeper memory").references/report_templates.md — three monospace templates (full / tight / one-liner) with placeholder format.Spot-check three known data points (these are all baked into examples/sample_outputs/):
Master e02b59d7 (2026-04-02) on write-multi-no-fault[default] must show errors=0 (pre-bench-jump). Master 18dfe15a (2026-04-04) same scenario must show errors≈325k, error_pct≈3.67. If divergent, the bench-summary query is wrong.
All four hard-failure counters across all master nightlies since 2026-03-25 must be zero. If any non-zero, either the data is corrupt or there's a real failure to report.
740b4a5 (keeper-object-based-snapshots branch) prod-mix-no-fault[default] must show rps=5,764, read_p99=545 ms, write_p99=535 ms, errors=0. This was the canonical #99651 validation point.
User: "Did PR #99651 cause any Keeper regression?"
Process:
gh pr view 99651 --repo ClickHouse/ClickHouse --json title,mergedAt,mergeCommitrebuild.sh tmp/keeper_stress_skill 2026-03-25fdf46ee1) vs post-merge nightly (e02b59d7) on prod-mix-no-fault[default] and write-multi-no-fault[default]container_memory_bytes and KeeperApproximateDataSize. The prod-mix peak_mem 2.92→2.72 GB (-6.9%) shows up on cgroup but KeeperApproximateDataSize is flat → conclude this is bench-side noise OR snapshot-timing artifact, not real Keeper improvement.KeeperSnapshotApplysFailed=0 across 18 follow-on nightlies.User: "What changed in Keeper between 2026-04-01 and 2026-05-01?"
Process:
rebuild.sh tmp/keeper_stress_skill 2026-04-01 2026-05-01 — both bounds are required for a closed window; the third arg pins the upper bound (ts < 2026-05-01) so newer nightlies don't drift into the result.build_cumulative_gains.py — produces cumulative_gains_summary.tsv with median-of-3 vs median-of-3 deltas.known_confounds.md that landed in this window. For 2026-04-01 → 2026-05-01 both #100670 (2026-04-04) and #101801 (2026-04-11) are in-window, so call them out as confounds for any read-heavy memory or rocks-side write-multi memory deltas.cumulative_gains_summary.tsv using references/report_templates.md formatting, with conservative deltas + caveats (always include the bench-harness confound notes from references/known_confounds.md if any of those PR dates fall in the window).User: "Give me a summary of these PRs: ..."
Process:
pr_meta.tsv from the PR list using gh.references/report_templates.md "full" template.When the user is asking for analysis (not a templated report), produce:
Never produce confident per-PR percentages below 5 % effect size without explicit isolation evidence.
When the user has been pushing for rigor, default to the conservative method (median-of-3 + PR-branch isolation) and report ranges, not point estimates.
If you change anything in scripts/_common.py — particularly classify, iso_week, CLASSIFY_BANDS, or HEADLINE_METRICS — run the unit-test harness before pushing:
cd <skill_home>/scripts && python3 -m unittest tests.test_common -vThe 29 cases gate the per-metric significance bands, the ISO-year-boundary widening, the SHA-prefix matcher, the KEEPER_SKILL_THRESHOLD_END default, and the unmerged-PR guard. If they fail, methodology and code have drifted apart — fix one to match the other (the references/methodology.md rubric is the binding contract).
© ClickHouse, Apache-2.0. 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 24 other files (scripts, references) in .claude/skills/keeper-stress-analysis of ClickHouse/ClickHouse.
Open the folder on GitHubat commit d741c98
Keeper Stress Analysis 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 |
|---|---|---|---|---|---|---|
| Keeper Stress Analysis this skillClickHouse/ClickHouse | 50k | — | ~4.7k | Automated safety check: Pass | Apache-2.0 | |
| Monitoring Ingestion PipelinePostHog/posthog | 40k | — | ~9.1k | Automated safety check: Pass | Custom licence | |
| Clickhouse Observabilityjeremylongshore/tons-of-skills-marketplace | 2.8k | — | ~1.4k | Automated safety check: Pass | MIT | |
| Clickhouse Architecture Advisorvemetric/vemetric | 395 | 2 repos | ~791 | Automated safety check: Pass | Apache-2.0 | |
| Clickhouse Ioaffaan-m/ECC | 276k | 3 repos | ~2.3k | Automated safety check: Pass | MIT | |
| Clickhouse Ioaffaan-m/ECC | 276k | 2 repos | ~2.3k | Automated safety check: Pass | MIT |
PostHog/posthog
Guide for using the Grafana MCP to monitor and diagnose the Node.js ingestion pipeline workers in production.
jeremylongshore/tons-of-skills-marketplace
Monitor ClickHouse with Prometheus metrics, Grafana dashboards, system table queries, and alerting for query performance, merge health, and resource usage.
vemetric/vemetric
MUST USE when designing ClickHouse architectures, selecting between ingestion or modeling patterns, or translating best practices into workload-specific system designs.
affaan-m/ECC
ClickHouse数据库模式、查询优化、分析以及高性能分析工作负载的数据工程最佳实践. An agent skill from affaan-m/ECC.
affaan-m/ECC
고성능 분석 워크로드를 위한 ClickHouse 데이터베이스 패턴, 쿼리 최적화, 분석 및 데이터 엔지니어링 모범 사례.
affaan-m/ECC
ClickHouse database patterns, query optimization, analytics, and data engineering best practices for high-performance analytical workloads.
ClickHouse/ClickHouse
Evaluate ClickHouse performance test results from existing CI/dashboard data or local perf.py runs.
ClickHouse/ClickHouse
Check whether ClickHouse's supported versions (last 3 majors + latest LTS) have recent stable patch releases, diagnose why the scheduled AutoReleases pipeline failed, and identify which releases…
ClickHouse/ClickHouse
Analyze a jemalloc (or other) allocation profile in collapsed stack format.
ClickHouse/ClickHouse
Bisect a ClickHouse regression using pre-built master binaries from CI.
ClickHouse/ClickHouse
Generate PR descriptions for ClickHouse/ClickHouse that match maintainer expectations.
ClickHouse/ClickHouse
Run a local pre-push AI code review of the current branch with the OpenAI codex CLI, the same way ClickHouse CI does, and optionally iterate fix and re-review until clean.
Works with
Categories
Analyze ClickHouse Keeper stress-test results from play.clickhouse.com / keeperstresstests data warehouse. Keeper Stress Analysis is an agent skill from ClickHouse/ClickHouse.com / keeperstresstests data warehouse.
Keeper Stress Analysis fits situations like: the user asks about Keeper performance; validates Keeper PRs against stress dashboards; investigates regressions; improvements in Keeper nightlies.
Run `npx skills add ClickHouse/ClickHouse --skill keeper-stress-analysis -a claude-code`. Or copy the skill folder (.claude/skills/keeper-stress-analysis in ClickHouse/ClickHouse) into .claude/skills/keeper-stress-analysis in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ClickHouse/ClickHouse --skill keeper-stress-analysis -a codex`. Or copy the skill folder (.claude/skills/keeper-stress-analysis in ClickHouse/ClickHouse) into .agents/skills/keeper-stress-analysis 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 ClickHouse/ClickHouse --skill keeper-stress-analysis -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/keeper-stress-analysis, .gemini/skills/keeper-stress-analysis, .github/skills/keeper-stress-analysis and .opencode/skills/keeper-stress-analysis in your project.
Going by SKILL.md and its folder, Keeper Stress Analysis needs Python for the scripts in its folder and the command-line tools its instructions call (python3, gh and curl). Our summary lists: Python 3. Its frontmatter pre-approves these tools: Bash(curl:*), Bash(python3:*), Bash(awk:*), Bash(mkdir:*), Bash(ls:*), Bash(wc:*), Bash(grep:*), Bash(sort:*), Bash(cat:*), Bash(gh:*), Bash(realpath:*), Bash(cp:*), Bash(chmod:*), Bash(sed:*), Read, Write, Edit, Glob, Grep.
SKILL.md names 1 domain. In commands or code: play.clickhouse.com; the agent is likely to contact it 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.
Keeper Stress Analysis is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.7k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.8k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Keeper Stress Analysis: Monitoring Ingestion Pipeline (PostHog/posthog, 40k stars), Clickhouse Observability (jeremylongshore/tons-of-skills-marketplace, 2.8k stars), Clickhouse Architecture Advisor (vemetric/vemetric, 395 stars) and Clickhouse Io (affaan-m/ECC, 276k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ClickHouse (a GitHub organization) maintains it in ClickHouse/ClickHouse, which has 50,324 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on October 10, 2026.
Source: ClickHouse/ClickHouse on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.