You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Behavioral coupling: the files a repository keeps changing in the same
commits, mined from the history and persisted in a co_changes table. ovecc coupling ranks the pairs by support, Jaccard and lift, with the witness
commits.
The contract verdict on top of it, architecture/behavioral-coupling: two
components no import and no depends_on connects, whose files keep changing
together across at least two file pairs. No static analysis can produce this
one — the only witness is the history, and the commits ship with the finding.
Low by default, coupling = "medium" | "high" | "off" in the contract moves
or silences it, and check --freeze accepts the pairs one at a time like any
other debt.
hotspots and summary report each module's fix history: how many bug-fix
commits touched it, the same count weighted by age (180-day half-life), and
the date of the last one.
ovecc selfcheck: ovecc's own findings measured against the repository's fix
history, as a lift per rule over the repository's own base rate. It ships in report and in BENCHMARKS.md with the number as it comes — on this
repository two rules of eleven clearly beat the base rate. With no ingested
history it says it had nothing to measure instead of printing a table of
zeros that reads as a rule set predicting nothing.
Line coverage from an LCOV tracefile: index --coverage <path>, or the
conventional locations (coverage/lcov.info, lcov.info, coverage.lcov)
when none is given. Stored per file, reported per module by hotspots, and
crossed with the ranking to name the hotspot the tests reach least.
min_coverage per component in .ovecc/architecture.toml: a verdict when a
component's measured line coverage sits under the floor it declared. A
component the tracefile never mentions is skipped rather than reported at 0%,
because what is known is that it is unmeasured, not that it is untested.
review and gate report the shape of a change: the files and head lines it
touches, the contract components it reaches, how evenly it spreads over its
files, the ranked hotspots it lands on, its share of the repository's
age-weighted fix mass, and the mean age of the files it edits. The file,
component, fix-mass and age measurements each carry a percentile against the
repository's own indexed commits, so a change is read against the codebase it
lands in rather than against a constant. Information, never a verdict: no rank
fails the gate, and under 100 indexed commits none is reported at all.
Fixed
Churn follows renames: a file's history no longer restarts at its new path.
Tree diffs also stopped counting directories as files.
grep --limit cuts the definitions returned, not the matches alone, so one
symbol with many call sites no longer crowds every other result out of the
page.
audit tells an unreadable lockfile apart from an absent one, instead of
reporting both as no dependencies found.
impact says when it answered for a file's module rather than for the file
itself, instead of widening the question in silence.
summary carries the files the index could not read, so a partial index shows
up in the report and not only in the output of the run that produced it.
Changed
The commit index records where a renamed file came from, and the co-change
pairs get their own table (schema 10). Existing databases migrate on the next index, which re-ingests the commit history so old renames get linked.
Per-file coverage gets its own table (schema 11), migrated on the next index.
Finding severities are coloured when stdout is a terminal and left plain when
it is piped or redirected.
The first-run hints name the command that helps instead of describing it.