Evidence bundle init
Skill cfregly/gpu-perf-tune/plugins/profile-and-optimize/skills/evidence-bundle-init
Scaffold a new evidence bundle directory ready for reproducibility-grade evidence capture: SOURCE.md (operator + cluster + git SHA + UTC timestamp), summary.md (verdict skeleton), commands/ (for the four-file .cmd/.stdout/.stderr/.exit tuple capture per shell command). Workload-agnostic. Works for any experiment family. Operator names family + run-id (or accepts default). Triggers on "new evidence bundle", "init evidence", "scaffold bundle", "start a new artifact bundle", "new run-id", "evidence-bundle-init", "set up a bundle", or any combination of "new / init / scaffold / create / start" with "evidence / bundle / artifact / run-id / experiment".From its SKILL.md
npx -y skills add cfregly/gpu-perf-tune --skill evidence-bundle-initAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
12.2 KB, ~3.0k tokens by cl100k_base, as published. Nobody here has run it
evidence-bundle-init
Purpose
Set up a new evidence bundle directory under experiments/artifacts/<family>/<run-id>/ with the skeleton reproducibility-grade evidence requires:
SOURCE.md- operator identity, cluster, git SHA, UTC timestamp, the original prompt / intent.summary.md- verdict skeleton operator fills in as the experiment progresses.commands/- directory for the four-file<NN>-<step>.{cmd,stdout,stderr,exit}tuples one per shell command run during the experiment..gitkeepmarkers so the directory layout survives an empty commit.
This skill is the operator-facing convenience over mkdir + cat > SOURCE.md. Half a minute of friction is enough that people skip the discipline. This skill makes it 5 seconds.
Experiment isolation & traceability (required for any cluster-touching experiment)
The bundle's run-id IS the experiment-id - the single join key across the evidence bundle, the cluster objects, and the perf-lake. When the experiment creates cluster resources:
- Every Deployment/Pod/PVC/PV/Secret/ConfigMap/Service MUST use an experiment-unique name derived from the id (e.g.
glm51-expt-deepep-ll, PVglm51-deepep-expt-pv) and carry the labelexperiment=<id-slug>. - NEVER reuse a standing/platform/migration name (e.g. a shared
*-inference*deployment, a standing*-cache*PV, or anything labeledmigration=*). Cluster-scoped PV names are global. A collision silently breaks another owner's PVC. - Tear down by label:
kubectl delete deploy,pod,pvc,secret -l experiment=<id-slug>. ForRetainPVs pre-clear the attacher finalizer before delete. - Record the created object names + the perf-lake
campaign=<id>inSOURCE.md(template below has the block).
Observations vs mechanisms + roofline companions (measurement bundles)
A measurement bundle that produces a roofline / SoL analysis MUST separate observations (what the instruments reported) from mechanisms (the causal "why"), and MUST carry a source-code provenance block. This is the discipline a perf reviewer asks for: "separate the mechanisms from the observations".
Scaffold these in any measurement bundle:
findings/01-observations.md- measured tables ONLY (DCGM SM/tensor/DRAM %, tok/s, TPOT, AA numbers). No interpretation, no "because". Each number is reproducible fromcommands/.findings/02-mechanisms.md- one item per claim, formattedOBSERVATION -> MECHANISM (causal) -> CONFIDENCE (+ what would raise it). A mechanism claim ("decode plateaus at 41% HBM because the sparse-MoE+MLA kernel mix has low DRAM efficiency") needs a profile (DCGM/zymtrace/nsys/ncu) - the rooflines are the observation. The mechanism is the separately-evidenced interpretation.findings/00-ANSWERS-*.md(optional) - the live-sync handout that answers the reviewer's questions directly, each pointing at 01/02.- A
```provenanceblock (experiment_provenance_v1) inSOURCE.mdpinning the exact vLLM/SGLang commit + delivery + patch, so the rendered roofline carries a source link (seeserver/tools/perf_tune_report/ROOFLINE-METHODOLOGY.md). Record the REALdelivery(image|overlay|patchedVllm|infr-patch) the bundle ran -- it is the code-under-test identity: a number from this bundle may be cited only as evidence for THAT delivery, never cross-tier (anoverlay/offline-prepped run is not evidence for aninfr-patch, even if the kernels match).
The prefill/decode roofline itself (page 7) is captured + always-published via the
inference-perf-tune-report / inference-perf-bench pipeline. This bundle just holds the obs/mechanisms
narrative + provenance that the report links to.
This skill is backed by a native MCP verb:
mcp__profile_and_optimize__evidence_init. The verb does the entire scaffold atomically (mkdir + SOURCE.md + summary.md + commands/README.md + .gitkeep) and returns the bundle path. The Bash-tool path documented below remains supported as a fallback.
Why a bundle, not a flat directory
This repo's reproducibility-grade-evidence convention requires that significant experiments produce a bundle, not loose files:
- The bundle's path is the durable handle that future skills (
search_evidence,perf-baseline-record, etc.) reach for. SOURCE.mdis the audit trail that says "this evidence was captured by X on cluster Y on date Z from prompt W".summary.mdis the human-readable verdict at the bottom of the funnel.commands/is the four-file tuple capture that makes every shell action replayable.
When to use
- Starting any experiment that will produce >1 artifact file.
- Reviewer asked "where's the evidence for that claim?" and the answer is a bundle.
- Periodic capture (weekly perf-of-record snapshot, monthly drain audit, etc.).
- Pairs with every skill that writes artifacts (
prometheus-anchored-query,perf-baseline-record).
Do not use this skill for:
- One-off shell commands whose output you'll throw away - no bundle needed.
- Adding to an existing bundle - just
cdinto the bundle and add files. - Benchmark families whose runbooks define their own bundle layout and naming conventions - follow those. This skill is the generic scaffolder.
Example prompts
- "Init a new evidence bundle for the nccl sweep I'm about to run."
- "Scaffold a bundle under cluster-health family."
- "New evidence bundle for the gpu-burn soak."
- "Set up a bundle for the b200 8b regression investigation."
/evidence-bundle-init --family cluster-health --run-id rack-a-validation/evidence-bundle-init --family perf-baselines --measurement nccl_busbw
Prerequisites
PROFILE_AND_OPTIMIZE_REPO_ROOTfor the bundle path. The skill writes to${PROFILE_AND_OPTIMIZE_REPO_ROOT}/experiments/artifacts/<family>/<run-id>/.- Family -
--family <name>(e.g.cluster-health,nccl-tests,gpu-burn,campaign/llama31_8b). - Run-id -
--run-id <slug>(default:<UTC-timestamp>if not supplied). - Operator intent -
--intent "<one-line description>"(gets written intoSOURCE.md).
Interaction style
Fast and autonomous (3-5 seconds). Single optional pause: confirm the family + run-id + intent before write.
Workflow
Phase 0: resolve bundle path
bundle = ${PROFILE_AND_OPTIMIZE_REPO_ROOT}/experiments/artifacts/<family>/<run-id>/
If the bundle already exists, stop. Bundles are immutable. New captures use a new run-id.
Phase 1: gather provenance
In parallel:
Bash(date -u +%Y-%m-%dT%H:%M:%SZ)- UTC timestamp.Bash(hostname)- workstation hostname.Bash(whoami)- operator user.Bash(git -C ${PROFILE_AND_OPTIMIZE_REPO_ROOT} rev-parse HEAD)- current SHA of the bundled server tree.Bash(git -C ${PROFILE_AND_OPTIMIZE_REPO_ROOT} remote get-url origin)- repo remote URL for the Provenance section.
Phase 2: write the skeleton
Preferred (MCP verb):
mcp__profile_and_optimize__evidence_init with:
args: ["--family", "<family>",
"--intent", "<operator one-line intent>",
"--run-id", "<slug>",
"--json"]
The verb does everything atomically and returns the bundle directory path. Skip to Phase 3.
Fallback (Bash-tool):
mkdir -p ${bundle}/commands
Write ${bundle}/SOURCE.md with:
# SOURCE
**Family:** `<family>`
**Run-id:** `<run-id>`
**Created at (UTC):** `<ts>`
**Created by:** `<USER>` on `<hostname>`
**PROFILE_AND_OPTIMIZE SHA (bundled server):** `<git-sha>`
## Intent
<operator's --intent text>
## Provenance
- Workstation kernel: `<uname -a>`
- Repo: `<git -C ${PROFILE_AND_OPTIMIZE_REPO_ROOT} remote get-url origin>` (this plugin marketplace).
- Bundle path: `experiments/artifacts/<family>/<run-id>/`
## Experiment isolation & traceability
The run-id IS the experiment-id: the single join key across this bundle, the
cluster objects, and the perf-lake. (Matches the `mcp__profile_and_optimize__evidence_init`
scaffold. Keep these as structured `- key: value` lines so `publish_to_lake` /
`experiments_index` can read them.)
- experiment_id: <run-id>
- family: <e.g. nvfp4-kv | warp-decode | deepep | (blank)>
- object label (EVERY cluster object, on metadata AND pod template): `experiment=<run-id>`
- cluster resources created (fill in as you create them. Every
Deployment/Pod/Job/PVC/PV/Secret/ConfigMap/Service, experiment-unique-named,
NEVER a standing/migration name):
-
- perf-lake campaign: `campaign=<run-id>` (run `perftunereport campaign_init
--experiment-id <run-id> --family <family> --evidence-bundle <this-bundle>` so
campaign_id == experiment_id. The `s3://perf-lake/...` atlas_v1 + campaign_v1
paths are auto-appended here by `publish_to_lake`).
- pre-apply label gate: verify every manifest carries `experiment=<run-id>`
before `kubectl apply`.
## Cross-references
- `docs/METHODOLOGY.md` - the measurement-methodology canon.
Write ${bundle}/summary.md with:
# Summary
**Status:** in-progress
## Verdict
<to-be-filled-in by operator at end of experiment>
## Findings
-
## Recommendations
-
## Open questions
-
Write ${bundle}/commands/README.md with:
# commands/
Every shell command run during this experiment is captured as a four-file
tuple:
00-<step-slug>.cmd # the exact command
00-<step-slug>.stdout # captured stdout
00-<step-slug>.stderr # captured stderr
00-<step-slug>.exit # exit code
Filenames are zero-padded sequential (00, 01, 02, ...) so the chronological order
is preserved in `ls`. Use a helper to capture all four atomically, e.g.:
run() {
local n="$1". Shift
local slug="$1". Shift
local prefix="$(printf '%02d-%s' "${n}" "${slug}")"
printf '%s ' "$@" > "${prefix}.cmd". Echo >> "${prefix}.cmd"
"$@" > "${prefix}.stdout" 2> "${prefix}.stderr"
echo $? > "${prefix}.exit"
}
run 0 ls-image ls /mnt/data/images/
Touch ${bundle}/commands/.gitkeep so the empty directory survives a git add.
Phase 3: report
Print the bundle path and the next-step pointer:
- "Add captures:
cd <bundle>then run your commands with therunhelper above." - "Finalize: edit
summary.mdwith verdict + findings before sharing." - "Register a baseline if applicable:
perf-baseline-record --source <bundle>."
Output bundle layout
${PROFILE_AND_OPTIMIZE_REPO_ROOT}/experiments/artifacts/<family>/<run-id>/
SOURCE.md
summary.md
commands/
README.md
.gitkeep
Safety
- Never overwrite an existing bundle. Bundles are immutable. The skill refuses to init over a populated directory.
- Audit trail.
SOURCE.mdrecords the operator's${USER}+ hostname so future readers know who captured the evidence, where, and from what prompt. - No automatic commit. The skill creates the directory + scaffold files but does NOT run
git add/git commit. The operator does that after the experiment is captured.
Source-of-truth references
docs/METHODOLOGY.md- the measurement-methodology canon every bundle feeds.server/CLAUDE.md- bundled-server discovery contract.- All sibling skills that write artifacts - they all assume the bundle this skill creates.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.