Changelog
v0.52.0

Documentation checked against the code

A new deterministic analysis reads your docs and reports what the tree refutes, savings stop undercounting, and code health can finally see test quality.

Your documentation makes claims about your code. Repowise already holds the graph that can check them, so this release puts the two together.

Documentation drift

A fourth deterministic analysis joins the pipeline. It reads your repository's own markdown, extracts the claims each document makes about the tree, resolves them against the graph, and reports the ones the tree refutes. A function that moved, a module that no longer exists, a path that was renamed two quarters ago.

No model is involved, so it runs on every index and every update at no cost. Findings reach the CLI, the get_health tool, and a tab on Code Health.

It answers the reverse question too. Ask for doc_drift on a file and you get the documents that name it, where in each, and whether those documents carry drift of their own. Opening a finding shows the line as the document wrote it, the heading trail locating the passage, and what the resolver actually checked, so you can fix it without going looking.

Savings stopped undercounting

The savings ledger was wrong, and wrong in the direction of reporting far less than was really saved. Nothing wrote pricing onto an event, so a report over that ledger valued real savings at zero. Two estimators still described a tool that no longer exists, so the tools they covered recorded themselves as a net cost on nearly every call.

Every event is now priced from its own evidence, one event is recorded per interaction, and the API, the dashboard and the CLI report the same figure. Savings also report how much smaller the input got, not only how much was spent.

The number stays a deliberate floor. Where the evidence is ambiguous the ledger declines to claim a saving rather than estimating one, so your real savings are very likely higher than the figure on the page.

The pages that say where to look

The overview's attention list read three detectors, because those were the three that existed when it was written. Code health findings, security, documentation drift and refactoring plans sat on a tab and never reached the page whose whole job is to point you somewhere. They are one list now.

The costs page was a stack of nested cards at one visual weight. A card should mean "an object you can act on", and a savings total is not that, so the boxes carried no information while flattening the page.

A commit could tell you how large a change was and which files it touched, but not whether it made anything worse. It reports the health delta now, and leads with where the change lands rather than opening on a percentile it then spends most of the panel explaining.

Code health can see test quality

Two new markers. One flags a test case that checks nothing at all. The other measures how much of a test is mock setup, and stays advisory and unweighted on purpose: no defect corpus labels mock density, so weighting it would move a number that claims to predict bugs using evidence that says nothing about bugs.

Underneath both, assertions are counted with a per-language vocabulary instead of a rule that only ever matched assert and expect. Over a real Go repository with 502 test files, the old rule found 87 assertions in total, because idiomatic Go checks with t.Errorf and testify.

Decisions say only what they can support

A decision record is a claim about why your code is shaped the way it is, and the layer had been making claims it could not back: a ruling reported from a record nobody accepted, governance claimed over every file in the commit a decision was mined from, working agreements pulled out of a transcript and stored as though the codebase had decided them.

Acceptance now needs a stated reason and records what signed it. Scope binds to code the repository actually has. Transcript mining is off unless you turn it on. And the layer can now ask: after a commit, an agent can be offered the line that records the choice it just made, off by default, once per session, proposing only.

Languages

A long precision pass on Rust: field and type argument types recorded as references, trait item visibility, defaulted methods parented to their trait, and bodiless declarations captured. Alongside it, C# null conditional calls and extension method binding, Go functions in composite literals, Objective-C header pairing, Swift qualified extensions, Java annotations, TypeScript class fields holding a function, and GDScript uid:// resolution.

Upgrading

pip install --upgrade repowise

Nothing needs re-indexing. Expect the first update after upgrading to take longer than usual, because the health analyzer re-scores the repository once instead of waiting out its decay timer. On a 171 file repository that was 10.2 seconds against a 5.8 second baseline, with the next update back to normal.

Two defaults changed: transcript mining for decisions is off, and a decision whose body only restates its title can no longer be accepted.

Thank you

This release includes work from 11 contributors outside the core team.