espalier-migrate

espalier-migrate is a skill for Claude Code from Junhanliu-dev/espalier-engineering. It costs 0 tokens per session (42,818 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 Code

Written for Claude Code: $CLAUDE_PROJECT_DIR variable. Also seen: reads .claude/ paths; mentions CLAUDE.md; mentions subagents.

Needs its repository: it runs a file that does not travel with it, so clone the repository first. The line is bash espalier/hooks/espalier-outside.sh commit "$(git rev-parse --show-toplevel)" \.

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

Good fit Use it to upgrade an existing installation, rename its directories and skills, and apply version-specific maintenance changes.

Compare 6 skills from other repositories ↓
Install

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.

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

Made for: Claude Code.

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/github.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/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.

agentmods 80×15 button for espalier-migrate

Your own site · 80×15
<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>
Per session 0 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 42,818 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe. Third-party audits
  • NVIDIA SkillSpector warn 7 Sept 2026
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.
How audits are shown
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.42818
Opus 5.5 $0.00000 $0.17127
Sonnet 5.5 $0.00000 $0.08564
Haiku 4.5 $0.00000 $0.04282

Measured 4d ago against content hash c66fa6e47b1d, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, 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 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.

skills/espalier-migrate/SKILL.md · 2,011 lines

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/ 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 FORTY-ONE 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.0 — harness/ → espalier/ directory + skill rename (harness-run → espalier, 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.
  10. 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 ## Handoff block whose Facts carry path:line, sentinel - HANDOFF: true; the orchestrator archives the report and re-spawns a fresh coder with a CONTINUATION: 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), the docs: tag; the security agent the reading lines + Read-tool evidence. The orchestrator (espalier + fix SKILLs, pure-copy): sentinel → archive (report_archive into coding-log/, so coding-report.md is always the CURRENT spawn's report) → exit_gate (build + lint concurrent, scoped tests, from the installed pre-push gate's own run_* bodies; exit 2 / 3 = by hand as before) → continuation; the context pack gains - Facts established:, - Grep-only: (grep_only_files, from the new grep-only-paths: config key) and - Scoped docs: (scoped_docs); contract_extract writes security-contract.md for 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 a RESUMED row on resumption; req_shape_check prints requirement headings outside the contract set (information only). Requirements are contract + notes (requirements-notes.md; the ≤ 5 files rule 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, doctor contract drift line (contract_drift_lines), ## Not Precedent anchor in engineering-structure.md refreshed from scout 1.2's not_precedent array. espalier-stats.sh gains spawn shape + workspace docs; maprun.py parses stage names by a literal ### N. (the 8.5 heading no longer overwrites stage 8) with fallback labels. Refreshes 15 pure copies (backups .pre-v0.25.bak, gitignored as *.pre-v0.*.bak from 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); appends grep-only-paths:; prints report-only lines (requirement shape per IN_PROGRESS change, rules contract drift) and edits no rule or requirement. The /espalier skill becomes a ROUTER: each stage's procedure is a pure-copy file under espalier/skills/espalier/stages/ (1-2-requirements, 3-coding, 4-panel, 5-6-contract, 7-10-delivery) read at stage entry; pipeline.md becomes 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 per development-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 in Base-Ref..HEAD; the reviewer's advisory commits: tag; the fix lane's late-escalation revert covers the range; development-process.md gains 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 as unverified: 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 an unverified: 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 64 context-helpers, 65 spawn-protocols, 66 stage-procedures; totals 56 / 61 / 66 by platform set. Mechanical: scripts/migrate-v0.24.0-to-v0.25.0.sh.
  1. 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 carry covered_by: {path:lines} | none, a routing fact: the orchestrator's Stage 5 runs contract_gaps and 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 (a covered_by that 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 in drift-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_gate scopes a multi-workspace run_tests body ((cd WS && CMD) || return 1 per line) and uv 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: yes stays the three-way opt-in). espalier-stats.sh reports 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 67 turn-economy-helpers, 68 contract-coverage; totals 58 / 63 / 68 by platform set. Mechanical: scripts/migrate-v0.25.1-to-v0.26.0.sh.
  2. 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, the path:line contradiction, 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_append records it as ratified) or rewords the criterion, a fresh coder continues with RESOLUTION: (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 presents delivery-brief.md (delivery_brief — assembled from the records, never authored) and offers a quiz (interactive only); Completion copies the deviations to requirements-notes.md ## Settled for next time. The grill takes familiarity: 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 at full tier, and records an undecided APPROACH under ## Open Questions with a /espalier-map pointer 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.sh reports 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 69 unknowns-channel; totals 59 / 64 / 69 by platform set. Mechanical: scripts/migrate-v0.26.0-to-v0.27.0.sh.

Read the full file on GitHub · 2,011 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. 4d ago Changed · +64 lines c66fa6e47b1d
  2. 6d ago Changed · +43 lines 571a3eb46bdd
  3. 1mo ago Changed · +212 lines deff9ea18b6d
  4. 1mo ago Changed · +145 lines 8b4ee7fcd9c3
  5. 1mo ago Changed · +87 lines 6614806ab6b8
  6. 1mo 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 (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.