Status: Planned
Feature flags affected: burn-llm, burn-llm-gpu
Current state: Entry points (BurnEvaluator::from_dir, BurnEvaluatorBuilder::build) return an error pointing here. Underlying model code is preserved for reference.
The Burn-based local inference backend hit two blockers during real-model testing:
-
Qwen3.5-0.8B — tensor shape crash.
The HuggingFace checkpoint (Qwen3_5ForConditionalGeneration) is a multimodal VL model. Our Burn code does not implement output-gated attention (attn_output_gate: true), multi-dimensional RoPE (mrope_interleaved: true,mrope_section: [11,11,10]), or the resulting larger head dimensions. A broadcast bug in the DeltaNet recurrence is also exposed at real model dimensions. -
Nemotron-3-Nano-4B — impractical CPU speed.
The NdArray CPU backend with no KV cache requires a full 42-layer forward pass per token over a 3136-dim embedding space. Generation is measured in hours per response.
Implementing the missing features in Burn would take weeks of work to reach a point that candle already covers, and Burn's wgpu/Metal path uses generic shaders rather than MLX/Metal Performance Shaders, so Apple Silicon performance would still lag.
Replace burn_evaluator.rs and the engine/burn_model/ subtree with a candle-based implementation:
- Target models: Qwen3.5 (text-only checkpoint, not VL) and Nemotron-3-Nano-4B
- Backend: candle with Metal support for Apple Silicon; CUDA for Linux GPU
- KV cache: required for Nemotron to be practical
- Tokenizer: HuggingFace
tokenizerscrate (already a dependency) - Feature flags: reuse
burn-llm/burn-llm-gpunames (rename semantics, not API surface) - Public API:
BurnEvaluatorandBurnEvaluatorBuilderstay; internals replace Burn with candle - Fixture tests: restore
fixture_load_and_evaluate/builder_cpu_default/fixture_load_and_evaluate_nemotrononce the wall-off guard is removed
- candle repo: https://github.com/huggingface/candle
- candle Qwen example:
candle-examples/examples/qwen/ - Phase 5 bug notes:
tasks/todo.md→ "Phase 5 Known Bugs" - Existing Burn model code:
syara/src/engine/burn_model/(kept for reference)
Status: Deferred
Shipped: 2026-04-22 — #pattern count operators, comparisons (== != < <= > >=), +/- arithmetic.
Items below are known YARA-X parity gaps not yet implemented. None are blocking real rule authorship today; add as rule corpus demand appears.
- Arithmetic
*///%. The*token currently serves as the set-wildcard sigil insideany of ($prefix*). Adding multiplication needs parse-context disambiguation (the wildcard is always inside a(-delimited set, the operator always between two integer expressions, but the grammar currently does not carry that context). Workaround: rewrite#a * 2 >= bas(#a + #a) >= bor split into two comparisons. @pattern[i](offset of the i-th occurrence). Returns the byte offset at which the i-th match ofpatternstarts. 1-indexed. Needs a new subscript grammar and widerMatchDetail.start_posplumbing (alreadyOption<usize>).!pattern[i](length of the i-th occurrence). Companion to@. NeedsMatchDetail.end_pos - start_pos.- Integer size suffixes (
KB,MB, etc.). YARA lets you write100KBas102400. Lexer-level; trivial when a rule actually wants it. not not x. Current grammar rejects chainednot. YARA-X allows it; parens (not (not x)) work as a workaround.
#identifier on a similarity / classifier / llm / phash rule has a ceiling of 1 — those matchers produce vec![detail] or vec![] per rule invocation, not one entry per "occurrence". #llm1 >= 1 is still meaningful ("did the LLM fire"), but #classifier1 >= 3 can never be true. If a matcher changes its emission cardinality (e.g. chunk-level classifier results expanded into one detail per positive chunk), revisit the documentation.