unhappychoice unhappychoice · 2026-07-20 - 2026-07-26

lintric accuracy engine: 76 PRs of dependency resolution surgery

A week dominated by systematic fixes to lintric's cross-language dependency graph, shipping 5 releases and 478 commits across 15+ repos.

This week was defined almost entirely by lintric — a Rust-based code dependency analysis tool that got a relentless, methodical overhaul. 76 of the 77 PRs touched lintric at some point, and the commit log reads like a graduate thesis: fixing namespace collisions, scoping match arms correctly, resolving member access by receiver type, linking trait implementations to their declarations. This wasn't a casual refactor — it was a deep, systematic audit of every edge case in how the tool models TypeScript and Rust code semantics.

The narrative arc is fascinating: it started with infrastructure unblocking (fixing tree-sitter 0.25 API changes, tera 2.0 migration, clippy/audit CI failures) and then pivoted into a long accuracy sprint. Each PR followed a tight test-fix-test loop — pin the construct with an accuracy fixture, write the fix, verify snapshots. By the end of the week, lintric could handle let chains, match guards, accessor pairs, abstract classes, const generic parameters, aliased imports, and type/value namespace separation.

Alongside the lintric marathon, two releases shipped for mdts (v0.20.4 and v0.20.5 with auto-focus file tree and livereload resilience), gittype landed on winget as v0.10.1, steamfetch and gitlogue each cut releases, and a Gradle OOM crisis in circleci-tools/Norimaki got diagnosed and squashed. The week ended with a dramatic commit surge — 191 on Saturday, 261 on Sunday.

Summary

6 sections
deep-dive
lintric: rebuilding a dependency graph from first principles
The lintric work this week was extraordinary in scope — 50+ feature and fix PRs systematically closing accuracy gaps in the tool's TypeScript and Rust dependency resolution engine. The approach was rigorous: every fix came paired with an accuracy fixture that pinned the exact construct being handled, from let chain bindings and match guard scopes to accessor direction, abstract class member linking, and type/value namespace separation. The crowning achievement was moving from ad-hoc parent-tree walking to query-based extraction for both languages, and adding a shift diagnostic that warns when annotations were written against a different line numbering.
repo unhappychoice/lintric PRs 76 merged lines +9k -6k languages Rust + TypeScript
activity-pattern
Slow start, volcanic finish
The week opened at a brisk 85 commits on Monday and peaked mid-week at 139 on Tuesday, but the real story is the weekend explosion: 191 commits on Saturday and 261 on Sunday — more than a third of the week's entire output in two days. Thursday and Friday were comparatively quiet at 52 and 54, suggesting a deliberate mid-week pause before the final push. The 478-commit total across 7 days is a serious output, and the back-loaded pattern suggests the lintric accuracy sprint hit its stride heading into the weekend.
85
Mon
139
Tue
93
Wed
52
Thu
54
Fri
191
Sat
261
Sun
peak Sun 261 total commits 478 quietest Thu 52 weekend share 452 / 478
repo-summary
15+ repos touched, one repo ruled them all
lintric consumed the vast majority of the week's energy with 76 PRs, but the portfolio stayed healthy: mdts shipped two releases with real UX improvements, splashboard churned through 7 Rust dependency bumps, circleci-tools/circleci-cli and Norimaki both got CI fixes, and gittype landed on winget. The dependency maintenance work spanned Rust (tokio, serde, clap, anyhow, async-trait), TypeScript (typescript-eslint, webpack, MUI), Ruby (async-http, simplecov, concurrent-ruby), and Gradle — a genuine polyglot week.
unhappychoice/lintric 76 PRs
unhappychoice/mdts 13 PRs
unhappychoice/splashboard 10 PRs
circleci-tools/circleci-cli 10 PRs
unhappychoice/gittype 10 PRs
unhappychoice/steamfetch 9 PRs
unhappychoice/slack_channel_stats 7 PRs
circleci-tools/Norimaki 6 PRs
deariary/github-weekly-reporter 4 PRs
unhappychoice/cycle-pusher 3 PRs
unhappychoice/gitlogue 3 PRs
unhappychoice/kobito 3 PRs
bitflyer-tools/cycle-flyer 3 PRs
unhappychoice/cycle-cropper 2 PRs
irasutoya-tools/irasutoya 2 PRs
microsoft/winget-pkgs 2 PRs
unhappychoice/tapline 1 PRs
unhappychoice/terminal_image 1 PRs
unhappychoice/blog 1 PRs
unhappychoice/oss-issue-opener 1 PRs
bitflyer-tools/DroidFlyer 1 PRs
unhappychoice/RxSnackbar 1 PRs
unhappychoice/color-hash.kt 1 PRs
irasutoya-tools/irasutoya-cli 1 PRs
active repos 15+ lintric PRs 76 releases shipped 5 languages Rust, TS, Ruby, Kotlin
review-summary
90 reviews, all approvals, zero friction
90 reviews went out this week across an impressive spread of repos: gittype (8), mdts (9), steamfetch (7), circleci-cli (7), Norimaki (5), slack_channel_stats (6), kobito (4), lintric (4), and more. Every single one was an approval — this is largely self-review of Dependabot and automated PRs, but the sheer throughput of staying on top of dependency queues across 15 repos is its own kind of discipline. Two reviews also landed on deariary/github-weekly-reporter, the tool generating this very report.
total reviews 90 approval rate 100% repos reviewed 15+
tech-debt
Unblocking what Dependabot couldn't fix alone
Several PRs this week required hands-on intervention where automated tooling hit its limits. The tree-sitter 0.25 stack upgrade in lintric required coordinating three crates simultaneously and manually updating call sites from language() to LANGUAGE.into(). The tera 2.0 migration needed rewriting Context::into_json() usages with serde_json::json!. In cycle-pusher and cycle-flyer, transitive vulnerabilities via tslint@6.1.3 required adding npm overrides to unpin vulnerable majors. And in circleci-tools/Norimaki, a D8 dexing OOM needed both a heap increase and a resource class bump to fully resolve.
tree-sitter bump 0.22 → 0.25 tera bump 1.20 → 2.0 npm overrides 3 vulns fixed
contribution-summary
Shipping gittype to winget and fixing Norimaki's OOM
Two notable cross-org contributions this week: a PR to microsoft/winget-pkgs landing gittype v0.10.1 in the Windows package registry, and a targeted fix to circleci-tools/Norimaki diagnosing a java.lang.OutOfMemoryError during D8 dexing that had been killing the deploy job. The Norimaki fix was surgical — one-line heap increase plus a CI resource class bump — but it unblocked an otherwise stalled deployment pipeline.
microsoft/winget-pkgs gittype v0.10.1 circleci-tools/Norimaki OOM fixed

