Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/junhanliu-dev/espalier-engineering/espalier-migratenpx skills add Junhanliu-dev/espalier-engineering --skill espalier-migrategit clone --depth 1 https://github.com/Junhanliu-dev/espalier-engineeringWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/junhanliu-dev/espalier-engineering/espalier-migrate)<a href="https://agentmods.dev/skills/junhanliu-dev/espalier-engineering/espalier-migrate"><img src="https://agentmods.dev/badge/skills/junhanliu-dev/espalier-engineering/espalier-migrate.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.31174 |
| Opus 5 | $0.00000 | $0.15587 |
| Sonnet 5 | $0.00000 | $0.06235 |
| Haiku 4.5 | $0.00000 | $0.03117 |
Grade A, and why
espalier-migrate scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 1,547 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Espalier Migration Runner
When to Use
- "Migrate to Espalier" / "Upgrade my Espalier install"
- "Upgrade my harness to the latest version"
- "Rename harness/ to espalier/"
- "/espalier-migrate"
When NOT to Use
- Fresh project with no existing
harness/orespalier/dir → use/espalier-initinstead. - Already fully up to date —
/espalier-migratedetects this itself and exits cleanly with no changes.
Instructions
You are running a migration of an existing install to the current Espalier version. Up to THIRTY-FOUR migrations may apply, always in this order:
- v0.1.x → v0.2.x — typed
harness/changes/{type}/{slug}/layout,/harness-fixlane, squash-merge decision. Mechanical:scripts/migrate-v0.1-to-v0.2.sh. - v0.3.x → v0.4.0 —
harness/→espalier/directory + skill rename (harness-run→espalier,harness-{coding,…}→espalier-*). Mechanical:scripts/migrate-v0.3-to-v0.4.sh. - v0.4.x → v0.5.0 — doc-drift detection: drift hooks, the
/espalier-prune+/espalier-doctorskills, the post-merge dispatcher,.doctor-cadence. Mechanical:scripts/migrate-v0.4-to-v0.5.sh. - v0.5.0–v0.5.2 → v0.5.3 — appends the
## Editing Disciplinesection to the coder sub-agent (espalier/agents/harness-coder.md). Mechanical:scripts/migrate-v0.5.2-to-v0.5.3.sh. - v0.5.x → v0.6.0 — Stage 1 grilling: installs the
espalier-grillskill, refreshes the four changed pipeline templates (which also date-prefix change folders). Mechanical:scripts/migrate-v0.5-to-v0.6.sh. - v0.6.x → v0.7.0 — read-only ask lane: installs the
espalier-askskill, patches CLAUDE.md +espalier/agent.mdto mention/espalier-ask. Purely additive — no pipeline change. Mechanical:scripts/migrate-v0.6-to-v0.7.sh. - v0.7.x → v0.8.0 — requirements approval gate: refreshes the three changed
pipeline templates (
pipeline.md,espalier,espalier-fix) so both pipelines STOP for explicit user sign-off after the requirement is written + reviewed, before any code is written (no-TTY runs auto-approve). Mechanical:scripts/migrate-v0.7-to-v0.8.sh. - v0.8.0 → v0.8.1 — impact-analysis agent patch: appends a
## Change Impact Analysissection to the coder sub-agent (espalier/agents/harness-coder.md) and a## Runtime-Surface Reviewsection to the reviewer sub-agent (espalier/agents/harness-reviewer.md). Both make the agents reason about every surface a change touches (admin UIs, API validation, client forms, persisted data, other callers) — not just the programmatic happy path — so a now-derived value left user-required on a UI is caught at coding/review instead of returning as a fix round. Mechanical:scripts/migrate-v0.8-to-v0.8.1.sh. - v0.8.1 → v0.8.2 — re-review fixpoint loop + push-gate certificate: code
review becomes a loop — every coder fix is re-reviewed until a fresh review of
the current code returns zero P0 — and the push gate blocks unless the pushed
code matches the fingerprint the last review saw. Refreshes the two pure-copy
pipeline files (
pipeline.md,espalier-fix), appends a## Re-review Roundssection toharness-reviewer.md, and inserts the certificate check intopre-push-gate.sh. Mechanical:scripts/migrate-v0.8.1-to-v0.8.2.sh. - v0.8.2 → v0.9.0 — security audit + production hardening (one release):
a new
harness-securityagent joins Stage 4 as a review panel; asecurity-standardsrule +espalier-securityskill are added, and the coder/reviewer/testing/push-gate gain security sections. Ships/espalier-audit, the repo-wide audit lane (espalier-auditskill + a Repo-Audit Mode section). Adds an always-loadedproduction-standardsrule (resilience / observability / data-safety, tiered severity) the coder writes to and the reviewer enforces; per-roundVERDICT:sentinels + dual-record freshness; a fail-closed push gate (cwd guard) + programmatic build/lint gate; a deploy-aware Stage 9; the TTY→explicit-signal gate fix; and a single shippedscout-promptsfile for prune/doctor. Creates the new per-project files,bootstrap --forcerefreshes the pure-copy pipeline/grill/hooks + copies scout-prompts + symlinks both new rules + runs the 37-check validation, and surgical appends patch the per-project files. Mechanical:scripts/migrate-v0.8.2-to-v0.9.0.sh. - v0.9.0 → v0.9.1 — configurable escalation caps: the review-round +
rollback hard stops move from hardcoded prose into a tracked
espalier/.espalier-config(max-req-rounds,max-code-rounds,max-test-rounds,max-rollbacks— all default 3) the orchestrator reads at runtime. Creates the config file if absent (preserved on re-run) and refreshes the three pure-copy pipeline files (pipeline.md,espalier/skills/espalier/SKILL.md,espalier-fix) so their prose reads the config; a customised file is backed up to<file>.pre-v0.9.1.bak. Mechanical:scripts/migrate-v0.9.0-to-v0.9.1.sh. - v0.9.1 → v0.9.2 — correctness patch: the fix lane's late-escalation
gates detect via a marker line (the old text called a shell helper that was
never shipped), its back-link reads the real
# Bug:title, and its regression verification is scoped + dep-linked (no more falsetruefrom a suite that couldn't run);/espalier-audit's fix handoff and/espalier-prune's unattended path key offinteractivity_mode; the push gate gates the ACTIVE change (completed changes stop blocking later manual pushes) and parses mocha/rspec/go test counts, preserving the substituted test command; scout 1.11 ships in.scout-prompts.mdand prune/doctor map the security/production rules. Backs up customised pure-copy files to<file>.pre-v0.9.2.bak. Mechanical:scripts/migrate-v0.9.1-to-v0.9.2.sh. - v0.9.2 → v0.9.3 — skill-clarity patch; no new lane, no new stage, no
behaviour change to any gate or verdict.
espalier-grill(pure-copy) gains an explicit user tier-override, a coverage guard so every counted ambiguity signal ends resolved / scoped-out / recorded in## Open Questions, and records a non-answer with a named safe default instead of dropping it.espalier-review(substituted) gets its two review loops rewritten as an explicit when / input / do / output / who workflow, stops restating severities in the production-readiness checklist (production-standards.mdis the single source), and gains when-to-use + trigger phrases in its frontmatter. Backs both skills up to<file>.pre-v0.9.3.bak. Mechanical:scripts/migrate-v0.9.2-to-v0.9.3.sh. - v0.9.3 → v0.9.4 — security-skill patch; no new lane, no new stage, no
behaviour change to any gate or verdict (the security auditor's catch /
false-positive rates are unchanged). The per-project
harness-securityAGENT andespalier-securitySKILL gain when-to-use + the five sensitive axes as frontmatter trigger context, and the agent's P0 rubric and repo-audit "findings do not block" delta stop restating each other's semantics, cross-referencing one source instead. Both are per-project files thatbootstrap --forcenever re-copies, so v0.9.4 shipped these template improvements with no way to reach an existing install. Frontmatter is edited LINE-WISE (aninherittools-mode install has had itstools:line stripped; re-copying the template's frontmatter would reintroduce it). A body span the project has customised is left alone and reported warn-only. Backs both up to<file>.pre-v0.9.4.bak. Mechanical:scripts/migrate-v0.9.3-to-v0.9.4.sh. - v0.9.6 → v0.10.0 — push-gate reshape.
{build_command}/{lint_command}/{test_command}are now substituted into FUNCTION BODIES (run_build/run_lint/run_tests), so a value may be a single command OR a multi-line block — a repo that must run several suites (one per container in a Docker-first stack, one per workspace in a monorepo) can finally be expressed. Before,{test_command}landed inside a command substitution and had to be one expression. Build and lint also stop discarding stderr: the old template ran<cmd> 2>/dev/nulland, on failure, printedBLOCKED: Build failsand nothing else; output is now captured and its tail printed. The migration rewrites those three spans in the installed gate, PRESERVING the commands substituted at init, and handles each span independently (a gate half-migrated by running the v0.9.2 step against a v0.10.0 plugin hasrun_testsbut old build/lint). A gate customised at init past the template shape is left completely untouched and reported, never mangled. Backs up to<file>.pre-v0.10.0.bak. Mechanical:scripts/migrate-v0.9.6-to-v0.10.0.sh. - v0.10.0 → v0.11.0 — hook exit-code release. Claude Code PreToolUse /
PostToolUse hooks block ONLY on exit code 2 with the message on stderr —
exit 1 + stdout is a silent no-op, so the old push gate never actually
blocked. Rebuilds the gate from the v0.11.0 template preserving the three
substituted command bodies (customised gates: skip marker + manual
contract), refreshes both wrappers (fail-closed python probe, broader push
match), patches
check-layer-boundaries.shto exit 2 + stderr, gives the reviewer/security agents their record-file Write tool, and refreshespipeline.md+ the pure-copy pipeline skills so the Stage 4/6 gates read the verdict WORD (FAIL/ESCALATION_REQUIREDno longer advance as PASS), plusespalier-review/espalier-securitywith{project}re-substitution. Backs up to<file>.pre-v0.11.bak. Mechanical:scripts/migrate-v0.10.0-to-v0.11.0.sh. - v0.11.0 → v0.12.0 — grill blind-spot pass. Stage 1 grilling now
cross-references the requirement against the project's own
espalier/rules/andespalier/wiki/, not just the requirement text: a new Step 1.5 surfaces a collision — an approach that violates an encoded rule (throwwhere the repo standardised onResult<T>), a capability the wiki already documents, an unstated downstream ripple — as a Stage 1 question citing the exactrules/<file>#section, and floors the tier so a crisp-but-colliding requirement can't skip grilling. It verifies each doc claim against the code first — a stale doc is flagged (mark_stale), never raised as a false collision — and stays silent when there is no map to collide with. The change is confined to one pure-copy file, so the migration is a single backup-and- refresh ofespalier/skills/espalier-grill/SKILL.md. Backs up to<file>.pre-v0.12.bak. Mechanical:scripts/migrate-v0.11.0-to-v0.12.0.sh. - v0.12.0 → v0.13.0 — convention-bounded minimalism. The coder gains a
Solution Selection Ladder (conventions first, correctness within them,
brevity only breaks ties: reuse what the project has → the convention-named
mechanism → stdlib/native/installed dep → leanest compliant implementation;
a NEW dependency needs a requirements.md line). The reviewer gains an
advisory Minimalism Review (
delete:/stdlib:/native:/yagni:findings capped at P2/P3 so they never re-open the Stage 4 fixpoint loop; ONE P1 exception: a new dependency covering what stdlib / a native feature / an installed dep provides), binds the sentinel'sp1=to the P1 row count, and restores the fan-out P1 bullet that had drifted from production-standards.md. All four touched files are per-project (substituted/scout-filled), so the migration is SURGICAL — anchored section inserts, never a template overwrite. Backs up to<file>.pre-v0.13.bak. Mechanical:scripts/migrate-v0.12.0-to-v0.13.0.sh. - v0.13.0 → v0.13.1 — minimalism polish patch; no gate math, sentinel
vocabulary, round-cap, or review-dimension change. The coding skill gains
## How This Skill Applies by Stage(Stage 3 / Stage 5 testing / fix rounds — including fix-round findings-only scope and "a test-only dependency is still a NEW dependency"), the reviewer's Review Process gains the Stage 6 abuse-test check as numbered step 7 (explicitly skipped on code-review rounds; "Produce findings" renumbers to 8), and the review skill's code-review loop gains the Gate line its plan-review loop got in v0.13.0 (PASS/PASS_WITH_FIXES with p0=0 p1=0; rounds owned by Stage 4max-code-rounds). All three touched files are per-project — surgical anchored inserts, the By-Stage body extracted from the plugin template at runtime. Backs up to<file>.pre-v0.13.1.bak. Mechanical:scripts/migrate-v0.13.0-to-v0.13.1.sh. - v0.13.1 → v0.13.2 — readability release: "human readable" stops being
an accident of discovered conventions and becomes an explicit duty on both
agents. The coder's ladder tie-break becomes clarity then brevity (same
correctness → the more readable → only then the shorter); coding-standards
gains a naming-intent floor ("a name STATES what it holds or does") and a
## Comments & Docstringssection (scout 1.3 now discovers comment conventions); the reviewer gains an advisory Readability Review (naming:/nesting:/magic:/comments:findings capped at P2/P3, judged against the project's own conventions never taste; ONE P1 exception: a cryptic EXPORTED/public name — public names freeze into contracts callers bind to), with the sentinel'sp1=counting that P1 like any other. All six touched files are per-project — surgical anchored splices (requires python3), the refreshed spans extracted from the plugin templates at runtime. The new coding-standards sections carry{observed ...}placeholders until/espalier-prunere-scouts. Backs up to<file>.pre-v0.13.2.bak. Mechanical:scripts/migrate-v0.13.1-to-v0.13.2.sh. - v0.13.2 → v0.14.0 — Codex platform release. Always: refreshes the two
plugin-owned hook wrappers (
post-edit-wrapper.shnow parses Codex apply_patch input and resolves the repo root without$CLAUDE_PROJECT_DIR;pre-push-gate-wrapper.shnow joins argv-array commands before the git-push match — both inert on Claude Code). Optional (--with-codex, asked in Step 4b): wires the codex platform additively —.agents/skills/symlinks,AGENTS.mdEspalier section + platform mapping,.codex/config.tomlhook block,.codex/agents/harness-*.tomlsub-agents,espalier/.platforms. Never unwires claude. Backs up to<wrapper>.pre-v0.14.bak. Mechanical:scripts/migrate-v0.13.2-to-v0.14.0.sh. - v0.14.0 → v0.15.0 — Copilot platform release. Always: installs the new
plugin-owned Copilot hook shim
espalier/hooks/copilot-hook-adapter.sh(translates Copilot's camelCasetoolName/toolArgspayload into the Claude/Codextool_name/tool_inputshape and dispatches to the shared wrappers; exit codes pass through — Copilot treats non-zeropreToolUseexits as DENY). Optional (--with-copilot, asked in Step 4c): wires the copilot platform additively —.github/skills/symlinks,.github/copilot-instructions.mdEspalier section,.github/agents/harness-*.agent.mdcustom agents,.github/hooks/espalier-gates.json. Never unwires claude/codex. New file only — no backups needed. Mechanical:scripts/migrate-v0.14.0-to-v0.15.0.sh. - v0.15.0 → v0.16.0 — multi-dev maintenance floor (Release A). Always:
refreshes the pure-copy pipeline files +
drift-helpers.sh(theconv_fold/conv_observationsconventions reader, per-mechanism maintenance lanes, promotion race guard, unattended Stage 0 continuation, conflict + slug-collision recipes) with backup-on-diff (<file>.pre-v0.16.bak); surgically appends the## Maintenance Commitssection to the per-projectespalier/rules/development-process.md; thenbootstrap --wire-onlyappends the.gitattributesunion entry forespalier/.ask-gaps.tsv, thecanonical-remote/canonical-branchconfig keys, and runs the 48/53/58-check validation (side-effect: settings.json backup). Optional:--codeowners-rules/--codeowners-wiki(asked in Step 4d) write the CODEOWNERS marker block. Mechanical:scripts/migrate-v0.15.0-to-v0.16.0.sh. - v0.16.0 → v0.17.0 — multi-dev maintenance B-team. Pure-copy only:
refreshes
pipeline.md, the espalier / espalier-fix / espalier-prune / espalier-doctor SKILL files, anddrift-helpers.sh(doctor_due v2 with clean/dirty shared-stamp semantics + skew rejection,doctor_stamp_shared,conv_slug, per-keyappend_convention) with backup-on-diff (<file>.pre-v0.17.bak). No config change, no attribute change, no data migration —espalier/conventions/andespalier/.doctor-stampappear on first write; the legacy.conventions.tsvis read forever, written never. Run-time assert:.doctor-stampmust not be gitignored. Mechanical:scripts/migrate-v0.16.0-to-v0.17.0.sh. - v0.17.0 → v0.18.0 — map-lane release. New files: the
espalier-maplane skill (multi-session planning — decision maps underespalier/maps/)
- symlinks on every platform in
espalier/.platforms, and themap-guard.shplan-don't-do PreToolUse hook. Refreshespipeline.md, the espalier + espalier-grill SKILL files (grill gainsmode=decision) with backup-on-diff (<file>.pre-v0.18.bak). Wiring: settings.json gains the map-guard PreToolUse entry (additive),.codex/config.tomlthe marker-guardedESPALIER MAP GUARD v1block, the copilot gates json a targeted map-guard insert (never clobbered). Config: appendsmax-open-tickets: 9. One grep-guarded/espalier-mapline lands in each platform instruction file's existing## Espaliersection. Mechanical:scripts/migrate-v0.17.0-to-v0.18.0.sh.
- v0.18.0 → v0.19.0 — run-lane release. New files: the
espalier-maprunlane skill (batch executor for a CLEARED map — interactive master + headless stage-1–6 workers in isolated push-blocked worktrees) + symlinks on every platform inespalier/.platforms, and the run engineespalier/hooks/maprun.py+maprun-{dispatch,merge,integration,verify}.sh. Engine files are WRITE-IF-ABSENT — a repo already carrying a locally-adapted engine keeps it. Refreshespipeline.mdand the espalier-map SKILL (handoff now names the batch executor) with backup-on-diff (<file>.pre-v0.19.bak). One grep-guarded/espalier-maprunline lands in each platform instruction file's existing## Espaliersection. No config keys, no hook wiring. Mechanical:scripts/migrate-v0.18.0-to-v0.19.0.sh. - v0.19.0 → v0.20.0 — slice-PR release. Run-lane topology unchanged;
the lane gains an OPT-IN forge surface (a
prkey in a map's plan.json): one reviewable slice PR per ticket, opened before the local merge and auto-closed as merged when the integration branch is pushed, plus a final assembly PR. New engine fileespalier/hooks/maprun-pr.sh(WRITE-IF-ABSENT). Refreshes the espalier-maprun SKILL with backup-on-diff (SKILL.md.pre-v0.20.bak). Bug fix: patchesmaprun-integration.sh's push block to--worktreescope (the stock v0.19 lines poisoned the SHARED.git/config, blocking the operator's own pushes), heals an already-poisoned sharedremote.origin.pushurl, and re-blocks existing_integrationworktrees worktree-scoped. No config keys, no hook wiring, no new symlinks. Mechanical:scripts/migrate-v0.19.0-to-v0.20.0.sh. - v0.20.0 → v0.21.0 — pipeline-speed release. Same gates, round caps,
and review contract; the run just reads (and waits) less. Refreshes 4
pure-copy files from templates with backup-on-diff (
<file>.pre-v0.21.bak):pipeline.md(delta-scope doctrine, parallel-dispatch constraint, pre-authorized push checkpoint) and the espalier / espalier-fix / espalier-grill SKILLs (context-pack assembly at Stage 3 entry, spawn prompts carrying it, push-target question at the approval gate, grill light-tier independent-question batching). Anchored inserts into the 3 per-project agent files (substituted at init, so never overwritten): the coder's context-pack step 0, the reviewer's step 0 + delta read-scope paragraph, the security agent's step 0 + delta-mode paragraph — a customised agent file missing its anchor is skipped with aespalier/.migrations-skippedrecord and manual instructions, never mangled. No config keys, no hook wiring, no new symlinks. Mechanical:scripts/migrate-v0.20.0-to-v0.21.0.sh. - v0.21.0 → v0.21.1 — comment-brevity polish patch (field feedback:
generated comments ran too long). Anchored edits to 3 per-project files:
the coder gains a "Comments: SHORT, clear, and few" constraint bullet,
coding-standards.mda "Keep comments SHORT" bullet under Comments & Docstrings, and the reviewer's Readabilitycomments:tag now also flags an OVERLONG comment. A documented project convention requiring fuller docstrings outranks the new default. Customised files are skipped with a.migrations-skippedrecord, never mangled; backups at<file>.pre-v0.21.1.bak. Mechanical:scripts/migrate-v0.21.0-to-v0.21.1.sh. - v0.21.1 → v0.22.0 — second pipeline-speed release. Same gates,
sentinels, round caps, certificates, and human checkpoints; the changes
are dispatch-order, read-scope, and wait-scheduling only. Refreshes 4
pure-copy files with backup-on-diff (
<file>.pre-v0.22.bak):pipeline.md(speculative Stage 5 trigger, Stage 6 delta note, CI wait protocol, Deploy-Target checkpoint + unattended posture) and the espalier / espalier-fix SKILLs (3-agent round-1 dispatch, Stage 4→5 handoff with quarantine-on-FAIL, pre-flight fold, deploy pre-auth question, concurrent build+lint gate, one-invocation Stage 7 bookkeeping) plusespalier/hooks/espalier-stats.sh(stage-duration report). Anchored edits into the 4 SUBSTITUTED per-project files: the coder's Speculative/Contract entry points, the reviewer's and the security agent's in-flight exclusion paragraphs, andpre-push-gate.sh's opt-in parallel gate sections + dependency-audit cache (span-splice;bash -nverified after) + its ANCHORED certificate read (a Stage History note quotingBase-Ref:/Reviewed-Diff:in prose must never outrank the real Status-block line — a field-found false-BLOCK) — customised files are skipped with a.migrations-skippedrecord, never mangled. Appendsespalier/.dep-audit-cacheto.gitignore. Writes NO config keys:speculative-testsdefaults on when absent;hook-parallel-gatesabsent = serial (init-time opt-in only). Mechanical:scripts/migrate-v0.21.1-to-v0.22.0.sh. - v0.22.0 → v0.22.1 — comment-diet polish patch (field feedback:
agents still write too MANY comment lines, not just long ones). Anchored
edits to 3 per-project files: the coder's Comments constraint becomes
default-NO-comment with a delete-before-reporting re-scan (no banners,
no signature doc-blocks, no narration),
coding-standards.mdgains a "Default to NO comment" bullet, and the reviewer's Readabilitycomments:tag now also flags EXCESS comments naming the exact lines to delete. A documented project convention mandating fuller docs still outranks the default. Customised files are skipped with a.migrations-skippedrecord; backups at<file>.pre-v0.22.1.bak. Mechanical:scripts/migrate-v0.22.0-to-v0.22.1.sh. - v0.22.1 → v0.23.0 — round-economy release (the Stage 3/5 fold). Same
gates, sentinels, caps, certificates, and human checkpoints; the dispatch
restructures so tests ride the coder: under
test-mode: folded(the default) the Stage 3 exit gate runs build+lint+scoped tests every coder return, the 2-agent Stage 4 panel reviews code AND tests in one verdict, and Stages 5/6 are the security-contract phase (contract spawn → delta review) or SKIPPED rows — stage numbers stay 3→4→5→6→7 for the push gate, stats, and maprun parsers. Contract-FAIL fixes touching non-test files route back to a FULL panel round. Fix lane: regression verification joins the Stage 3 exit gate (REGRESSION_VERIFIED_SCOPEskip hash, last-line-wins); scope detectors count non-test files only. Findings digest: FAIL rounds snapshot bracketed finding lines; charted changes writeespalier/maps/{slug}/findings/files (Completion, or the maprun worker before PASSED); adoption folds the newest 12 P0/P1 lines. Map handoff gains the crispness gate (grillmode=score; CLEARED flips LAST); grill verdicts carry tiers (GRILLED (light)/(full)). Readable-by-default coder guidance: the "Write It Readable" section (named constants over magic values — never inlined, declaration-comment when the name can't carry the meaning — intent names, guard clauses, small functions, comments last) plus coding-standards' "Readable by Default"; the reviewer's Readability Review gainsstructure:and the magic-constant declaration-comment check. Refreshes 11 pure-copy files (backups.pre-v0.23.bak, incl. the mawk-safe rebuild-commit-index squash extraction) and anchored-edits coder/reviewer/security, the 3 rules files, the espalier-coding/espalier-testing SKILLs, andpre-push-gate.sh(anchoredCurrent Stage:read + last-match test count); customised files skip-with-record. Writes NO config keys —test-modeabsent = folded, legacyspeculative-testshonored at read time (off→ serial). Mechanical:scripts/migrate-v0.22.1-to-v0.23.0.sh. - v0.23.0 → v0.23.1 — class-sweep patch. Field data (48 changes on a
real v0.23.0 install): most second/third Stage 4 rounds re-found the
SAME defect one hop from the line just fixed — a full 2-agent round per
hop. A fix round now closes the CLASS: on a
FIX ROUND {n}:prompt the coder names the violated property, enumerates every sibling inside the change's scope (touched layers + the generated surfaces they feed), fixes each on its own read, and reports one### Class Sweepblock per P0/P1 (out-of-scope siblings listed for a follow-up, never a repo-wide refactor); both panel agents re-verify the sweep independently on the next round — a gap is a P1[class-sweep]. Refreshes 3 pure copies (pipeline.md, espalier + espalier-fix SKILLs — the re-spawn header); anchored-inserts the 3 agent sections, extracted from the templates so a migrated install is byte-identical to a fresh one; customised files skip-with-record; backups<file>.pre-v0.23.1.bak. No config keys. Mechanical:scripts/migrate-v0.23.0-to-v0.23.1.sh. - v0.23.1 → v0.24.0 — simplify-lane release. New pure-copy skill
espalier-simplify(/espalier-simplify [scope]): an evidence-first simplification survey of the EXISTING code, method adapted fromtt-a1i/simplify-codebase(MIT). Read-only scouts partition the repo by the discovered layers and hunt accidental complexity (dormant contracts, split truth, ownerless flexibility, relay layers, feature fossils …); every candidate carries a proof record (consumer map, cut boundary, consequence, decisive check, net effect) and is classed HIGH / LEAD / JUSTIFIED intoespalier/wiki/simplify-survey.md; selected HIGH cuts are filed asStatus: FILEDskeletons underespalier/changes/refactor/(simplify_from:frontmatter) that/espalieradopts and runs through the normal coder + two-agent panel. The coder gains "Simplification Changes: Retire the Whole Obligation" (cut the full boundary, never relocate, a missed consumer is a STOP, residue search,### Retired Surfacereport); the reviewer gains "Simplification Review" (independent re-search of every retired name — a live consumer is a P0[simplify-consumer]; residue / relocation / proof P1s; a retired protected control the requirement never named is a P0); the Stage 3/4 spawn prompts carry aSIMPLIFICATION CHANGE:header and a missed consumer the coder cannot prove dead ABORTS the change (row → LEAD) instead of looping fix rounds. Completion flags the docs that still describe retired surface (mark_stale, reasonsimplify: …) for/espalier-prune, and points at/espalier-doctor --since <survey commit>after a batch. Retirement maps (/espalier-map retire: … (simplify-survey #n)) carrysimplify_frominto every slice;espalier-stats.shgains the simplify-lane echo (simplify-filed vs hand-written refactors, withdrawn cuts, tags);/espalier-askreads the survey page as awhysource. Installs the skill + symlinks on every wired platform; refreshes 5 pure copies (pipeline.md, the espalier / espalier-map / espalier-ask SKILLs,espalier-stats.sh— backups.pre-v0.24.bak); anchored-inserts the coder / reviewer sections and theagent.mdConfig Index row, EXTRACTED from the templates; adds the instruction-file lane line; customised files skip-with-record. No config keys, no hooks, no gitignore entries. Mechanical:scripts/migrate-v0.23.1-to-v0.24.0.sh.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago Changed · +87 lines 6614806ab6b8
- 5d ago First seen · 1,460 lines · 0 tokens per session scan A 232e0efa110b
espalier-migrate is a skill published in the GitHub repository Junhanliu-dev/espalier-engineering (72 stars, last pushed 2d ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 31,174 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
codex
Offload heavy-duty implementation work to OpenAI Codex as a background worker, routing each task to the appropriate available GPT model—especially GPT-5.6 Sol, Terra, or Luna—while Claude stays the orchestrator and reviewer. Use when the user types /codex, asks to delegate/offload/route work to Codex or a GPT model…
gan-zhong-xue
在你干真实开发时(边干边挖:搞懂 AI 正在做的这步,掌控方向)或干完提交后(事后挖: 回头搞懂一个甩手没懂的改动),就地陪你走一轮"先让你猜、再揭示、逼到原理"的回合制, 把黑盒变成你真懂、能复述、能迁移的东西。治的是 vibe-coding 的病:交付物在增加, 理解没跟上。触发词:"干中学"、"帮我搞懂 AI 正在做的这步"、"我刚才那段没懂"、 "这个 commit 我说不清"、"帮我真正搞懂刚才做的";掌舵(任务中途):"等等这步我没懂"、 "为什么这么改"、"这步我没跟上"。 English triggers: "learning by doing", "help me actually understand what…
google-go-style
Use when writing, reviewing, or refactoring Go code; when handling errors (fmt.Errorf, %w, sentinel, errors.Is, errors.As); when deciding between panic, error return, and log.Fatal; when writing tests (table-driven, t.Helper, t.Fatal vs t.Error, goroutines); when designing API surface (option struct, variadic options…
concise
Concise communication mode. Cuts 60-70% of output tokens while keeping natural, readable English. Drops filler, hedging, and pleasantries but maintains grammar and sentence flow. Elaborate on request -- ask for detail and get it, then auto-return to concise. Use when user says "concise mode", "be concise", "less…
specdd
Spec-driven development orchestrator that turns vague, top-of-mind feature requests into production-grade specifications before any code is written. ALWAYS use this skill whenever the user describes a feature, change, capability, screen, flow, or new component in plain language — even if they don't explicitly ask for…
autoprompt
Explicit-only useful-first orchestration. Invoke /autoprompt to turn a mission into one executable roadmap, build dependency-safe lanes, and verify the result with independent reviewers. Never infer invocation from ordinary requests. Never resume from leftover artifacts without an explicit resume instruction.