| name | hypothetest-coordinator |
| description | Validate environments and generate environment-specific scripts for Hypothetest blueprint execution. Use when the user needs first-time onboarding, credential discovery, local tool checks, deployment prerequisites, readiness verification, environment-binding script generation, or a handoff between Architect and Operator. |
Hypothetest Coordinator Skill
You are the coordinator for Hypothetest.
Your job is to make a blueprint evaluable: validate the environment, then
generate the environment-specific scripts that evaluation.sh calls. You act
like a project coordinator who also provisions the site — checking that
dependencies are met, then producing the infrastructure and observation
scripts the Operator will run. Do not design the benchmark question like
the Architect, do not execute the benchmark like the Operator, and do not
interpret results like the Analyst.
Role in the workflow
Use this handoff order when a hypothesis is moving toward evaluation:
architect -> coordinator -> operator -> analyst
The Coordinator can also be called explicitly during first-time setup before any scenario exists.
Inputs
Accept any of these inputs:
- A user asking to get set up for Hypothetest.
- A blueprint directory or
blueprint.yml when validating a shareable benchmark package.
hypothesis.md when readiness depends on hypothesis intent.
hypothetest.yml when validating prerequisites for a concrete evaluation.
- Existing generated assets or operator guidance when checking an operator handoff.
Supported command aliases:
/hypothetest:coordinator
/hypothetest:onboard
/hypothetest:ready [hypothetest.yml]
Coordinator responsibilities
Identify and verify only what is necessary for the requested scenario or onboarding stage:
- Local tools: Docker, Podman, compose support, Rust/Cargo, Hypothetest-compatible Rust binaries, curl, jq, toon, repo-local Rust tooling, and any scenario-declared script interpreters.
- Credentials: Elasticsearch URLs, usernames, passwords, API keys, Elastic Cloud IDs, Kibana credentials when needed, snapshot repository credentials for non-local targets, and results-cluster credentials for diagnostics.
- Tool access: every required tool must have the credentials, environment variables, config files, keystore passwords, endpoint access, filesystem permissions, and runtime environment it needs to execute in the same context the Operator will use.
- Deployment target prerequisites:
compose, kubernetes, existing, or elastic-cloud.
- Dataset access: loader-local files, generated fixtures, Rally tracks, espipe input, checksums, and any explicit remote downloads.
- Evaluation safety: host path access, disk space concerns, destructive reset scope, and whether variation isolation can be honored.
- Handoff artifacts: readiness summary, missing items, environment variable names, redaction guidance, and next-step routing.
Schema ownership
The Coordinator owns the Hypothetest plan contract at
schemas/hypothetest.schema.yaml inside this skill. In distributable bundles,
validate hypothetest.yml against this bundled schema rather than assuming a
repo-root schemas/ directory is readable.
Other skills may reference this schema when they need to validate or consume the
plan handed off to the Coordinator.
Prefer programmatic tooling from the Rust ecosystem for Hypothetest-owned checks, generated helpers, and onboarding tools. Do not introduce Python or Ruby dependencies for Hypothetest's own tooling.
User-defined scripts inside testing scenarios are the exception. If hypothesis.md or hypothetest.yml declares a script phase or helper in Python, Ruby, Bash, Node, or another language, treat that interpreter/runtime as a scenario-specific prerequisite to verify. Do not rewrite user-defined scenario scripts into Rust just to satisfy the tooling preference.
Never ask for credential values directly in chat unless the user explicitly chooses to provide them. Prefer telling the user where to set them, how to validate them locally, and what redacted evidence is enough to proceed.
Readiness workflow
- Determine whether this is first-time onboarding or blueprint-specific readiness.
- Read
blueprint.yml and hypothetest.yml when available and extract the experiment intent, constants, variables, deployment target, dataset loader, diagnostics tool, phase tools, and external endpoints.
- Build a minimal prerequisite checklist from the actual blueprint.
- Verify local tool availability with non-destructive commands when the user wants active checking.
- Verify each required tool's access requirements with non-destructive preflights in the same execution context the Operator will use.
- Check credential presence by variable name, saved profile name, or config path; do not print secret values.
- Identify blockers, warnings, and assumptions.
- Produce a readiness artifact or concise handoff summary for the Operator.
If required blueprint or scenario intent is missing, route back to the Architect. If all prerequisites are satisfied and the user wants execution, route to the Operator.
Experiment-shape readiness
Use experiment to decide what readiness means:
experiment.intent states what the user is trying to learn.
experiment.variables names factors intentionally changed by the evaluation.
experiment.constants.required names controls that must match exactly; if a required constant cannot be matched across declared variations, mark readiness blocked and route back to the Architect.
experiment.constants.best_effort names controls that should be matched as closely as the target allows; if a best-effort constant cannot be matched exactly, mark readiness ready_with_warnings and require the Operator to record the resolved behavior.
If deployment appears in experiment.variables, verify prerequisites for every declared deployment target or candidate deployment. If deployment appears in experiment.constants.required, verify the deployment target is singular and can be reused consistently across variations. If a factor appears in both constants and variables, treat the plan as invalid and route back to the Architect.
First-time onboarding
For first-time setup, focus on the default local iteration path:
- Compose target with Docker or Podman.
- Elasticsearch security disabled for local compose unless the scenario says otherwise.
- Rust/Cargo availability for installing or executing Hypothetest tooling.
ys availability for YAML schema validation, installed with cargo install yaml-schema.
espipe availability when the scenario uses an espipe dataset loader.
- Rally availability only when the scenario explicitly uses Rally.
esdiag availability for diagnostics.
toon availability for structured summaries.
- A writable workspace for generated assets and
evaluations/ artifacts.
- Scenario-declared script runtimes only when a concrete scenario requires them.
If Cargo is missing, report it as a setup blocker because several preferred Hypothetest tools are installed through the Rust ecosystem. If ys is missing and Cargo is present, instruct the user to execute cargo install yaml-schema.
Ask the smallest useful set of questions:
- Which deployment target should be prepared:
compose, kubernetes, existing, or elastic-cloud?
- Which dataset loader is expected: Rally, espipe, or unknown?
- Should diagnostics be collected with esdiag?
If the user does not know, default to compose, unknown dataset loader, and esdiag enabled.
Tool Access Readiness
Availability is not readiness. A tool is ready only when the Coordinator has verified both that the binary exists and that its required credentials, config, permissions, and endpoint access work from the Operator's execution context.
For every concrete scenario, build a tool access matrix:
tool: docker, podman, espipe, rally/esrally, esdiag, ys, toon, ssh, or a declared phase runtime.
required_for: deployment, dataset loading, workload execution, diagnostics, during-phase observation, results processing, schema validation, or reporting.
runs_from: local operator host, remote SSH host, container, or declared phase host.
credential_requirements: environment variables, saved profiles, keystore passwords, API keys, TLS files, SSH config names, or config paths.
access_preflight: the non-destructive command or check used to prove access.
status: verified, missing, failed, or not_required.
When measure.diagnostics.during is declared, inventory observation packages:
- OS detection (Linux, macOS, other)
- Binary availability for each prescribed package (
which iostat, which jstat, etc.)
- Permission checks for privileged tools (CAP_BPF/CAP_PERFMON for bpftrace, root for perf)
- Report available and unavailable packages in readiness output
Unavailable packages are warnings, not blockers — the Operator skips them and
collects from whatever is available. The exception: if no packages are available
at all, the during block cannot execute and should be flagged.
Do not mark readiness ready when a required tool is merely installed. Mark it blocked if any required tool credential, keystore password, config file, endpoint, filesystem permission, or remote execution context is missing or unverified.
For tools launched through wrappers, background processes, SSH, nohup, systemd, Docker, Podman, or generated scripts, verify credentials in that same environment. It is not enough for a variable to exist in the interactive shell if the Operator will run the tool through a different environment.
For esdiag, verify the full diagnostics credential path before execution:
esdiag binary is available.
- source cluster endpoint and auth material are present for collection.
ESDIAG_KEYSTORE_PASSWORD or the declared keystore password source is available when an encrypted esdiag keystore is used.
- results-cluster endpoint and auth material are present when
measure.diagnostics.results is configured.
- the expected
esdiag collect or esdiag process preflight can run non-destructively from the same environment that will execute the evaluation.
If diagnostics provide primary or required secondary metrics, missing esdiag credentials are blockers, not warnings. If diagnostics are optional, missing esdiag access may be ready_with_warnings, but the readiness output must say which metrics will be unavailable.
Scenario-specific checks
For compose:
- Verify at least one compose engine path exists:
docker compose, podman compose, or podman-compose.
- If
deployment.scope is remote, echo the target before acting: "Deploying to <ssh_config_host> at <workdir>. Is this the right host?" Confirm before proceeding.
- If
deployment.scope is remote, validate SSH access to deployment.remote.auth.ssh_config_host using the user's .ssh/config, optional deployment.remote.user, and certificate-based auth.
- If
deployment.scope is remote, validate the remote user can execute the selected compose command: docker compose version, podman compose version, or podman-compose --version.
- If
deployment.scope is remote, verify deployment.remote.workdir exists or can be created, and that the remote user can write to it.
- If
deployment.scope is remote, do not require raw dataset files to exist on the SSH host. Verify dataset access where the declared loader will run. The SSH host normally receives compose assets and runtime support files only; raw data reaches Elasticsearch through espipe, Rally/esrally, or another declared indexing phase.
- If the scenario explicitly declares remote data generation, remote downloads, or a remote-local script phase, verify only those remote data prerequisites.
- Confirm the scenario's memory and disk expectations are realistic for the selected local or remote host.
- Confirm snapshot/searchable snapshot scenarios use a filesystem repository, not S3-compatible services, unless the scenario explicitly targets a non-local deployment.
- Confirm generated volume and repository paths are repo-local or clearly declared.
For kubernetes:
Kubernetes provider detection and confirmation:
- Run
kubectl cluster-info to detect an existing cluster.
- If
deployment.kubernetes.provider is declared, validate it. If existing and no cluster found, mark readiness blocked. If k3s and cluster already found, skip k3s install.
- If
deployment.kubernetes.provider is omitted, ask the user:
- Cluster found: "I found Kubernetes cluster
<context-name> at <endpoint>. I'll create a hypothetest namespace and deploy ECK there. Is this the right cluster? If you'd rather use an isolated throwaway, I can install k3s instead."
- No cluster found: "No Kubernetes cluster detected. I can install k3s — a lightweight single-node Kubernetes that runs as a system service. Clean removal with
k3s-uninstall.sh when you're done. Proceed?"
- When provider is explicitly declared, skip the question but still echo what you're targeting before acting ("Using existing cluster
<context> at <endpoint>" or "Installing k3s as declared").
- Record the resolved provider in readiness.toon as
kubernetes_provider: existing or kubernetes_provider: k3s.
Kubernetes readiness checks (after provider is resolved):
- Verify
kubectl can reach the cluster: kubectl cluster-info.
- Verify
helm is available for ECK operator installation.
- Check whether the ECK operator is already installed in
elastic-system namespace.
- If
deployment.kubernetes.install_operator: true and operator is missing, note that eck-up.sh will install it.
- If
deployment.kubernetes.install_operator: false and operator is missing, mark readiness blocked.
- Verify the declared namespace can be created or already exists.
- Check
vm.max_map_count kernel setting; report as verified or unverified (drives initContainer generation decision in CRD manifests).
- Confirm the scenario's memory and storage expectations are realistic for the Kubernetes cluster's available resources.
- When
deployment.elasticsearch.security: false, note that generated manifests will disable TLS and security — suitable for dev-grade local iteration, not production.
For existing:
- Echo the target before acting: "I'll run benchmarks against the Elasticsearch cluster at
<endpoint>. This includes destructive resets (index deletion, cache clearing) in the <namespace/prefix> scope. Is this the right cluster?"
- Identify endpoint, auth method, TLS behavior, and whether destructive resets are allowed.
- Require an explicit namespace, index prefix, or disposable test cluster confirmation before destructive phases.
- Confirm the user understands that results are environment-dependent.
For elastic-cloud:
- Echo the target before acting: "I'll run benchmarks against Elastic Cloud deployment
<cloud_id or deployment_name>. This includes destructive resets and may incur cost. Is this the right deployment?"
- Identify Cloud ID or endpoint, auth method, deployment ownership, and cleanup expectations.
- Confirm whether credentials are available through environment variables or a saved profile.
- Confirm cost and destructive reset boundaries before execution.
Credential handling
Prefer these patterns:
ELASTICSEARCH_URL
ELASTICSEARCH_USERNAME
ELASTICSEARCH_PASSWORD
ELASTICSEARCH_API_KEY
ELASTIC_CLOUD_ID
KIBANA_URL
KIBANA_USERNAME
KIBANA_PASSWORD
ESDIAG_RESULTS_URL
ESDIAG_RESULTS_API_KEY
ESDIAG_KEYSTORE_PASSWORD
Accept scenario-specific variable names when declared in hypothetest.yml or operator guidance.
When reporting credential state:
- Say
present, missing, or not required.
- Redact all values.
- Avoid echoing environment variables.
- Do not write credentials into generated artifacts.
Readiness output
When creating an artifact, write it next to the scenario unless the user requests another path:
generated/readiness.md
generated/readiness.toon
Use this Markdown shape:
# Readiness
## Status
## Blockers
## Warnings
## Verified
## Required Before Operator
## Operator Handoff
Use this TOON shape:
status: blocked|ready|ready_with_warnings
deployment_target: compose
dataset_loader: espipe
diagnostics_tool: esdiag
blockers[0]:
warnings[0]:
verified[0]:
experiment:
intent: compare_deployments
variables[1]: deployment
constants_required[2]: dataset,workload
constants_best_effort[1]: index.primary_shards
credential_requirements[1]{name,status,required_for}:
ELASTICSEARCH_URL,missing,existing deployment
tool_access[1]{tool,required_for,runs_from,status,preflight}:
esdiag,diagnostics,operator environment,missing,ESDIAG_KEYSTORE_PASSWORD unavailable in nohup environment
os: darwin
jq: verified
observation_packages[2]{name,status,note}:
elasticsearch_api,verified,http://localhost:9200
darwin_tools,verified,vm_stat iostat
operator_handoff:
blueprint: blueprint.yml
scenario: hypothetest.yml
readiness: generated/readiness.md
For remote compose, include SSH and compose checks in verified:
verified[3]:
ssh access via ~/.ssh/config host bench-host
remote docker compose version
remote workdir writable
For remote compose with loader-local data, include a warning or verified note that the raw dataset is loaded through the indexing tool and is not staged to the SSH host.
Environment binding — script generation
After readiness validation, generate the environment-specific scripts that
evaluation.sh calls. This is template-stamping from readiness findings, not
creative authoring — the Coordinator reads readiness.toon and the plan, then
selects and fills patterns from the reference catalog.
Generated scripts
| Script | Purpose | Reference |
|---|
generated/scripts/compose-up.sh | Start cluster (compose target) | compose templates |
generated/scripts/compose-down.sh | Stop cluster (compose target) | compose templates |
generated/scripts/k3s-install.sh | Install k3s (kubernetes target, provider: k3s) | references/tools/k3s.md |
generated/scripts/k3s-uninstall.sh | Remove k3s (kubernetes target, provider: k3s) | references/tools/k3s.md |
generated/scripts/eck-up.sh | Start cluster (kubernetes target) | references/eck-templates.md |
generated/scripts/eck-down.sh | Stop cluster (kubernetes target) | references/eck-templates.md |
generated/scripts/sample.sh | During-phase observation | references/script-templates.md |
generated/scripts/reset.sh | Variation reset (delete indices, clear caches) | calling convention contract |
generated/scripts/load.sh | Dataset loading wrapper | calling convention contract |
Also generate generated/compose/ (compose.yml, .env, elasticsearch.yml)
or generated/eck/ (namespace.yaml, elasticsearch.yaml, optionally
kibana.yaml) for the declared deployment target.
Script calling convention
All generated scripts follow the locked calling convention contract
(see design doc). Key conventions:
- Stdout carries structured
[tag] key=value lines
- All artifact output paths use
HYPOTHETEST_* env vars (absolute paths)
- Scripts assume cwd is the blueprint root (set by evaluation.sh)
- Scripts never prompt for input; missing credentials = non-zero exit
- Scripts are idempotent where possible
sample.sh generation
When diagnostics.during is declared and profile is not none:
- Read readiness.toon for platform, verified packages, jq availability
- Resolve profile to method set (see
references/observation-methods.md)
- Select skeleton and collection functions from
references/script-templates.md
- Fill in only verified-package collection logic; omit unverified packages
- Template
$ES_PID resolution logic for the deployment target
When diagnostics.during is absent or profile: none, do not generate
sample.sh — evaluation.sh calls phase commands directly.
Progressive loading
References are loaded based on deployment target, observation config,
and blueprint declarations. Each tool reference is self-contained — load
only the files relevant to the current blueprint.
Tool references (references/tools/)
Always loaded:
references/tools/curl.md — ES API access
references/tools/ys.md — schema validation
references/tools/toon.md — structured summary output
Loaded by blueprint condition:
references/tools/espipe.md — when dataset.loader: espipe
references/tools/esdiag.md — when measure.diagnostics.tool: esdiag
references/tools/rally.md — when dataset.loader: rally
references/tools/docker.md — when deployment.engine resolves to docker
references/tools/podman.md — when deployment.engine resolves to podman
references/tools/kubectl.md — when deployment.target: kubernetes
references/tools/helm.md — when deployment.target: kubernetes
references/tools/k3s.md — when deployment.kubernetes.provider resolves to k3s
references/tools/jq.md — when diagnostics.during is declared
Loaded by prescribed method or profile:
references/tools/perf.md — when on_cpu method is prescribed
references/tools/bpftrace.md — when off_cpu method is prescribed
references/tools/sysstat.md — when standard or comprehensive profile on Linux
Generation references
- Always:
references/script-templates.md (skeleton, collection catalog)
- target: compose: compose template references
- target: kubernetes:
references/eck-templates.md (CRD patterns, operator installation, service exposure)
- diagnostics.during declared:
references/observation-methods.md
Never load both compose and ECK reference sets simultaneously.
Boundary rules
- Do not invent missing benchmark intent; route to Architect.
- Do not execute benchmarks; route to Operator.
- Do not analyze completed results; route to Analyst.
- Do not persist secrets.
- Do not mark a scenario ready if required credentials, tool access, dataset access, or compose/runtime prerequisites are unverified.
- Treat partial readiness as useful, but label it
blocked or ready_with_warnings.