Skip to content

track(2.0): breaking-change roadmap for the 2.x major bump #505

Closed
23 of 23 issues completed
Closed

Description

@dekobon

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:

  1. the loose ends already documented in
    STABILITY.md under "On the 2.0 horizon", and
  2. 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)

  • Mark the per-metric Stats structs #[non_exhaustive] so field
    additions stop being a strict-SemVer shape break.
  • Remove the deprecated metrics / metrics_with_options shims (in
    favour of analyze).
  • Decide the fate of the remaining #[doc(hidden)] extension traits
    (ParserTrait, the per-metric compute traits, Parser<T>, Filter):
    delete or formally expose. The hidden state is a holding pattern.
  • Land the clean metric-value re-baseline note in the 2.0
    CHANGELOG entry, folding in every value drift accumulated across 1.x
    so consumers have one diff to reason about across the major boundary.
  • FilesData / ConcurrentRunner reshape into a terminal file-set
    processor (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:

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):

Third-pass review findings (2026-06-06)

A third pre-2.0 review (focused on the SemVer-frozen surfaces that cannot be
changed after the major bump) filed #551–#562.

Core library API (2.0-gated / breaking):

Core library API (additive, bundle into the 2.0 sweep):

Metrics (re-baseline):

Output / stability contract:

Web (2.0-gated schema):

Filed without the 2.0 milestone (additive, fix anytime):

Grammars (2.0-gated default flip, tracked epic):

Release-prep follow-ups (no separate issue — handle at cut)

Acceptance

  • Every checkbox above resolved or explicitly deferred with rationale.
  • STABILITY.md "On the 2.0 horizon" section emptied/updated.
  • CHANGELOG 2.0.0 section lists every (breaking) change and the
    value re-baseline.

