Claude-skill-registry jit-overview
Orientation to facet-format JIT deserialization (tiering, fallbacks, key types/entry points) and where to look when changing or debugging JIT code
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/jit-overview" ~/.claude/skills/majiayu000-claude-skill-registry-jit-overview && rm -rf "$T"
manifest:
skills/data/jit-overview/SKILL.mdsource content
JIT deserialization overview (facet-format)
Facet’s JIT lives in
facet-format and is used by format crates like facet-json.
When to read this
- You’re touching anything under
or enabling thefacet-format/src/jit/
feature.jit - You’re investigating performance changes in deserialization (especially “tier2”/JIT benchmarks).
- You’re debugging a JIT crash (SIGSEGV/UB-ish symptoms).
Mental model
facet-format defines a format-neutral deserialization pipeline:
- A
(implemented by each format crate) produces a stream ofFormatParser
s.ParseEvent - A shape-driven layer consumes those events and writes to an output value (often via
).facet-reflect
The JIT accelerates this by compiling deserialization code specialized for:
- the target type (
/ itsT
), and sometimesShape - the format parser (
).P
Two-tier architecture (high level)
Tier 1 (shape JIT)
- Compiles code that consumes
s and writes directly into the output’s memory at known offsets.ParseEvent - Works with any format that implements
(JSON/YAML/TOML/…).FormatParser
Tier 2 (format JIT)
- For the “entire input slice is available” case, a format crate can provide a
+FormatJitParser
implementation.JitFormat - Tier 2 emits Cranelift IR to parse bytes directly, bypassing the
stream for maximum throughput.ParseEvent
Fallbacks are part of the design
- Tier 2 may return “unsupported” for shapes/input it can’t handle, and must be side-effect-free in that case.
- Callers typically try tier 2, then tier 1, then reflection.
Entry points & where to look
- Main docs and contracts:
facet-format/src/jit/mod.rs - JIT-enabled parser trait:
(facet-format/src/parser.rs
)FormatJitParser - JIT usage in a format crate:
featurefacet-json/Cargo.tomljit = ["facet-format/jit"]- Example:
(requiresfacet-json/examples/profile_jit_vec
)jit
- Windows crash debugging notes:
.claude/skills/windbg-jit.md - Memory debugging:
(uses nextest profiles).claude/skills/debug-with-valgrind/SKILL.md
Debugging checklist (practical)
- Reproduce with a minimal type + input (see
)..claude/skills/reproduce-reduce-regress/SKILL.md - Run the failing test under:
- valgrind:
(configured incargo nextest run --profile valgrind …
).config/nextest.toml - or Miri when applicable (
) for UB/provenance issues outside the JIT itself.just miri
- valgrind:
- If the crash is in JIT codegen/execution:
- Prefer isolating the smallest shape that triggers tier selection and failure.
- Look for tier selection diagnostics and caching behavior in
.facet-format/src/jit/mod.rs
Common pitfalls
- Assuming tier 2 supports “all shapes”: it intentionally supports a performance-focused subset.
- Forgetting that “unsupported” must not advance the parser cursor or partially initialize output.
- Introducing new unsafe paths without tests that exercise drop/cleanup on error paths.