Minimizing Ty Ecosystem Changes
astral-sh/ruff
A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…
Incrementally migrate Panache's Pandoc-dialect inline parsing onto the unified inline IR (currently CommonMark-only) one bounded sub-task at a time, verifying every CST divergence against…
$ npx skills add jolars/panache --skill pandoc-ir-migrate -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jolars/panache pandoc-ir-migrate --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jolars/panache.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/pandoc-ir-migrate .claude/skills/pandoc-ir-migrate && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pandoc-ir-migrate" agent skill from https://github.com/jolars/panache/tree/main/.agents/skills/pandoc-ir-migrate into .claude/skills/pandoc-ir-migrate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pandoc-ir-migrate", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jolars/panache/tree/main/.agents/skills/pandoc-ir-migrateType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jolars/panache --skill pandoc-ir-migrate -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jolars/panache pandoc-ir-migrate --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jolars/panache.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/pandoc-ir-migrate .agents/skills/pandoc-ir-migrate && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pandoc-ir-migrate" agent skill from https://github.com/jolars/panache/tree/main/.agents/skills/pandoc-ir-migrate into .agents/skills/pandoc-ir-migrate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pandoc-ir-migrate", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jolars/panache --skill pandoc-ir-migrate -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jolars/panache pandoc-ir-migrate --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jolars/panache.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/pandoc-ir-migrate .cursor/skills/pandoc-ir-migrate && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pandoc-ir-migrate" agent skill from https://github.com/jolars/panache/tree/main/.agents/skills/pandoc-ir-migrate into .cursor/skills/pandoc-ir-migrate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pandoc-ir-migrate", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jolars/panache.git --path .agents/skills/pandoc-ir-migrate--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jolars/panache --skill pandoc-ir-migrate -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jolars/panache pandoc-ir-migrate --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jolars/panache.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/pandoc-ir-migrate .gemini/skills/pandoc-ir-migrate && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pandoc-ir-migrate" agent skill from https://github.com/jolars/panache/tree/main/.agents/skills/pandoc-ir-migrate into .gemini/skills/pandoc-ir-migrate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pandoc-ir-migrate", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jolars/panache pandoc-ir-migrateInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jolars/panache --skill pandoc-ir-migrate -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jolars/panache.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/pandoc-ir-migrate .github/skills/pandoc-ir-migrate && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pandoc-ir-migrate" agent skill from https://github.com/jolars/panache/tree/main/.agents/skills/pandoc-ir-migrate into .github/skills/pandoc-ir-migrate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pandoc-ir-migrate", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jolars/panache --skill pandoc-ir-migrate -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jolars/panache pandoc-ir-migrate --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jolars/panache.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/pandoc-ir-migrate .opencode/skills/pandoc-ir-migrate && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pandoc-ir-migrate" agent skill from https://github.com/jolars/panache/tree/main/.agents/skills/pandoc-ir-migrate into .opencode/skills/pandoc-ir-migrate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pandoc-ir-migrate", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
pandoc-ir-migrateIncrementally migrate Panache's Pandoc-dialect inline parsing onto the unified inline IR (currently CommonMark-only) one bounded sub-task at a time, verifying every CST divergence against…
Pandoc Ir Migrate is an agent skill from jolars/panache. Incrementally migrate Panache's Pandoc-dialect inline parsing onto the unified inline IR (currently CommonMark-only) one bounded sub-task at a time, verifying every CST divergence against pandoc-native before fixing or deferring.
Its SKILL.md is about 5.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `RECAP.md`).
It sits in Development, covering Linting and formatting. It works with Pandoc. The repository describes itself as: Language server, formatter, and linter for Quarto and other Markdown flavors. The licence is MIT.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit dbf4d6d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pandoccargoFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Pandoc Ir Migrate loads about 5.6k tokens when it runs. Until then it costs about 62 tokens; SKILL.md has 2,644 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from jolars/panache at commit dbf4d6d, republished under its MIT licence (© jolars). 2,644 words, ~5,610 tokens.
.claude/skills/pandoc-ir-migrate/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Use this skill when asked to advance the Pandoc-dialect inline IR migration, fix a specific Pandoc emphasis / inline regression introduced by an IR-migration step, or pick "the next best phase" to work on.
crates/panache-parser/src/parser/inlines/inline_ir.rs and its
consumers in crates/panache-parser/src/parser/inlines/core.rs. The
goal is to retire crates/panache-parser/src/parser/inlines/delimiter_stack.rs
and the legacy recursive-descent emphasis path
(try_parse_emphasis, try_parse_one/two/three,
parse_until_closer_with_nested_*) once both dialects share the IR.crates/panache-parser/tests/commonmark/allowlist.txt is the
load-bearing guard — re-run it every session.try_parse_emphasis recursive-descent path may itself diverge
from pandoc on edge cases; do NOT preserve a legacy fixture's output
when it conflicts with pandoc -f markdown -t native. See "Pandoc
vs legacy fixture trap" below.RECAP.md instead. The user has explicitly asked for
this discipline; follow it strictly.Follow the parser, integration-test, and CommonMark conformance invariants in
the repository's root AGENTS.md.
The migration is bounded by 9 phases. Pick one (or part of one) per
session. The latest phase status lives in RECAP.md.
Phase 0 — Thread Dialect through inline_ir's compute_flanking,
process_emphasis*. Stub branch points; no behavior change.
Phase 1 (keystone) — Pandoc emphasis on the IR. build_full_plans
skips process_brackets under Pandoc; build_ir recognises Pandoc
opaque constructs (math $...$, inline links, ref links, footnote
refs [^id], citations [@cite], bracketed spans [text]{attrs},
inline footnotes ^[note], native spans <span>...</span>) as
ConstructKind::PandocOpaque events so emphasis can't pair across
them. Activate dialect gates in flanking + matching + cascade. Drop
the dispatcher fork in parse_inline_text_recursive /
parse_inline_text. Widen populate_refdef_labels to both dialects.
Phase 2 — Move ^[note] and <span>...</span> recognition out
of the dispatcher's ordered-try chain in parse_inline_range_impl
into build_ir as Construct events. Pure additive; no algorithm
change.
Phase 3 — [^id] footnote refs into IR scan as
Construct::FootnoteReference.
Phase 4 — [@cite] bracketed citations + bare @cite into IR
scan as Construct::BracketedCitation / Construct::BareCitation.
Phase 5 — Bracketed spans [text]{attrs} into IR process_brackets
(first phase that changes process_brackets). Adds a new
BracketResolutionKind::BracketedSpan variant and gates
bracket_says_resolved on kind.
Phase 6 — Pandoc links/images dispatched IR-first. Originally
planned as full BracketPlan-driven dispatch with
deactivate_earlier_link_openers gated on CommonMark only; recap-(viii)
verified against pandoc-native that the gating mechanism would have
been wrong (pandoc-native does NOT allow nested links — outer wins,
inner literal — so the rule isn't "don't deactivate," it's "deactivate
inner instead of outer"). Phase 6 instead followed the Phase 2-5
ConstructPlan pattern: a new ConstructKind::PandocLinkOrImage
that drives IR-first dispatch through the dispatcher's existing
try_parse_* chain, with the legacy [/![ branches in
parse_inline_range_impl gated on Dialect::CommonMark. Pure
additive; the three pre-existing pandoc-native divergences below
are preserved and addressed in Phase 8.
Phase 7 — Delete the legacy emphasis path: try_parse_emphasis*,
try_parse_one/two/three, parse_until_closer_with_nested_*,
parse_inline_range, the recursive-descent emphasis branch in
parse_inline_range_impl. Delete the delimiter_stack module;
relocate EmphasisPlan / DelimChar / EmphasisKind into
inline_ir.rs.
Phase 8 (final) — Pandoc bracket emission on the IR's
BracketPlan. Enable process_brackets under Dialect::Pandoc
(currently CommonMark-only in build_full_plans) with two
Pandoc-aware semantic differences:
deactivate_earlier_link_openers (inner-wins). NOT a toggle of
that flag — a different rule.is_commonmark short-circuit in process_brackets's shortcut
path with refdef-map consultation for both dialects. Pandoc's
shape-only reference_resolves = true is wrong; it produces
malformed LINK nodes for unresolved shortcuts and steals inner
*/_ chars from the emphasis scanner.This fixes the three pre-existing pandoc-native divergences noted in recap-(viii):
[foo] with no refdef parses as malformed LINK → should be
literal (Str "[foo]").*foo [bar* baz] produces TEXT + partial LINK → should be all
literal (refdef miss frees the * for emphasis pairing).[link [inner](u2)](u1) allows nested LINK → should be
outer-wins with inner literal.Cleanup once Phase 8 lands: ConstructKind::PandocLinkOrImage and
its ConstructDispo variant become unused (folded into
BracketDispo::Open); the CM-gated [/![ legacy dispatcher
branches in parse_inline_range_impl either stay (as the CM
emission path) or get unified with the IR-driven path. Pandoc-
specific golden fixtures for the three bug cases land under
crates/panache-parser/tests/fixtures/cases/, verified against
pandoc -f markdown -t native.
Migration-complete invariant: after Phase 8, no Pandoc inline
construct depends on the dispatcher's try_parse_* chain for
resolution decisions. The dispatcher recognizers are still called
to parse a matched range into a CST subtree, but "what is this
byte range?" is answered exclusively by the IR. That is the
end-state of this migration.
crates/panache-parser/src/parser/inlines/inline_ir.rs — IR scan,
bracket resolution, emphasis pass; primary site for dialect
parameterization. Where most edits land.crates/panache-parser/src/parser/inlines/core.rs — dispatcher,
emission walk; ~1500 lines disappear in Phase 7.crates/panache-parser/src/parser/inlines/delimiter_stack.rs —
legacy emphasis plan builder. Exposes EmphasisPlan /
DelimChar / EmphasisKind types still used by the IR's
build_emphasis_plan. Deleted in Phase 7.crates/panache-parser/src/parser/inlines/{citations,bracketed_spans,inline_footnotes,native_spans,math,links}.rs
— try_parse_* recognizers reused by build_ir's opaque-construct
scan. Don't duplicate logic; call into them.crates/panache-parser/src/parser.rs — populate_refdef_labels
(widened to both dialects in Phase 1).crates/panache-parser/src/options.rs — Dialect, Extensions,
ParserOptions. No signature changes; consult for flag defaults.crates/panache-parser/tests/commonmark/allowlist.txt —
CommonMark conformance regression guard. Must stay green.crates/panache-parser/tests/fixtures/cases/ — parser golden
scenarios (paired CommonMark/Pandoc fixtures live here).tests/fixtures/cases/ — formatter golden scenarios (only add a
CommonMark-flavor case here when the parser change produces a
different block sequence than the Pandoc path).Every Pandoc-dialect IR migration regression falls into one of these. Classify before editing.
TEXT@0..5 "**foo" + TEXT@5..6 "*"); new IR produces
a single coalesced TEXT (TEXT@0..6 "**foo*"). Same bytes, same
structure, no STRONG/EMPHASIS/etc node difference. Benign;
snapshot update is safe after confirming the structural shape
matches pandoc-native (see "Pandoc vs legacy fixture trap"). Don't
invent a fix to preserve the split — the IR's coalescence is an
improvement, not a bug.compute_flanking / process_emphasis_in_range_filtered.build_ir doesn't recognise a
Pandoc inline construct, so emphasis pairs across its content (or
worse, the dispatcher's later parse re-claims bytes already
consumed by emphasis, breaking losslessness). Fix: add the
recognizer to build_ir under !is_commonmark, emitting
ConstructKind::PandocOpaque (or the phase-specific kind).
Losslessness is the canary — if the parser-crate suite shows
"tree text does not match input", losslessness has broken and a
missing opaque construct is the most likely cause.*foo**bar*,
**foo *bar** baz*). Fix: ensure the run is flanking-eligible
(both can_open && can_close) so pandoc_cascade_invalidate
catches it. If the cascade rule itself needs widening, do so
carefully — the trap below documents one over-broad version.**foo *bar* baz** should be
STRONG[foo, EM[bar], baz]; *foo **bar* baz** should be *foo +
STRONG[bar* baz]; ***foo **bar** baz*** should be
EM[STRONG[foo], "bar", STRONG[baz]]). Fix needs strong-first pass
preference + scoped emphasis recursion on each strong-matched
inner range. Don't try the "two-pass + un-remove-between"
shortcut — it breaks the pair-crossing invariant (see trap
below). The structurally clean approach is recursive scoped
passes in build_full_plans analogous to the bracket scoped pass
for CommonMark.RECAP.md and (if
meaningful) in crates/panache-parser/tests/commonmark/blocked.txt
or a new pandoc-equivalent file.The legacy try_parse_emphasis path is not the migration's
reference. It approximates pandoc-native but has its own bugs and
quirks. When the new IR output differs from a legacy fixture, do
NOT default to "preserve the fixture". Instead:
printf '<input>' | pandoc -f markdown -t native > /tmp/pd.txt
printf '<input>' | pandoc -f commonmark -t native > /tmp/cm.txt/tmp/pd.txt (Pandoc native) → fixture is
wrong; update the fixture (and snapshot) to the IR output. Note
the prior fixture as a legacy-parser bug in RECAP.md./tmp/pd.txt AND old fixture matched
/tmp/pd.txt → regression; fix the IR./tmp/pd.txt AND old fixture also
differed (both wrong, in different ways) → fix toward
pandoc-native; don't preserve either old behavior.Strong, Emph, Link, etc.)
match in count and nesting; if so, update the snapshot and move
on.A natural-looking but wrong attempt at "strong-first preference":
run a first pass over count >= 2 closers, mark removed[] on
between-events as usual, then un-remove them between passes so a
second pass can match nested count == 1 emphasis. This breaks
the pair-crossing invariant: in pass 2, an emphasis can pair with
an opener whose strong partner is INSIDE the emphasis's range,
producing an EM whose markers cross a STRONG's markers. The
emission walk then produces invalid CST.
Correct approach: scoped emphasis passes. After a strong match
in pass 1, run process_emphasis_in_range on the inner event range
(open_idx + 1, close_idx) WITH its own state (separate count,
source_start, removed arrays). Mirrors the bracket scoped pass
for CommonMark in build_full_plans (lines 1247-1306 of
inline_ir.rs). The state separation is the crucial bit; reusing
the outer pass's state is what causes the crossing.
The cascade rule (pandoc_cascade_invalidate) checks for
"unmatched same-ch run between matched pair". The flanking-eligibility
filter on those runs MUST be can_open && can_close (both true), not
can_open || can_close. The || version invalidates legitimate
matches when intraword _ (e.g. _foo_bar_baz_) sits between an
opener and closer; pandoc-native does pair the outer _s and treats
the inner _s as literal text inside emphasis content. The
recursive-descent path's "if inner attempt fails, outer fails"
semantics only fires when the inner construct could actually have
opened/closed — i.e. both flanking sides are eligible.
These are the dialect-aware levers in inline_ir.rs. When fixing a
regression, identify which lever applies before editing.
compute_flanking branches on Dialect:can_open = !followed_by_ws; can_close = true
(no flanking gate — pandoc-markdown's ender is count-only).
Underscore intraword hard-rule applies on top: _ adjacent to
alphanumeric on either side cannot open/close on that side.pandoc_reject opener-finder gate: rejects (1,2), (2,1), and
count_o >= 4. Verified against pandoc-native: (1,3), (3,1), (2,3),
(3,2), and any (≤3, 4+) DO match.is_commonmark; disabled under Pandoc.count[o] >= 3 && count[c] >= 3 AND !is_commonmark, consume = 1 first (emph
innermost) instead of consume = 2 (CommonMark default, strong
outermost). This produces STRONG(EM(...)) for ***x*** under
Pandoc.pandoc_cascade_invalidate: post-pass that walks resolved
matches and invalidates any pair containing an unmatched same-ch
run with both can_open && can_close. Iterates to fixed point.build_ir: under
!is_commonmark, recognises link/ref-link/image/footnote-ref/
citation/bracketed-span/inline-footnote/native-span/math forms as
ConstructKind::PandocOpaque. This is what keeps emphasis from
pairing across these constructs while emission stays on the
legacy try_parse_* chain.build_full_plans for
Dialect::Pandoc. The structural shape mirrors the existing
CommonMark bracket scoped pass (lines 1247-1306 of inline_ir.rs).RECAP.md)This skill keeps a rolling recap at
.agents/skills/pandoc-ir-migrate/RECAP.md. It is the handoff
between sessions — short, judgment-call-only, not a duplicate of the
test report.
RECAP.md first. The
"Suggested next sub-targets" section is the recommended starting
point, and the "Don't redo / known traps" list keeps you from
reinventing fixes that already landed (or already failed). If the
user named a specific phase or test cluster, prefer that, but
still skim the recap so you don't redo prior work.RECAP.md with: phase + sub-target tackled, test count
before → after (full workspace), files changed, what not to
redo, ranked next sub-targets, and any new traps discovered.
Keep it terse — a fresh session should pick up from this entry
without scrolling the prior conversation.Read RECAP.md for current phase, deferred sub-targets, and
trap list. If the user named a sub-target, prefer it; otherwise
pick the top-ranked next sub-target from the recap.
Establish the test baseline before editing:
cargo test --workspace --no-fail-fast 2>&1 | grep -E "^test " | grep "FAILED" | sort -uSave the failing-test set; this is what "no regression" means for this session.
Probe the failing inputs. For each input the sub-target touches, capture both the IR's current CST and pandoc-native:
pandoc <input>.md -f markdown -t native # primary reference
pandoc <input>.md -f commonmark -t native # only if dialect-divergentFor triage across several inputs, drop a throwaway
#[ignore]-d probe test into
crates/panache-parser/tests/probe_phase1.rs (or similar
per-phase name). Template:
use panache_parser::parse;
#[test]
#[ignore = "probe specific inputs"]
fn probe_targets() {
for input in [/* failing inputs */] {
let tree = parse(input, None);
eprintln!("=== {:?} ===\n{:#?}\n", input, tree);
}
}Run with
cargo test -p panache-parser --test probe_phase1 -- --ignored --nocapture.
Delete the probe file before finishing the session.
Classify each divergence into a failure bucket (see "Failure buckets" above). Apply the pandoc-vs-legacy-fixture trap protocol for any structural diff. TEXT-coalescence diffs are benign — confirm structure, then snapshot-update.
Pick the smallest dialect-aware lever that addresses the bucket. Resist adding a new code path when an existing dialect gate already covers the case (just turn the gate on).
Apply the change. Validate immediately:
cargo test -p panache-parser --no-fail-fast
cargo test --workspace --no-fail-fast
cargo test -p panache-parser --test commonmark commonmark_allowlistThe conformance allowlist must stay green; CommonMark behavior must not change.
Verify net change: same baseline command from step 2.
For TEXT-coalescence snapshot updates: regenerate snapshots
(find ... -name "*.snap.new" -delete and re-run tests to get
fresh .new files), then cargo insta review (or compare
.snap vs .snap.new manually) and accept only diffs that are
purely TEXT-coalescence. For each: write a one-line note in the
recap.
Update RECAP.md with the session outcome. If the session
ends mid-sub-task with regressions, capture the partial state
and rank what's left.
Commit only if the diff is clean:
RECAP.md before picking a sub-target.inline_ir.rs,
re-run the allowlist test before declaring done.RECAP.md so future
sessions don't re-walk the same wrong path.can_open || can_close (see
trap above). It must be &&.try_parse_emphasis path before
Phase 7. The dispatcher's parse_inline_range_impl still
consumes Pandoc bracket constructs through it during Phases 1-6.report.txt /
tests/commonmark/report.json by hand; they're
derived. Re-run commonmark_full_report to refresh.When done, report:
RECAP.md.If the session ends without committing, also report:
© jolars, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .agents/skills/pandoc-ir-migrate of jolars/panache.
Open the folder on GitHubat commit dbf4d6d
Pandoc Ir Migrate next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Pandoc Ir Migrate this skilljolars/panache | 237 | — | ~5.6k | Automated safety check: Pass | MIT | |
| Minimizing Ty Ecosystem Changesastral-sh/ruff | 50k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.4k | — | ~2.2k | Automated safety check: Pass | MIT | |
| Babysit PR To Pass CIsgl-project/sglang | 37k | 2 repos | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Rust Best Practicesfarm-fe/farm | 5.6k | 3 repos | ~1.1k | Automated safety check: Pass | MIT | |
| Summarise Ecosystem Resultsastral-sh/ruff | 50k | — | ~2.2k | Automated safety check: Pass | MIT |
astral-sh/ruff
A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
sgl-project/sglang
Start and persistently pursue a goal to babysit an SGLang pull request until selected GitHub Actions workflows pass on the latest PR head.
farm-fe/farm
Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.
astral-sh/ruff
A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…
chromedp/chromedp
This skill should be used when the user is writing Go code and needs guidance on Go-specific pedantry: error wrapping with fmt.Errorf and %w, interface design (accept interfaces return structs)…
jolars/panache
Add a new block-level or inline-level syntax construct to Panache's parser and formatter — confirm the pandoc-native shape first, add SyntaxKinds for every byte category, gate it behind an extension…
jolars/panache
Grow Panache's CommonMark spec conformance under Flavor::CommonMark by running every spec.txt example through the shared parser, comparing rendered HTML against the spec's expected HTML…
jolars/panache
Work on Panache's delegation of embedded code blocks to third-party formatters and linters (ruff, shfmt, shellcheck, rustfmt, ...) — add or change a preset, fix the offset mapping that translates a…
jolars/panache
Investigate panache's linter (and, secondarily, its parser) against a real-world Quarto/Markdown codebase.
jolars/panache
Implement or debug Panache's TeX math parser and formatter internals, including the lossless CST, semantic model, diagnostics, and Badness parity.
jolars/panache
Add a new built-in lint rule to the Panache linter — wire it into the registry, gate it on the right extension/flavor, add a regression fixture with focused assertions, and document it.
Works with
Categories
Incrementally migrate Panache's Pandoc-dialect inline parsing onto the unified inline IR (currently CommonMark-only) one bounded sub-task at a time, verifying every CST divergence against…. Pandoc Ir Migrate is an agent skill from jolars/panache. Incrementally migrate Panache's Pandoc-dialect inline parsing onto the unified inline IR (currently CommonMark-only) one bounded sub-task at a time, verifying every CST divergence against pandoc-native before fixing or deferring.
Pandoc Ir Migrate fits situations like: tasks that involve Linting and formatting.
Run `npx skills add jolars/panache --skill pandoc-ir-migrate -a claude-code`. Or copy the skill folder (.agents/skills/pandoc-ir-migrate in jolars/panache) into .claude/skills/pandoc-ir-migrate in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jolars/panache --skill pandoc-ir-migrate -a codex`. Or copy the skill folder (.agents/skills/pandoc-ir-migrate in jolars/panache) into .agents/skills/pandoc-ir-migrate in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jolars/panache --skill pandoc-ir-migrate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pandoc-ir-migrate, .gemini/skills/pandoc-ir-migrate, .github/skills/pandoc-ir-migrate and .opencode/skills/pandoc-ir-migrate in your project.
Going by SKILL.md and its folder, Pandoc Ir Migrate needs the command-line tools its instructions call (pandoc and cargo).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Pandoc Ir Migrate is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.6k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Pandoc Ir Migrate: Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars), Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.4k stars), Babysit PR To Pass CI (sgl-project/sglang, 37k stars) and Rust Best Practices (farm-fe/farm, 5.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jolars (a GitHub user) maintains it in jolars/panache, which has 237 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 9, 2026.
Source: jolars/panache on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.