C Line\scounts\sare\sopt-in;\smerge-tree\srecords\sa\sclean\smerge D 2026-10-08T22:32:46.002 E 2026-10-08T22:35:00 00cd7e37bf743c399ac81f6c02b0873cba6a8c89 N text/x-markdown U dmestas W 1537 0.3.40 put line counts in the `zit crosslink` stream: a `lines ADDED REMOVED` line under each `file` line. It counted them for every caller, and the first run over a long history paid for one diff per changed file, many times longer than the run had taken before. From 0.3.41 the counts are opt-in. **A forge that reads `lines` lines must call `zit crosslink --lines`.** Without the flag the stream is what 0.3.39 printed, and costs what it cost. A consumer that never read `lines` lines needs no change. With `--lines` nothing else changed: the counts match `zit diff --numstat --checkin`, binary files are `- -`, and a cache written by 0.3.40 is reused. Each check-in is still counted once, ever. A shun no longer throws those counts away. It recounts only the check-ins that touch a path the shunned content was written to, and they drop the `lines` line for that file. 0.3.41 also lets `zit merge-tree --commit` record a clean merge. Until now it recorded a merge only when there were conflicts to settle, and refused a clean one, the common case, so a forge had no way to merge from the web without opening a checkout. Now ``` zit merge-tree feat --into trunk --commit -m "merge feat" --user NAME \ --expect-current TRUNK_TIP --expect-other FEAT_TIP ``` records on trunk the check-in `zit merge feat` and `zit commit` would make in a checkout of trunk. The `--expect-*` guards still apply, and a `--resolved` file or `--delete` path is refused, since nothing conflicts. The source may be any check-in, not only a branch tip. Z 4bd39601aed66ade226abcb09d8421a3