Summary
Tracking issue for the 2.x major bump. A major bump is the only SemVer
window in which the breaking changes below may land. This collects:
- the loose ends already documented in
STABILITY.md under "On the 2.0 horizon", and
- additional candidates surfaced by a pre-2.0 project review (linked under
Review findings below).
2.0 is not scheduled; this is the staging ground so nothing is forgotten
when it is cut. All issues here are filed against the 2.0 milestone.
Known loose ends (from STABILITY.md)
Review findings (filed separately)
Core library API:
Core architecture (2.0-gated):
Metrics & output:
CLI:
Web (not strictly 2.0-gated — schema/HTTP, not library SemVer):
Filed without the 2.0 milestone (fix anytime — not breaking):
Second-pass review findings (2026-06-05)
A fresh pre-2.0 review across the public Rust API, serialized output schema,
CLI grammar, REST surface, Python bindings, and cross-language metrics surfaced
the following, none overlapping the items above. All filed against the 2.0
milestone except where noted additive.
Bug (fix before the 2.0 re-baseline so values fold in cleanly):
Serialized output schema:
Core library API:
CLI:
Web & Python (published surfaces, newly represented here):
Acceptance
Summary
Tracking issue for the 2.x major bump. A major bump is the only SemVer
window in which the breaking changes below may land. This collects:
STABILITY.mdunder "On the 2.0 horizon", andReview findings below).
2.0is not scheduled; this is the staging ground so nothing is forgottenwhen it is cut. All issues here are filed against the 2.0 milestone.
Known loose ends (from STABILITY.md)
Statsstructs#[non_exhaustive]so fieldadditions stop being a strict-SemVer shape break.
metrics/metrics_with_optionsshims (infavour of
analyze).#[doc(hidden)]extension traits(
ParserTrait, the per-metric compute traits,Parser<T>,Filter):delete or formally expose. The hidden state is a holding pattern.
2.0CHANGELOG entry, folding in every value drift accumulated across
1.xso consumers have one diff to reason about across the major boundary.
FilesData/ConcurrentRunnerreshape into a terminal file-setprocessor (refactor(cli): single anchored walk seam — library globsets are dead and files are double-stat'd after #489 #495 — already closed; confirm it is reflected at 2.0).
Review findings (filed separately)
Core library API:
guess_languagereturns an unbound-lifetime&'a str(latentunsoundness; tighten to
&'static stror drop the tuple element) (bug) — ✅ landed onmain&LANG-by-value and drop Java-styleget_getterprefixes across
LANG/LanguageInfo/ParserTraitDisplay/FromStr/HashforLANG— ✅ landed onmainget_ops/metrics_from_treestill key identity off a lossypath; add a
Source-based seam and deprecate the path-positional formCore architecture (2.0-gated):
Checkertrait: default bodies for trivialpredicates (kills per-language stub boilerplate),
is_primitive(&Node)instead of
is_primitive(u16), narrowcount_specific_ancestors'sbound from
ParserTraittoCheckerMetrics & output:
Stats(sum/average/min/max scheme; misleading
nom.functions/nargs.total_functions; npa/npmaverage-as-ratio; abc magnitudeasymmetry;
serialize_structnames)n1/N1/n2/N2case-only-distinct keys collide forcase-insensitive consumers (CSV/env) (bug)
denominator convention (re-baseline)
CLI:
positional,
-Ovs--format, enum consolidation)diff --metricandcheck --threshold— ✅ landed onmain--ls/--ledescriptive long names; reconsiderglobalWeb (not strictly 2.0-gated — schema/HTTP, not library SemVer):
/v1) before 2.0; revisitOption-in-200-body error idiomFiled without the 2.0 milestone (fix anytime — not breaking):
application/json; charset=utf-8(silent 404) (bug) — closed, landed on
maineprintln!web error logging withtracing/lognesting (cross-language parity violation; metric fix, lands pre-2.0)
Node::has_siblingallocates aTreeCursorper call on theJS/TS hot path — closed, landed on
mainselection — closed, landed on
mainNode::children()iterator desyncs length from data (latentdup-yield) — closed, landed on
maintree-sitter-kotlin-ng; CI-guardenums/grammar-pinlockstep (dependencies) — closed, landed on
mainnummeta-crate; hoistcsv/tempfileto workspace deps(dependencies) — closed, landed on
mainC/Mozcpp; deb/rpm omit5 langs) (documentation) — closed, landed on
mainSecond-pass review findings (2026-06-05)
A fresh pre-2.0 review across the public Rust API, serialized output schema,
CLI grammar, REST surface, Python bindings, and cross-language metrics surfaced
the following, none overlapping the items above. All filed against the 2.0
milestone except where noted additive.
Bug (fix before the 2.0 re-baseline so values fold in cleanly):
else ifform #529 — (bug) PHP cognitive double-counts the two-wordelse ifform(5.0 vs the correct 3.0; isolated to cognitive)
Serialized output schema:
f64and serialize as floats(
"sloc":5.0); four formats disagree; CBOR bloatNaN/Inf→silent JSONnull) or precisionpolicy at the serialize boundary
Deserializeon the serialization-root types (thelibrary can't read its own output)
AstNodedump key casing (Type/TextValue/…); namethe
Span4-tuplede-risks refactor(output): serialize integer-valued metrics as integers, not f64 #530/refactor(output): uniform non-finite & precision policy at the serialize boundary #531)
Core library API:
pubfields(
Source/MetricsOptions/MetricsCfg)Cursoris dead public surface;Callback/LanguageInforequire a doc-hiddenParserTrait)MetricsErrorvariants, exit/nexits triple-spelling,FunctionSpanname: Option<String>CountCfg/FindCfgleakArc<Mutex<…>>/Arc<[String]>(companion to the refactor(cli): single anchored walk seam — library globsets are dead and files are double-stat'd after #489 #495 reshape)
CLI:
--output/--strip-prefixon the diff family)--paths-fromunion vsmanifest replace)
Web & Python (published surfaces, newly represented here):
/metricslanguageemits non-lookup display names(
c/c++,c#) that disagree with the Python surfaceendpoints
stability contract (name-lock before first PyPI publish;
analyze_batchdefault polarity)
Acceptance
STABILITY.md"On the 2.0 horizon" section emptied/updated.2.0.0section lists every(breaking)change and thevalue re-baseline.