skill: make the peltier skill consumable across agent harnesses

The SKILL.md Agent Skills standard (agentskills.io) is now read natively by
Codex, Copilot, VS Code, Cursor, Gemini CLI, opencode, Goose, Amp, Zed,
Factory, and ZeroClaw — so the portable move is not per-harness adapter
files (forked content that drifts) but one canonical skill placed where
each harness actually looks.

- Spec-compliant frontmatter: license, compatibility (the Linux-only
  measurement story, stated up front), version/author/tags top-level
  (ZeroClaw's runtime reads those; the spec ignores unknown fields).
  reference/ renamed to references/ per the spec's conventional layout.
- .agents/skills/peltier/ mirror: the cross-tool convergence path (Codex,
  Zed, Cursor, Gemini CLI, Copilot, opencode, Goose, Amp). Byte-identical
  to the .claude canonical, enforced by CI — drift between the two copies
  is a red build, not a footnote.
- AGENTS.md at the repo root for the ~20 harnesses that read it (Claude
  Code does not; CLAUDE.md remains its file). Deliberately thin: it points
  at CLAUDE.md and the skill instead of restating rules.
- scripts/install-skill.sh: stamps a consumer repo at both discovery paths
  (--layout claude|agents|both), or emits a script-less --zeroclaw-variant.
  ZeroClaw's skill security policy blocks script files by default
  (skills.allow_scripts off) — its audit rejected the full skill and passes
  the variant, verified against the real zeroclaw binary. The variant loses
  nothing: preflight.sh still exists exactly once, in the peltier checkout
  the skill already requires, and SKILL.md now documents running it from
  there. Re-implementing preflight inline is named as a refusal condition.
- CI (skill-preflight): frontmatter upgraded to a full Agent Skills spec
  conformance check on BOTH copies (name rules, dir match, description and
  body limits, metadata string-map), plus mirror equality and a functional
  installer test (both layouts identical to canonical, variant carries no
  scripts/, nonexistent target refused).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 11:59:26 -04:00
co-authored by Claude Fable 5
parent ec73e277f1
commit 477c5472dd
13 changed files with 801 additions and 28 deletions
@@ -0,0 +1,91 @@
#!/bin/sh
# peltier preflight — locate the trust layer, check this host can RUN it, and
# build the real bench-runner.
#
# STATUS=ok means the harness is present and runnable here. It does NOT mean
# this host can measure your change: only the A/A self-test decides that, and
# it decides it empirically. Do not read STATUS=ok as "calibrated".
#
# A refusal (STATUS=refuse, nonzero exit) is a complete, valid outcome. It
# ends the *claim*, not the work: you may still write and explain a patch, you
# just may not attach a number to it. Never work around a refusal with a
# hand-rolled timing loop.
set -eu
say() { printf '%s\n' "$1"; }
refuse() {
say "STATUS=refuse"
say "REASON=$1"
exit 1
}
abspath() { ( CDPATH= cd -- "$1" 2>/dev/null && pwd ); }
# --- host -------------------------------------------------------------
# bench-runner shells every timed run through `sh -c`, and the in-repo
# pipeline (harnessd, service mode, the sh-based gates) is POSIX-only.
# Windows compiles the workspace but cannot run it.
uname_s=$(uname -s 2>/dev/null || echo unknown)
case "$uname_s" in
Linux) host=linux ;;
Darwin) host=darwin ;;
*) refuse "unsupported host '$uname_s' — peltier's harness is Linux/POSIX-only at runtime. Run it on Linux (or macOS for verify mode). Do not substitute another benchmark." ;;
esac
# --- trust layer ------------------------------------------------------
is_peltier() { [ -f "$1/crates/bench-runner/Cargo.toml" ] && [ -f "$1/config/accept.toml" ]; }
# Walk up from a starting dir looking for a checkout. Absolute POSIX paths
# always terminate at "/", so this cannot spin.
walk_up() {
d=$1
while [ -n "$d" ] && [ "$d" != "/" ]; do
if is_peltier "$d"; then printf '%s' "$d"; return 0; fi
d=$(dirname "$d")
done
is_peltier / && printf '/'
return 0
}
home=""
if [ -n "${PELTIER_HOME:-}" ]; then
canon=$(abspath "$PELTIER_HOME" || true)
[ -n "$canon" ] || refuse "PELTIER_HOME='$PELTIER_HOME' does not exist"
is_peltier "$canon" || refuse "PELTIER_HOME='$PELTIER_HOME' is not a peltier checkout (no crates/bench-runner/Cargo.toml + config/accept.toml)"
home=$canon
else
# cwd first (working inside a checkout), then this script's own location
# (the skill still living inside one). A skill copied into another project
# finds neither — which is why PELTIER_HOME exists.
home=$(walk_up "$(pwd)")
[ -n "$home" ] || home=$(walk_up "$(abspath "$(dirname -- "$0")")")
fi
[ -n "$home" ] || refuse "no peltier checkout found — clone https://github.com/bdbrown4/peltier.io and set PELTIER_HOME=/path/to/peltier.io. The statistics live in bench-runner; do not reimplement them."
command -v cargo >/dev/null 2>&1 || refuse "cargo not on PATH — needed to build bench-runner from $home"
# --- build the real harness -------------------------------------------
# Always build. cargo is a no-op when current, and skipping this because a
# binary happens to exist would silently measure with a stale copy of the
# statistics after a `git pull`.
br="$home/target/release/bench-runner"
( cd "$home" && cargo build --release -q -p bench-runner ) \
|| refuse "bench-runner failed to build in $home — fix the build before claiming any number"
{ [ -f "$br" ] && [ -x "$br" ]; } || refuse "bench-runner did not appear at $br after a successful build"
# --- pinning ----------------------------------------------------------
# NOTE: config/accept.toml's `pin_prefix` is read ONLY by the in-repo verdict
# pipeline. For compare/aa/calibrate you must wrap the commands yourself
# (`taskset -c N <cmd>` on both sides). PIN_SUPPORTED just says whether that
# tool is available here.
if [ "$host" = linux ] && command -v taskset >/dev/null 2>&1; then
pin=yes
else
pin=no
fi
say "STATUS=ok"
say "PELTIER_HOME=$home"
say "BENCH_RUNNER=$br"
say "HOST=$host"
say "PIN_SUPPORTED=$pin"
say "NOTE=harness runnable here; the A/A self-test decides whether it can measure your change"