catnip 0.2.0 — every number from the durable store
GitHub keeps fourteen days of your traffic data. catnip keeps all of it.
Stdlib Python 3.10+ and gh. No service, no build step, no data leaving your machine.
git clone git@github.com:TGPSKI/catnip.git && cd catnip && make install
gh auth login --scopes repo
catnip init && catnip run && catnip tuiThe change
Every windowed number is now computed from the permanent daily store rather than GitHub's rolling 14-day totals. The old views differenced two snapshots of a window that loses its oldest day every night, so they reported window artifacts as change — large negative clone deltas for repos where nothing had happened, and a timeframe selector several views ignored outright.
One derive.py holds every formula, shared by the TUI, catnip view and catnip report, so the three cannot disagree about the same day.
Added
- Ten views, eight new or rebuilt: traffic, audience, table, lang, attribution, deltas, anomaly, profile, correlation, funnel.
- Five detail screens behind
[space]— repo drilldown, attribution finding, momentum, account event, correlated pair, and a repo's actual pages. [?]derivation overlay on every view — formula, thresholds, inputs, and which components were withheld for want of evidence.catnip report— deterministic markdown from the store. Same store and timeframe produce byte-identical output; every figure taggedmeasured.- Three agent skills —
catnip-onboarding,catnip-triage, andcatnip-prowl, which runs the deterministic report and then forms and tests its own hypotheses, tagging each claimmeasured,inferredorspeculativein a separate file. - Store schema 3 ingests popular paths.
/traffic/popular/*rolls like the traffic endpoints, so paths that lived only in run directories were destroyed bycatnip pruneand could never be refetched.
The rule underneath
Absence is never rendered as zero. Withheld audience components are dropped and the weights renormalized. A repo too thin to classify is low-signal, not mixed. A day with no recorded push says no cause recorded in the store, which is not the claim that nothing shipped. unexplained is a first-class attribution tier, because most traffic has no visible cause and a tool that always names one is fitting noise.
Notes
The drawing layer is pane 0.2.0, vendored byte-identically. The demo recording uses generated data — only the API responses are synthetic; analyze, history, totals and derive all run for real on top of them.
226 tests, stdlib only.