Feature Status Tracker

Single source of truth for the state of every yqr-fNNN feature spec. Update this file in the same change that advances a feature (CLAUDE.md rule 17).

Status legend: Draft · In Progress · Done · Superseded · Historical

Epic: jq-style YAML processor (f001)

FeatureTitleStatus
f001yqr: a Swiss Army knife for YAML (M0 foundation)In Progress (M0 done; M1+ open)

Progress: M0 foundation landed (lexer/parser/eval/CLI, tests, CI); M1-M4 open.

Epic: Fidelity-first architecture (a001)

FeatureTitleStatus
f002Fidelity read floor (FidelityEngine seam + noyalib backend)Done
f003Fidelity backend A (rust-yaml fork RoundTripDocument adapter)Superseded (yqr-m005)
f004Engine parity: both backends default-on and runtime-switchable, from the zoosky forksSuperseded (yqr-m005)
f005Decouple byte/comment preservation from backend selection (--preserve)Superseded (yqr-f009)
f009Byte fidelity by default; classic pipeline behind --normalizeDone
f011Remove --engine: noyalib is the only engineDone

Progress: the FidelityEngine seam + the noyalib CST backend shipped (f002). The rust-yaml fork backend (f003) and the two-engine parity/runtime-switch story (f004) were superseded when yqr consolidated on noyalib as its sole YAML engine (yqr-m005) — removing the rust-yaml dependencies and unblocking the crates.io publish. noyalib round-trips the b001 corpus byte-for-byte. The byte-preserving read first shipped as an opt-in --preserve flag, with --engine reduced to backend selection (f005, v0.3.0); it then became the default read — the classic pipeline moved behind --normalize and --preserve was removed (f009), closing the lossy-default bug b001. Finally the --engine flag and the BackendId runtime seam were removed outright (f011): noyalib is yqr’s one and only engine, and the skald placeholder is retired.

Epic: Fidelity write tier (f006–f008)

Surgical, provably-lossless edits — change only the bytes the filter targets, leave every other byte untouched, or refuse. yqr’s differentiating niche (jq is JSON-only; yq’s edits admit whitespace issues). Split into three features by dependency/release timing.

FeatureTitleStatus
f006Write tier v1: value assignment and in-place edits (--in-place)Done
f007Write tier: structural edits (the b004 gaps)In Progress (structural delete shipped; comment/rename/reorder deferred)
f008Write tier: computed updates (|=)Draft (stub — gated on f001 M2)
f013Adopt noyalib 0.0.18: pin bump and the released CST mutation APIDone

Progress: f006 shipped on noyalib 0.0.14’s first-class, re-parse-guarded mutators (set_value/insert_entry/push_back/remove) — =, +=, new-key assign, del, scalar-literal / path RHS, and atomic -i, all through the fidelity write seam (src/fidelity/write.rs), zero upstream work. f007 landed its first slice: structural delete of multi-line / nested block entries via replace_span (src/fidelity/write/delete.rs) behind a re-parse integrity guard yqr enforces itself (b004 2.4/2.5), sole-entry and flow deletes refused. The remaining f007 gaps (comment editing, key rename, sequence reorder) each need new grammar and stay deferred — the upstream APIs for all three exist, released in noyalib 0.0.18, so what is missing is yqr’s grammar, not the backend. f013 done: the pin is 0.0.18, the lockfile moved that one crate and nothing else, cargo audit is clean, and both fidelity harnesses passed untouched. Its one code change was to stop calling upstream remove — on the bump it started accepting the shapes it used to refuse and promptly failed four delete tests, including one divergence b004 §6.1 had missed (it swallows a following sibling’s comment). So delete stays yqr’s own path by decision, renamed delete_entry and no longer framed as a fallback (f007 §5.1). Also settled: key_span does not replace validate’s green-tree walk. f008 (|= computed updates) is gated on f001 M2 (arithmetic/builtins). Priority order: f006 (done) → f007 delete (done) → f013 (done) → f007 remainder → M2 → f008.

Epic: Editing-loop tooling (f012)

FeatureTitleStatus
f012yqr validate: actionable YAML correctness checking (rustc-style diagnostics, exit 0/1/5, --strict)Done

Progress: shipped, then hardened by a full-branch code review (15 confirmed findings, all fixed). yqr’s first subcommand parses every document, re-asserts the a001 byte-tiling invariant, and reports rustc-style diagnostics (error[Ynnn], --> file:line:col, source window, help) that humans and agents can act on; exit codes 0/1/5, highest wins across inputs; stdin explicit (-), empty file lists a loud usage error. --strict walks the lossless green tree and reports every duplicate key — merge keys included — with both occurrences’ positions; collisions report as Y102 in the default checks, non-UTF-8 input as Y003. Conflict-marker files are recognized whole-file and anchored at the first marker. Rendering is hand-rolled — no new dependencies. The sized schema follow-up (--schema) stays open in the spec’s §5.1.

Epic: Project website (f010)

FeatureTitleStatus
f010Accent CMS website over docs/ and specs/, deployed to GitHub PagesDone

Progress: the site builds from docs/ (the home page is a real CMS page: original hand-authored markup in content/index.md with the design as a dedicated home template, framed by the theme header and footer) with specs/ mounted at /specs, using the vendored Accent default theme restyled with the home page’s design tokens. pages.yml fetches the pinned accent binary (>= v0.23.0, native sub-path support) from the upstream GitHub release, builds with the /yqr prefix derived from the base URL, and deploys to gh-pages while preserving the benchmark dashboard.

Summary

  • Total features: 13
  • Draft: 1 (f008 — computed updates, gated on f001 M2)
  • In Progress: 2 (f001 M0; f007 — structural delete shipped, rest deferred)
  • Done: 7 (f002, f006, f009, f010, f011, f012, f013)
  • Superseded: 3 (f003, f004 — single-engine consolidation, yqr-m005; f005 — fidelity-by-default flip, yqr-f009)
  • Released in v0.3.0: f002 (fidelity engine) and f005 (--preserve, later superseded by f009 which makes fidelity the default)
  • Released in v0.4.0: f006 (write tier — assignment, +=, new-key, del, -i), f007 (structural-delete slice), and f009 (fidelity by default; --normalize replaces --preserve)