Highlights

6 items
pr
unhappychoice/lintric · merged · +263 -394 · 25 files
The coordinated tree-sitter 0.25 upgrade that Dependabot couldn't land on its own — superseding three stalled individual PRs and manually updating every language() call site to the new LANGUAGE.into() API. Net negative line count tells the story: the new API is cleaner.
pr
unhappychoice/lintric · merged · +12 -624 · 3 files
A 612-line net deletion by migrating away from the removed Context::into_json() API to direct serde_json::json! construction — the kind of major-version bump that requires real source changes and pays off in simplicity.
pr
circleci-tools/Norimaki · merged · +1 -1 · 1 file
One line changed, one broken deployment pipeline unblocked — the Gradle daemon was running with default ~512 MiB while D8 dexing needed significantly more, and the launcher-level JVM_OPTS weren't being inherited by the daemon process.
pr
unhappychoice/cycle-pusher · merged · +28 -46 · 2 files
Security updates that Dependabot kept marking as security_update_not_possible due to tslint's transitive pins on vulnerable dependency majors — solved by adding explicit npm overrides to force the safe versions through.
release
v0.20.5
unhappychoice/mdts · released Jul 2026
Ships auto-focus of the current file in the left file tree and makes livereload resilient to permission errors by skipping inaccessible directories — two quality-of-life improvements that came from external contributors.
release
Release v0.10.1
unhappychoice/gittype · released Jul 2026
Adds winget package distribution, meaning gittype is now installable via winget install unhappychoice.gittype — a meaningful distribution milestone for a Rust CLI tool.
Share 𝕏 in 🦋