Activity

  1. added this to the 2.0 milestone on Jun 4, 2026
  2. dekobon commented on Jun 4, 2026

    @dekobon
    OwnerAuthor

    Filed the pre-2.0 review findings as individual issues against the 2.0
    milestone and linked them in the body above.

    Bugs worth attention regardless of the 2.0 timeline:

    The largest single win is #510 (output key-naming normalization): the
    serialized JSON is the documented-stable surface, so the inconsistent
    sum/average/min/max spellings can only be unified at the major bump.

    Review scope covered the core library API, all per-metric Stats + output
    serializers, and the CLI / web / Python crates. The Python bindings were in
    good shape — no 2.0-blocking findings there.

  3. dekobon commented on Jun 4, 2026

    @dekobon
    OwnerAuthor

    Second review wave (core AST architecture, per-language metric mirroring,
    docs/build hygiene) added the following:

    2.0-gated: #520 (Checker trait reshape — the biggest "add-a-language"
    ergonomics win).

    Bugs / fixes that should land pre-2.0 (not breaking):

    Perf (whole-repo hot path): #521 (has_sibling cursor alloc, the same
    #217 pattern, missed), #522 (Elixir double source-scan per node).

    Robustness/hygiene: #523 (children() iterator length/data desync),
    #525 (drop num meta-crate), #526 (stale supported-languages lists).

    The per-language modules are otherwise unusually well-mirrored — a
    dedicated cross-language parity suite already guards ternary/safe-nav/
    boolean-sequence/receiver-exclusion handling. The only genuine divergence
    found was the Groovy closure gap (#519).

  4. dekobon commented on Jun 4, 2026

    @dekobon
    OwnerAuthor

    Batch progress update — the following findings landed on main (fast-forward merge of fix/batch-2026-06-03, rebased atop the #510/#511 key-normalization; fmt + clippy --all-features + cargo test --workspace --all-features all green before merge) and are now closed:

    Issue Commit
    #506 — guess_language → &'static str fbdcec78
    #508 — LANG Display/FromStr/Hash e0ba5fe1
    #514 — diff/check metric-name spelling 498d92da
    #515 — web content-type essence match ad152f42
    #521 — has_sibling TreeCursor alloc 0d8564a7
    #522 — Elixir lazy space-kind scan 6c74dfd6
    #523 — children() cursor termination f6823957
    #524 — kotlin-ng exact-pin + lockstep guard 830eae90
    #525 — drop num; hoist csv/tempfile e48e79ab
    #526 — stale supported-languages docs 4bc19af0

    (#510 / #511 — the metric-key normalization — landed earlier in 1d0606e9 and were already closed.)

    Still open: #507, #509, #512, #513, #516, #517, #518, #519, #520.

  5. dekobon commented on Jun 5, 2026

    @dekobon
    OwnerAuthor

    Second-pass pre-2.0 review complete (2026-06-05). Fanned out across six
    surfaces — public Rust API, serialized output schema, CLI grammar, REST API,
    Python bindings, and cross-language metrics — explicitly excluding the
    already-filed #506–#526 findings. Filed 15 new issues (#529–#543), all linked
    in the body's Second-pass review findings section.

    Headline items:

    Each issue carries file:line evidence; the public-API and integer-as-float
    claims were spot-checked against main, and #529 was reproduced with bca metrics. The Python surface and the web /v1 routing came out otherwise clean
    (no bugs); their findings are mostly contract-documentation and one breaking
    default.

  6. dekobon commented on Jun 7, 2026

    @dekobon
    OwnerAuthor

    Third-pass pre-2.0 review (2026-06-06). Ran a fresh review focused on the
    SemVer-frozen surfaces that cannot be fixed after the major bump. Filed
    #551–#562; body updated with a "Third-pass review findings" section.

    Highest-leverage (breaking-to-add-later — must land at 2.0):

    Bugs found (reproduced):

    Plus a consolidated stability-contract issue (#559) covering the output formats
    (CSV/SARIF/code-climate/AST) that are public + serialized but not in
    STABILITY.md, and additive parity/doc items (#552, #560, #561, #562).

    Two release-prep follow-ups (no separate issue, noted in the body): the
    STABILITY.md 1.x-vs-2.0 tense inconsistency and the missing ## [2.0.0]
    CHANGELOG section + the #510/#511 key map it promises.

    Scope note: deliberately did not file marginal additive nice-to-haves
    (/v1/metrics endpoint, BCA_LOG env var, analyze(language=) kwarg,
    MetricSet bitwise ops) or items the closed issues already settled (the Python
    str-vs-StrEnum surface is intentional per #542's recorded decision; the
    --format value-vocabulary divergence is documented per #513).

  7. dekobon commented on Jun 7, 2026

    @dekobon
    OwnerAuthor

    Progress check — 2026-06-06

    All filed review-finding sub-issues are resolved. #506–#562 are
    closed and landed on main; #505 is now the only open issue in the
    2.0 milestone. Ticked every - [ ] #NNN review-finding checkbox
    in the body accordingly.

    The 35 (breaking) entries each sit in CHANGELOG [Unreleased],
    flagged "deferred to 2.0", with the release-prep commit slated to
    move them into the 2.0.0 section.

    Deliberately left unticked — this is the at-cut release-prep

    The implementation work is done, but #505's own acceptance criteria
    require the release cut itself, which has not happened (2.0 is not
    scheduled):

    Recommendation

    Keep open. #505 is a release-gate checklist, not a work-tracker —
    the remaining boxes are the cut (flip STABILITY.md to 2.0.0, stage
    the 2.0.0 CHANGELOG section with the key map + re-baseline, move the
    (breaking) entries across). Closing now would orphan the one
    checklist that fires when 2.0 is actually cut. Close this as part of
    the 2.0 release-prep commit.

  8. dekobon commented on Jun 7, 2026

    @dekobon
    OwnerAuthor

    Trait/shim checkboxes — scoped into an execution epic (#566)

    The two open #505 loose ends — "Remove the deprecated shims" and "Decide
    the fate of the remaining #[doc(hidden)] extension traits" — turned out
    to be one coupled body of work, now planned in #566 and broken into
    four landable waves:

    Resolution of "delete or formally expose": delete from the public
    surface
    — the traits survive as private AstInner machinery and Ast
    becomes the single documented analysis seam. (Filter in the original
    list is a struct, not a trait — no action.) #256 already closed having
    parked these as the doc-hidden holding pattern; #566 is the deliberate
    exit from it. No metric re-baseline — output is byte-identical.

  9. dekobon commented on Jun 7, 2026

    @dekobon
    OwnerAuthor

    Update: the Ast-seam unification epic #566 is complete and closed (all of #567–#572 landed on main, verified green). That resolves the two open trait/shim loose ends tracked here (deprecated shims removed; #[doc(hidden)] extension traits resolved as demote to pub(crate), with Ast the single public analysis seam).

    #505 still cannot close: the remaining work is the 2.0 release cut itself — flip STABILITY.md to 2.0.0, author the ## [2.0.0] CHANGELOG section (moving the (breaking, deferred to 2.0) entries, now including #570's), bump the crate version, and the value re-baseline. None of this series is pushed yet either. These are the at-cut steps; #505 closes as part of that release-prep commit.

  10. dekobon commented on Jun 7, 2026

    @dekobon
    OwnerAuthor

    Partial progress on the STABILITY.md release-prep item: the API-reference reconciliation is now done on main (the deleted action/Callback/parser-generic fns/path-positional shims and the demoted ParserTrait/Parser/<Lang>*/compute traits are described in past-tense "removed / demoted to pub(crate) at 2.0" throughout — commit 4e03f135). What remains for the at-cut commit is narrower: flip the header 1.x/1.1.0 → 2.0.0, bump the crate version, and the value re-baseline + ## [2.0.0] CHANGELOG section.

  11. dekobon commented on Jun 9, 2026

    @dekobon
    OwnerAuthor

    Added #584 (decide vcs::Options exhaustiveness / builder before 2.0) to the Core library API checklist. Surfaced during the #576 file-type-scoping review: Options keeps gaining public fields, and once the VCS surface ships under SemVer each additive field is a breaking change for external constructors. Not a defect today — forward-looking for the 2.x bump.

  12. 27 remaining items

  13. dekobon commented on Jun 11, 2026

    @dekobon
    OwnerAuthor

    Status: all milestone-2.0 issues implemented on local feat/2.0 (pending review/merge)

    The full milestone-2.0 issue set has been implemented in one batched effort
    on a local feat/2.0 integration branch (off main, not yet pushed),
    in seven dependency-ordered waves. Each wave was followed by a four-skill
    quality pass (simplify / optimize / audit-tests / code-review) with findings
    remediated before commit.

    Wave Issues
    1 — lib accessor vocabulary #588
    2 — wire / output shape #589 #590 #674 #684 #635
    3 — CLI surface #597 #651 #659 #661 #663 #666 #669 #683 #688 #690 #691 #692 #662 #603
    4 — web REST schema #631 #633 #636 #654 #638 #637
    5 — Python bindings #612 #614 #664 #667 #670 #682 #658
    6 — report presentation #677 #687 #685 #678 #679 #675 #668 #689 #686 #680 #592
    7 — docs / gates #656 #660 #673 (+ a new make py-stubtest gate)

    The branch passes the full local gate: the cargo trio, cargo doc -D warnings, self-scan at both tiers, snapshot-anchors, man-page drift, the
    markdown/TOML/Makefile lints, and the Python pytest / mypy --strict /
    pyright / stubtest / ruff stages. The big-code-analysis-output
    submodule carries one matching local snapshot commit.

    Remaining (release-cut, intentionally deferred)

    Per the "release-prep follow-ups" in this issue, the following are left for
    the deliberate 2.0 cut and are not done on this branch:

    Close this tracker (and the child issues) once feat/2.0 is reviewed,
    merged, and the release is cut.

  14. dekobon commented on Jun 12, 2026

    @dekobon
    OwnerAuthor

    Added a new 2.0-gated child: #718 — default C/C++ parsing to upstream
    tree-sitter-cpp (=0.23.4, the exact base mozcpp already inherits) and a
    new upstream-tree-sitter-c-backed LANG::C, with the vendored mozcpp
    fork demoted to an opt-in feature — the same shape #507 gave
    JavaScript/Mozjs. Children: #719 (empirical go/no-go measurement), #720
    (Cpp flip + mozcpp opt-in), #721 (C language), #723 (post-flip cleanup).
    Related but not 2.0-gated: #724 (ObjC .m/.mm misrouting).

    Unlike the zero-drift JS flip, this one expects metric drift and an
    integration-submodule re-baseline (mozcpp's primitive_type/
    class_specifier overrides; .c re-routing) — #719 scopes it before any
    code moves.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions