Skip to main content
classify_file assigns an initial tier from the path. is_parseable checks semantic-parser availability. Code/data/markup parser failure or analysis limits fall directly to raw lines. Numbered tiers describe abstraction levels, not a mandatory parser cascade. Data parsing is format-directed. Scalar type changes, nested YAML edits, and non-label HTML attribute changes remain visible. Original byte comparisons preserve binary differences that text decoding could erase. See the tier reference for Rust APIs and pipeline for fallback details.

Structured data: change one setting

The four-space nesting is preserved. The output names the containing object and the changed key; data ranges are synthetic tree ranges, not source offsets.

Markup: change an attribute

The text and title stay the same. The href value changes even though it is not the element’s label. The > inside a quoted attribute remains part of its value.

Prose: edit a word

A paragraph that changes can produce word actions. Identical paragraphs can also move within a document. This handling applies to prose inputs, including .txt and .log files.

Markdown: keep line structure

The same wording change in Markdown is a line edit. Markdown formatting and code blocks are not parsed as an embedded programming language.

Binary: changed bytes of the same length

For binary data, equal lengths do not imply equal contents. You can reproduce a three-byte comparison with:
The default binary description reports lengths. Use JSON to detect the Update action; the length text alone does not explain which byte changed. Format-specific plugins can provide more detail through the Rust library API.

Add an adapter

Choose an existing tier when it fits the format. Build a validated tree through TreeBuilder and add routing in crates/differens-tiers/src/router.rs; raw/prose adapters may use the shared sequence engine. Keep parser errors visible as line fallbacks. See contributing and the tiers API for the extension points.