espalier-migrate

espalier-migrate is a skill for Claude Code, Codex from Junhanliu-dev/espalier-engineering. It costs 0 tokens per session (31,174 once invoked), scanned A, original, MIT.

A migration runner for upgrading an existing Espalier or Harness installation through the required version changes. Espalier is the project's coding workflow system.

In plain words
What is it for?
Use it to upgrade an existing installation, rename its directories and skills, and apply version-specific maintenance changes.
Why use it?
It applies the ordered changes needed when the installation uses an older layout or feature set.

Skill for Claude CodeCodex

Part of the espalier-engineering plugin — 2 skills, 3 agents shipped together

Install

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.

agentmods
npx agentmods add skills/junhanliu-dev/espalier-engineering/espalier-migrate
Any agent
npx skills add Junhanliu-dev/espalier-engineering --skill espalier-migrate
Clone the repo
git clone --depth 1 https://github.com/Junhanliu-dev/espalier-engineering

Made for: Claude Code, Codex.

Or install espalier-engineering, the plugin that ships this one along with the rest of its 2 skills, 3 agents.

Wrote 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.

agentmods badge for espalier-migrate

README.md
[![agentmods](https://agentmods.dev/badge/skills/junhanliu-dev/espalier-engineering/espalier-migrate.svg)](https://agentmods.dev/skills/junhanliu-dev/espalier-engineering/espalier-migrate)
Your own site
<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>
Per session 0 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 31,174 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce 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

Measured 2d ago against content hash 6614806ab6b8, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-05, from the pricing page.

Security

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.

skills/espalier-migrate/SKILL.md · 1,547 lines

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/ or espalier/ dir → use /espalier-init instead.
  • Already fully up to date — /espalier-migrate detects 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:

  1. v0.1.x → v0.2.x — typed harness/changes/{type}/{slug}/ layout, /harness-fix lane, squash-merge decision. Mechanical: scripts/migrate-v0.1-to-v0.2.sh.
  2. v0.3.x → v0.4.0harness/espalier/ directory + skill rename (harness-runespalier, harness-{coding,…}espalier-*). Mechanical: scripts/migrate-v0.3-to-v0.4.sh.
  3. v0.4.x → v0.5.0 — doc-drift detection: drift hooks, the /espalier-prune + /espalier-doctor skills, the post-merge dispatcher, .doctor-cadence. Mechanical: scripts/migrate-v0.4-to-v0.5.sh.
  4. v0.5.0–v0.5.2 → v0.5.3 — appends the ## Editing Discipline section to the coder sub-agent (espalier/agents/harness-coder.md). Mechanical: scripts/migrate-v0.5.2-to-v0.5.3.sh.
  5. v0.5.x → v0.6.0 — Stage 1 grilling: installs the espalier-grill skill, refreshes the four changed pipeline templates (which also date-prefix change folders). Mechanical: scripts/migrate-v0.5-to-v0.6.sh.
  6. v0.6.x → v0.7.0 — read-only ask lane: installs the espalier-ask skill, patches CLAUDE.md + espalier/agent.md to mention /espalier-ask. Purely additive — no pipeline change. Mechanical: scripts/migrate-v0.6-to-v0.7.sh.
  7. 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.
  8. v0.8.0 → v0.8.1 — impact-analysis agent patch: appends a ## Change Impact Analysis section to the coder sub-agent (espalier/agents/harness-coder.md) and a ## Runtime-Surface Review section 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.
  9. 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 Rounds section to harness-reviewer.md, and inserts the certificate check into pre-push-gate.sh. Mechanical: scripts/migrate-v0.8.1-to-v0.8.2.sh.
  10. v0.8.2 → v0.9.0 — security audit + production hardening (one release): a new harness-security agent joins Stage 4 as a review panel; a security-standards rule + espalier-security skill are added, and the coder/reviewer/testing/push-gate gain security sections. Ships /espalier-audit, the repo-wide audit lane (espalier-audit skill + a Repo-Audit Mode section). Adds an always-loaded production-standards rule (resilience / observability / data-safety, tiered severity) the coder writes to and the reviewer enforces; per-round VERDICT: 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 shipped scout-prompts file for prune/doctor. Creates the new per-project files, bootstrap --force refreshes 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.
  11. 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.
  12. 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 false true from a suite that couldn't run); /espalier-audit's fix handoff and /espalier-prune's unattended path key off interactivity_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.md and 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.
  13. 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.md is 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.
  14. 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-security AGENT and espalier-security SKILL 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 that bootstrap --force never re-copies, so v0.9.4 shipped these template improvements with no way to reach an existing install. Frontmatter is edited LINE-WISE (an inherit tools-mode install has had its tools: 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.
  15. 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/null and, on failure, printed BLOCKED: Build fails and 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 has run_tests but 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.
  16. 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.sh to exit 2 + stderr, gives the reviewer/security agents their record-file Write tool, and refreshes pipeline.md + the pure-copy pipeline skills so the Stage 4/6 gates read the verdict WORD (FAIL/ESCALATION_REQUIRED no longer advance as PASS), plus espalier-review/espalier-security with {project} re-substitution. Backs up to <file>.pre-v0.11.bak. Mechanical: scripts/migrate-v0.10.0-to-v0.11.0.sh.
  17. 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/ and espalier/wiki/, not just the requirement text: a new Step 1.5 surfaces a collision — an approach that violates an encoded rule (throw where the repo standardised on Result<T>), a capability the wiki already documents, an unstated downstream ripple — as a Stage 1 question citing the exact rules/<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 of espalier/skills/espalier-grill/SKILL.md. Backs up to <file>.pre-v0.12.bak. Mechanical: scripts/migrate-v0.11.0-to-v0.12.0.sh.
  18. 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's p1= 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.
  19. 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 4 max-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.
  20. 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 & Docstrings section (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's p1= 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-prune re-scouts. Backs up to <file>.pre-v0.13.2.bak. Mechanical: scripts/migrate-v0.13.1-to-v0.13.2.sh.
  21. v0.13.2 → v0.14.0 — Codex platform release. Always: refreshes the two plugin-owned hook wrappers (post-edit-wrapper.sh now parses Codex apply_patch input and resolves the repo root without $CLAUDE_PROJECT_DIR; pre-push-gate-wrapper.sh now 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.md Espalier section + platform mapping, .codex/config.toml hook block, .codex/agents/harness-*.toml sub-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.
  22. 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 camelCase toolName/toolArgs payload into the Claude/Codex tool_name/tool_input shape and dispatches to the shared wrappers; exit codes pass through — Copilot treats non-zero preToolUse exits as DENY). Optional (--with-copilot, asked in Step 4c): wires the copilot platform additively — .github/skills/ symlinks, .github/copilot-instructions.md Espalier section, .github/agents/harness-*.agent.md custom 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.
  23. v0.15.0 → v0.16.0 — multi-dev maintenance floor (Release A). Always: refreshes the pure-copy pipeline files + drift-helpers.sh (the conv_fold/conv_observations conventions 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 Commits section to the per-project espalier/rules/development-process.md; then bootstrap --wire-only appends the .gitattributes union entry for espalier/.ask-gaps.tsv, the canonical-remote/canonical-branch config 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.
  24. 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, and drift-helpers.sh (doctor_due v2 with clean/dirty shared-stamp semantics + skew rejection, doctor_stamp_shared, conv_slug, per-key append_convention) with backup-on-diff (<file>.pre-v0.17.bak). No config change, no attribute change, no data migration — espalier/conventions/ and espalier/.doctor-stamp appear on first write; the legacy .conventions.tsv is read forever, written never. Run-time assert: .doctor-stamp must not be gitignored. Mechanical: scripts/migrate-v0.16.0-to-v0.17.0.sh.
  25. v0.17.0 → v0.18.0 — map-lane release. New files: the espalier-map lane skill (multi-session planning — decision maps under espalier/maps/)
  • symlinks on every platform in espalier/.platforms, and the map-guard.sh plan-don't-do PreToolUse hook. Refreshes pipeline.md, the espalier + espalier-grill SKILL files (grill gains mode=decision) with backup-on-diff (<file>.pre-v0.18.bak). Wiring: settings.json gains the map-guard PreToolUse entry (additive), .codex/config.toml the marker-guarded ESPALIER MAP GUARD v1 block, the copilot gates json a targeted map-guard insert (never clobbered). Config: appends max-open-tickets: 9. One grep-guarded /espalier-map line lands in each platform instruction file's existing ## Espalier section. Mechanical: scripts/migrate-v0.17.0-to-v0.18.0.sh.
  1. v0.18.0 → v0.19.0 — run-lane release. New files: the espalier-maprun lane skill (batch executor for a CLEARED map — interactive master + headless stage-1–6 workers in isolated push-blocked worktrees) + symlinks on every platform in espalier/.platforms, and the run engine espalier/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. Refreshes pipeline.md and the espalier-map SKILL (handoff now names the batch executor) with backup-on-diff (<file>.pre-v0.19.bak). One grep-guarded /espalier-maprun line lands in each platform instruction file's existing ## Espalier section. No config keys, no hook wiring. Mechanical: scripts/migrate-v0.18.0-to-v0.19.0.sh.
  2. v0.19.0 → v0.20.0 — slice-PR release. Run-lane topology unchanged; the lane gains an OPT-IN forge surface (a pr key 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 file espalier/hooks/maprun-pr.sh (WRITE-IF-ABSENT). Refreshes the espalier-maprun SKILL with backup-on-diff (SKILL.md.pre-v0.20.bak). Bug fix: patches maprun-integration.sh's push block to --worktree scope (the stock v0.19 lines poisoned the SHARED .git/config, blocking the operator's own pushes), heals an already-poisoned shared remote.origin.pushurl, and re-blocks existing _integration worktrees worktree-scoped. No config keys, no hook wiring, no new symlinks. Mechanical: scripts/migrate-v0.19.0-to-v0.20.0.sh.
  3. 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 a espalier/.migrations-skipped record 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.
  4. 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.md a "Keep comments SHORT" bullet under Comments & Docstrings, and the reviewer's Readability comments: 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-skipped record, never mangled; backups at <file>.pre-v0.21.1.bak. Mechanical: scripts/migrate-v0.21.0-to-v0.21.1.sh.
  5. 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) plus espalier/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, and pre-push-gate.sh's opt-in parallel gate sections + dependency-audit cache (span-splice; bash -n verified after) + its ANCHORED certificate read (a Stage History note quoting Base-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-skipped record, never mangled. Appends espalier/.dep-audit-cache to .gitignore. Writes NO config keys: speculative-tests defaults on when absent; hook-parallel-gates absent = serial (init-time opt-in only). Mechanical: scripts/migrate-v0.21.1-to-v0.22.0.sh.
  6. 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.md gains a "Default to NO comment" bullet, and the reviewer's Readability comments: 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-skipped record; backups at <file>.pre-v0.22.1.bak. Mechanical: scripts/migrate-v0.22.0-to-v0.22.1.sh.
  7. 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_SCOPE skip hash, last-line-wins); scope detectors count non-test files only. Findings digest: FAIL rounds snapshot bracketed finding lines; charted changes write espalier/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 (grill mode=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 gains structure: 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, and pre-push-gate.sh (anchored Current Stage: read + last-match test count); customised files skip-with-record. Writes NO config keys — test-mode absent = folded, legacy speculative-tests honored at read time (off → serial). Mechanical: scripts/migrate-v0.22.1-to-v0.23.0.sh.
  8. 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 Sweep block 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.
  9. 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 from tt-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 into espalier/wiki/simplify-survey.md; selected HIGH cuts are filed as Status: FILED skeletons under espalier/changes/refactor/ (simplify_from: frontmatter) that /espalier adopts 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 Surface report); 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 a SIMPLIFICATION 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, reason simplify: …) for /espalier-prune, and points at /espalier-doctor --since <survey commit> after a batch. Retirement maps (/espalier-map retire: … (simplify-survey #n)) carry simplify_from into every slice; espalier-stats.sh gains the simplify-lane echo (simplify-filed vs hand-written refactors, withdrawn cuts, tags); /espalier-ask reads the survey page as a why source. 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 the agent.md Config 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.

Read the full file on GitHub · 1,547 lines

Changes

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.

  1. 2d ago Changed · +87 lines 6614806ab6b8
  2. 5d ago First seen · 1,460 lines · 0 tokens per session scan A 232e0efa110b

Subscribe to this mod's changes

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.

Related

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…

luckeyfaraday/codex-router · 113 tokens

gan-zhong-xue

在你干真实开发时(边干边挖:搞懂 AI 正在做的这步,掌控方向)或干完提交后(事后挖: 回头搞懂一个甩手没懂的改动),就地陪你走一轮"先让你猜、再揭示、逼到原理"的回合制, 把黑盒变成你真懂、能复述、能迁移的东西。治的是 vibe-coding 的病:交付物在增加, 理解没跟上。触发词:"干中学"、"帮我搞懂 AI 正在做的这步"、"我刚才那段没懂"、 "这个 commit 我说不清"、"帮我真正搞懂刚才做的";掌舵(任务中途):"等等这步我没懂"、 "为什么这么改"、"这步我没跟上"。 English triggers: "learning by doing", "help me actually understand what…

ly8427/gan-zhong-xue · 288 tokens

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…

cicdteam/google-go-style · 110 tokens

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…

o4f6bgpac3/concise · 92 tokens

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…

unboundinnov/specdd · 218 tokens

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.

Spielewoy/autoprompt-skill · 56 tokens