Getting it into your agent
It runs from inside its repository, so the clone comes first — what it calls does not travel with the file alone.
git clone --depth 1 https://github.com/Junhanliu-dev/espalier-engineeringnpx agentmods add skills/junhanliu-dev/espalier-engineering/espalier-migrateWrote 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/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<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="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 55 findings, up to medium
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- medium Excessive Agency · line 44 Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.Fix: Add human-in-the-loop confirmation for destructive, irreversible, or high-impact operations. Never auto-execute commands that modify files, send data, or alter system state.
- medium Excessive Agency · line 1326 Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.Fix: Add human-in-the-loop confirmation for destructive, irreversible, or high-impact operations. Never auto-execute commands that modify files, send data, or alter system state.
- medium Agent Snooping · line 83 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 622 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 732 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 736 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 808 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 819 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 831 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 859 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 885 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 912 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 928 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 942 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 1398 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 159 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 610 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 687 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 742 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
- medium Agent Snooping · line 830 Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.Fix: Remove all code or instructions that list or read other skills' files or directories. Skills should operate independently; cross-skill access is a privilege escalation.
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.42818 |
| Opus 5.5 | $0.00000 | $0.17127 |
| Sonnet 5.5 | $0.00000 | $0.08564 |
| Haiku 4.5 | $0.00000 | $0.04282 |
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 4d 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 — 2,011 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 FORTY-ONE 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. - v0.24.0 → v0.25.0 — quality-first context release. Every gate,
rubric, sentinel, round cap, and escalation path is contract-equal to
v0.24.0; NOTHING sets a budget or refuses on size. The coder gains the
Handoff protocol (finish bounded work at a clean point — build green,
report written fresh with a
## Handoffblock whose Facts carrypath:line, sentinel- HANDOFF: true; the orchestrator archives the report and re-spawns a fresh coder with aCONTINUATION:line — the panel still reviews the combined diff once), the Docs clause (edit the false claim in place, one line), read-once / Grep-only / Scoped-docs reading lines, the- Spec applied:report line (the reviewer opens the cited section;[spec-unread]is an advisory row), report hygiene under overwrite semantics, and the rules reword lines (auto-loaded on Claude Code). The reviewer gains the same reading lines, the spec-citation check, one-row advisory findings (no count), thedocs:tag; the security agent the reading lines + Read-tool evidence. The orchestrator (espalier + fix SKILLs, pure-copy): sentinel → archive (report_archiveintocoding-log/, socoding-report.mdis always the CURRENT spawn's report) →exit_gate(build + lint concurrent, scoped tests, from the installed pre-push gate's ownrun_*bodies; exit 2 / 3 = by hand as before) → continuation; the context pack gains- Facts established:,- Grep-only:(grep_only_files, from the newgrep-only-paths:config key) and- Scoped docs:(scoped_docs);contract_extractwritessecurity-contract.mdfor the Stage 5/6 spawns; a stage-boundary offer after Stage 2 approval and after the Stage 4 PASS (Continue here/Continue in a fresh session, never unattended) and aRESUMEDrow on resumption;req_shape_checkprints requirement headings outside the contract set (information only). Requirements are contract + notes (requirements-notes.md; the≤ 5 filesrule becomes a sizing paragraph); the grill's code reads are unlimited (map lane too). Rules: Writing Contract in.scout-prompts.md, Removed-rules ledger (rule_bullets+comm) at the prune gate, doctorcontract driftline (contract_drift_lines),## Not Precedentanchor inengineering-structure.mdrefreshed from scout 1.2'snot_precedentarray.espalier-stats.shgains spawn shape + workspace docs;maprun.pyparses stage names by a literal### N.(the8.5heading no longer overwrites stage 8) with fallback labels. Refreshes 15 pure copies (backups.pre-v0.25.bak, gitignored as*.pre-v0.*.bakfrom now on); anchored edits EXTRACTED from the templates for the three agent bodies, the testing SKILL,agent.md,engineering-structure.md(customised files skip-with-record; already-reworded lines no-op); appendsgrep-only-paths:; prints report-only lines (requirement shape per IN_PROGRESS change, rules contract drift) and edits no rule or requirement. The/espalierskill becomes a ROUTER: each stage's procedure is a pure-copy file underespalier/skills/espalier/stages/(1-2-requirements,3-coding,4-panel,5-6-contract,7-10-delivery) read at stage entry;pipeline.mdbecomes the stage CONTRACT (trigger / load / gate / output / limit + a Procedure line per stage, eleven headings frozen; the maintenance conflict recipes move to/espalier-prune); the agents' mode-only sections (coder Fix Rounds + Simplification Changes; reviewer Re-review Rounds + Simplification Review
- Security Abuse-Test Coverage; security Re-review Rounds + Repo-Audit
Mode) become heading + one-line pointer in the body and live verbatim in
espalier/agents/modes/{fix-round, simplification, re-review, repo-audit, stage6-abuse-coverage}.md, named first on the mode prompt lines (FIX ROUND {n}: read espalier/agents/modes/fix-round.md first …). Commit Discipline: the coder commits one bounded unit per commit at a clean point (message perdevelopment-process.md→ Commit Conventions, staged by path, never under PARALLEL DISPATCH — the orchestrator commits each part after the wave), lists them under- Commits:; Stage 7 commits only what is left, by path, never squashes, and records every commit inBase-Ref..HEAD; the reviewer's advisorycommits:tag; the fix lane's late-escalation revert covers the range;development-process.mdgains the atomic-commits bullet in its managed block. The security auditor's Priority Rubric gains Shown, not assumed — a P0/P1 names the client value and the sink in the audited code with the tamper stated; a control outside the audited files is recorded asunverified:under Controls confirmed, never filed for being absent; "client-supplied" and "reachable" are shown the same way (an unseen queue / job producer is P2/P3 plus anunverified:line); production seeds and replay belong to the reviewer, a second effect of a filed root defect is a sibling read inside it; a lookup / destination key that authorizes nothing is not a P0; a finding that states its own unverified premise is not a P0/P1 (precision, not a cap — every shown defect is filed). Validation checks 64context-helpers, 65spawn-protocols, 66stage-procedures; totals 56 / 61 / 66 by platform set. Mechanical:scripts/migrate-v0.24.0-to-v0.25.0.sh.
- v0.25.1 → v0.26.0 — turn-economy release. Every gate, rubric,
sentinel, round cap, and escalation path is contract-equal to v0.25.1;
nothing sets a budget. The coder writes the abuse test (tamper →
rejected → store unchanged) for every sensitive field it classifies WITH
the code (Security-Aware Coding — "Abuse test, now") and verifies each
cycle with ONE call,
exit_gate DIR {test files}— the gate's own commands ("Verify in One Call"). The auditor's contract entries carrycovered_by: {path:lines} | none, a routing fact: the orchestrator's Stage 5 runscontract_gapsand spawns a contract-phase coder only for the gap entries (GAPS:on its prompt) — every entry covered →| 5 | PASSED | {ts} | folded: contract covered at Stage 3 |and straight to the delta review, which proves each entry itself (acovered_bythat does not hold is its P0). The session-boundary preference is asked ONCE at the Requirements Approval Gate (- Session-Boundary: none | after-2 | after-4 | both); the Stage 2 and Stage 4 boundaries read it. The bash blocks the orchestrator retyped are helpers indrift-helpers.sh:regression_verify(the fix lane's Base-Ref worktree check, with its scope-hash cache),record_commits,certificate_write,drift_index,stage85_drift,backlink_all.exit_gatescopes a multi-workspacerun_testsbody ((cd WS && CMD) || return 1per line) anduv run pytest/poetry run pytest/pnpm exec vitest run/bun test, and starts the tests as soon as the build is green while lint finishes. The pre-push hook runs build ∥ lint by default (tests still follow a green build;hook-parallel-gates: yesstays the three-way opt-in).espalier-stats.shreports contract phases covered at Stage 3 vs coder-spawned and the boundary preferences chosen. Refreshes 14 pure copies (backups.pre-v0.26.bak); anchored edits EXTRACTED from the templates for the coder and security bodies, the testing / security / coding SKILLs, and the push hook's two serial sections (customised files skip-with-record; the discovered gate commands are never touched). Validation checks 67turn-economy-helpers, 68contract-coverage; totals 58 / 63 / 68 by platform set. Mechanical:scripts/migrate-v0.25.1-to-v0.26.0.sh. - v0.26.0 → v0.27.0 — unknowns release: a channel for what the code
teaches during and after implementation, with the contract still
frozen. Every gate, rubric, sentinel, round cap, and escalation path is
contract-equal to v0.26.0; the coder never edits requirements.md; the
human resolves every criterion the code contradicts. The coder logs
each departure from the contract under
### Deviations(the conservative option, thepath:linecontradiction, what was left undone) or stops at a clean point with- BLOCKED-ON-REQUIREMENT:— the Stage 3 exit gate archives the report, the human takes the conservative option (open_question_appendrecords it as ratified) or rewords the criterion, a fresh coder continues withRESOLUTION:(unattended: the conservative option,(default — revisit)). The reviewer's Deviation Review verifies the block every round (unlogged or non-conservative departure =[deviation]P1); the auditor files a relaxed control on a sensitive field as P0. The Stage 4 PASS prints the deviations (deviations_list); Stage 10 presentsdelivery-brief.md(delivery_brief— assembled from the records, never authored) and offers a quiz (interactive only); Completion copies the deviations torequirements-notes.md## Settled for next time. The grill takesfamiliarity: low(only from the requester's own words), reads the map to them first (Step 1.6 requester brief, cited, never a proposal), shows its 3–5 candidate builds atfulltier, and records an undecided APPROACH under## Open Questionswith a/espalier-mappointer instead of choosing. requirements.md gains## References(the requester's named model; the pack's- References:line); the approval gate leads with the decisions most likely to change (data model, interfaces, user-facing, every Open Questions default — ratified there).espalier-stats.shreports the deviations row. Refreshes 12 pure copies (backups.pre-v0.27.bak); anchored edits EXTRACTED from the templates for the coder, reviewer and security bodies (customised files skip-with-record). Validation check 69unknowns-channel; totals 59 / 64 / 69 by platform set. Mechanical:scripts/migrate-v0.26.0-to-v0.27.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.
- 4d ago Changed · +64 lines c66fa6e47b1d
- 6d ago Changed · +43 lines 571a3eb46bdd
- 1mo ago Changed · +212 lines deff9ea18b6d
- 1mo ago Changed · +145 lines 8b4ee7fcd9c3
- 1mo ago Changed · +87 lines 6614806ab6b8
- 1mo 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 (69 stars, last pushed 5d ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 42,818 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
bun-http-server
Use when building HTTP servers with Bun.serve, handling requests/responses, implementing routing, creating REST APIs, or configuring fetch handlers.
api-testing
HTTP API testing for TypeScript (Supertest) and Python (httpx, pytest). Test REST APIs, GraphQL, request/response validation, authentication, and error handling.
bun-jest-migration
Use when migrating from Jest to Bun's test runner, import compatibility, mocks, and config.
bun-test-mocking
Use for mock functions in Bun tests, spyOn, mock.module, implementations, and test doubles.
cloudflare-workers-migration
Migrate to Cloudflare Workers from AWS Lambda, Vercel, Express, and Node.js. Use when porting existing applications to the edge, adapting serverless functions, or resolving Node.js API compatibility issues.
bun-test-coverage
Use for test coverage with Bun, --coverage flag, lcov reports, thresholds, and CI integration.