Files
yvgude--lean-ctx/docs/reference/11-analytics-and-insights.md
wehub-resource-sync 26382a7ac6
CI / Test (macos-latest) (push) Waiting to run
CI / Test (windows-latest) (push) Waiting to run
CI / Build (no embeddings / no ORT) (push) Waiting to run
CI / Format (push) Waiting to run
CI / Cookbook (Node) (push) Waiting to run
CI / Pi Extension (Node) (push) Waiting to run
CI / Rust SDK (lean-ctx-client) (push) Waiting to run
CI / Embed SDK (lean-ctx-sdk) (push) Waiting to run
CI / Python SDK (leanctx) (push) Waiting to run
CI / Hermes Plugin (Python) (push) Waiting to run
CI / SDK Conformance Matrix (push) Waiting to run
CI / Coverage (push) Waiting to run
CI / cargo-deny (push) Waiting to run
CI / Adversarial Safety (push) Waiting to run
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
JetBrains Plugin / Actionlint (push) Waiting to run
CI / Benchmarks (push) Waiting to run
CI / Output-Quality Gate (eval A/B) (push) Waiting to run
CI / Documentation (push) Waiting to run
CI / CI Green (push) Blocked by required conditions
CodeQL / Analyze (actions) (push) Waiting to run
CodeQL / Analyze (rust) (push) Waiting to run
JetBrains Plugin / Validation (push) Waiting to run
JetBrains Plugin / Build (push) Waiting to run
JetBrains Plugin / Test (push) Blocked by required conditions
Security Check / Security Scan (push) Waiting to run
CI / Test (ubuntu-latest) (push) Has started running
CI / Clippy (push) Has started running
chore: import upstream snapshot with attribution
2026-07-13 12:35:30 +08:00

407 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Journey 11 — Analytics, Insights & Reporting
> How much is lean-ctx actually saving you? Where is context being wasted? Which
> commands are slow? This journey covers every reporting, measurement, and
> "show me the numbers" surface — without ever costing the agent extra tokens
> (all of this is CLI / dashboard, not injected context).
Source files referenced here:
- `rust/src/cli/dispatch/analytics.rs``gain` (all modes)
- `rust/src/tools/ctx_gain.rs`, `core/stats/` — savings engine
- `rust/src/cli/session_cmd.rs``wrapped`
- `rust/src/cli/tee_cmd.rs``tee`, `filter`, `slow-log`
- `rust/src/cli/dispatch/network.rs``dashboard`, `watch`
---
## 0. The principle
> Per the project's own rule: lean-ctx never prints "↓80% saved" into agent
> context — that would burn tokens. Savings live **here**, in the CLI and
> dashboard, where a human looks at them.
So analytics is a pull model: nothing is added to your agent's window; you run a
command when you want the numbers.
---
## 1. `gain` — the savings dashboard
`lean-ctx gain` is the single entry point, with one mode per question:
```bash
lean-ctx gain # headline savings summary
```
| Flag | Answers |
|------|---------|
| `--live` (`--watch`) | live-updating savings as you work |
| `--graph` | savings over time, sparkline |
| `--daily` | per-day breakdown |
| `--cost` | dollar cost saved (model-priced) |
| `--score` | efficiency score |
| `--tasks` | savings grouped by task |
| `--agents` | savings grouped by agent (see Journey 8) |
| `--heatmap` | which files/commands save the most |
| `--wrapped` | "Spotify Wrapped"-style recap (terminal) |
| `--svg` (`--card`) | the Wrapped recap as a shareable SVG (social/OG image) → `lean-ctx-wrapped.svg` |
| `--share` (`--page`) | a self-hostable HTML share page (SVG embedded inline) → `lean-ctx-wrapped.html` |
| `--pipeline` | provider-pipeline processing stats |
| `--deep` | everything: report + tasks + cost + agents + heatmap |
| `--json` | machine-readable (for scripts/CI) |
| `--reset` | clear all savings data |
`--svg`/`--share` accept an optional path (`--svg=card.svg`, `--share=out.html`) and
respect `--period`. `--share` also takes `--base-url=https://…` to emit absolute
Open Graph / Twitter image meta for link unfurling (see §2).
Refinements: `--model <name>` (price against a specific model), `--period <p>`
(time window, default `all`), `--limit <n>` (rows, default 10).
> Start with `lean-ctx gain`; reach for `--deep` when you want the full picture
> in one shot, or `--cost --model gpt-4o` to put a dollar figure on it.
### 1.1 Savings-faithful measurement (why `saved` may read 0)
`gain` only counts savings the **bridge** actually realised: the proxy must be
running *and* intercepting your editor's LLM requests. The summary's first line
makes this precondition explicit:
```
Bridge: connected — 69 tools, 142 requests intercepted # engaged, numbers are real
Bridge: proxy up, 0 requests intercepted — 69 tools exposed (route the editor through lean-ctx)
Bridge: OFF — proxy not reachable; savings cannot be measured (69 tools registered)
```
When `saved` is `0`, `gain` distinguishes **bridge off** from a **genuine zero**:
| Bridge state | Meaning | What to do |
|--------------|---------|------------|
| `OFF` (proxy down) | No requests intercepted — savings are unmeasured, not zero | Start the proxy (`lean-ctx serve`); confirm `/lean-ctx` shows *connected* |
| proxy up, 0 requests | Bridge reachable but your editor is not routed through it | Verify the editor's `mcp.json` points at lean-ctx (`/lean-ctx` → connected) |
| connected | Bridge engaged; `0` is a real zero for this window | Re-run a read to warm the cache — cold first reads have nothing to save yet |
To measure savings faithfully: enable the bridge, verify `/lean-ctx` reports
*connected* with the expected tool-count, then perform a few reads/commands. The
same engagement state is available machine-readably under the `bridge` key of
`lean-ctx gain --json`.
---
## 2. Sharing & proof — `wrapped`, share cards, and the verified `savings` ledger
### 2.1 `wrapped` — the shareable recap
```bash
lean-ctx wrapped # (also: lean-ctx gain --wrapped)
lean-ctx gain --wrapped --period=month
```
A celebratory, screenshot-friendly summary of tokens/cost saved over a period —
good for sharing with your team or justifying the tool to a lead.
### 2.2 Share cards — `--svg` and `--share`
```bash
lean-ctx gain --svg # -> lean-ctx-wrapped.svg
lean-ctx gain --share # -> lean-ctx-wrapped.html
lean-ctx gain --share --base-url=https://you.dev/w # + social preview meta
```
- `--svg` renders the recap as a dependency-free 1200×630 SVG (perfect as a social
/ OpenGraph image; convert to PNG with any SVG tool).
- `--share` emits a **self-contained, self-hostable** HTML page with the SVG
embedded inline (renders offline, anywhere). Host it wherever you like — your
site, a gist, GitHub Pages — and that URL *is* the permalink. lean-ctx uploads
nothing; this is an opt-in artifact, consistent with the zero-telemetry default.
- With `--base-url`, the page gains Open Graph / Twitter meta so the link unfurls
into a rich card (point it at a hosted PNG render of the SVG, since networks
don't render SVG `og:image`).
### 2.3 `savings` — the verified savings ledger (auditable)
```bash
lean-ctx savings # summary: gross, bounce, net, tokenizer, integrity
lean-ctx savings verify # re-walk the SHA-256 hash chain (tamper-evidence)
lean-ctx savings export # every event as JSON
```
Where `gain`/`wrapped` show **aggregate** savings, `savings` is the **per-event,
auditable** record behind them. Every value-producing read appends one append-only
event to `~/.lean-ctx/savings/ledger.jsonl` capturing the counterfactual
(`baseline` vs `actual` tokens), the resolved pricing model, the **tokenizer** that
produced the counts (`o200k_base`), a privacy-preserving repo hash, and a SHA-256
`prev → entry` hash chain. It is **local-only and on by default** (opt out with
`LEAN_CTX_SAVINGS_LEDGER=off`).
Honesty is the point of the ledger:
- **Tokenizer transparency** — counts use `o200k_base` as a proxy; your model's own
tokenizer may differ a few percent, so the tokenizer is recorded explicitly
rather than assumed.
- **Bounce-netting** — when a compressed read is later invalidated by a full
re-read ("bounce"), a negative adjustment is recorded so totals show the
**realized** saving, not a gross upper bound. `gain --wrapped` nets the same
bounce out of its headline, and the ledger summary shows gross → bounce → net.
- **Tamper-evidence** — `savings verify` recomputes the chain end to end; any
edited, reordered, inserted, or removed entry is detected.
> Why a separate ledger? It is the trusted substrate for value-based reporting:
> a number you can hand to a finance team and have it survive scrutiny. See
> `docs/business/03-verified-savings-ledger.md`.
---
## 3. `token-report` — tokens + memory
```bash
lean-ctx token-report # tokens saved + memory footprint
lean-ctx token-report --json
```
Where `gain` focuses on savings, `token-report` (alias `report-tokens`) adds the
memory side: how much session/knowledge/cache state lean-ctx is holding.
**Golden output — `lean-ctx token-report`** combines the knowledge store, the
live session, and the latest CEP scorecard in one view:
```text
lean-ctx token-report v3.6.26
project: /Users/you/dev/lean-ctx
data: /Users/you/.lean-ctx
knowledge: 105 active, 97 archived, 0 patterns, 91 history
session: 1953 calls, 90710600 tok saved, 333 files read (17 repeated)
cep(last): score=66 cache_hit_rate=18 mode_diversity=100 compression_rate=82 tok_saved=284748
report saved: /Users/you/.lean-ctx/report/latest.json
```
The `cep(last)` line is the most recent Context Engineering Protocol scorecard
(see §9); `17 repeated` reads are the cache wins that cost ~13 tokens each.
---
## 4. Finding waste — `discover` and `ghost`
```bash
lean-ctx discover # commands in your shell history that ran uncompressed
lean-ctx ghost # "ghost tokens": hidden waste lean-ctx could catch
lean-ctx ghost --json
```
- `discover` scans shell history for commands you ran *without* lean-ctx — your
"you could have saved more here" list.
- `ghost` quantifies waste that's currently slipping through, so you know
whether tightening compression (Journey 10) is worth it.
---
## 5. Performance — `slow-log`
```bash
lean-ctx slow-log list # slowest commands lean-ctx wrapped
lean-ctx slow-log clear
```
If lean-ctx ever feels like it's adding latency, this tells you exactly which
commands were slow to compress, so you can exclude or filter them.
---
## 6. Output logs — `tee`
```bash
lean-ctx tee list # captured output logs
lean-ctx tee last # the most recent
lean-ctx tee show <id>
lean-ctx tee clear
```
`tee` keeps a log of compressed command outputs so you can recover the *full*
output of something you ran earlier without re-running it.
---
## 7. The web dashboard — `dashboard`
```bash
lean-ctx dashboard # http://localhost:3333
lean-ctx dashboard --port 4000 --host 0.0.0.0
```
A browser UI over everything in this journey: live savings, heatmaps, sessions,
knowledge, agents. The richest way to explore; ideal for a second monitor.
> This dashboard is the home for the UX feedback in issue #249 — it's where
> context-management visualization lives, distinct from the CLI numbers.
### Open it inside your editor
```bash
lean-ctx dashboard --vscode # open as a native editor tab (no browser)
```
With the [lean-ctx editor extension](https://marketplace.visualstudio.com/items?itemName=LeanCTX.lean-ctx)
installed, `--vscode` opens the dashboard as a real editor tab instead of a
browser window. The CLI detects the editor that launched your terminal — VS
Code, Cursor, VSCodium, Windsurf or VS Code Insiders — and hands off to the
extension, which runs the dashboard on a private loopback port and tears it down
when you close the tab. You can also open it from the command palette
(`lean-ctx: Open Web Dashboard`) or the deep link
`vscode://LeanCTX.lean-ctx/dashboard`.
If no editor (or the extension) is found, `--vscode` falls back to the browser,
so the command is never a no-op. `--open=vscode` and
`LEAN_CTX_DASHBOARD_OPEN=vscode` behave the same way.
---
## 8. The live TUI — `watch`
```bash
lean-ctx watch # real-time event stream in the terminal
```
A terminal dashboard (no browser) showing the live event stream — reads,
compressions, cache hits — as they happen. Great for confirming "is lean-ctx
actually intercepting this?" in real time.
---
## 9. Quality scoring — `cep` and `benchmark`
```bash
lean-ctx cep # CEP score trends (Context Engineering Protocol)
lean-ctx benchmark run # run the benchmark suite
lean-ctx benchmark report # results
lean-ctx benchmark eval / compare # evaluate / compare runs
lean-ctx benchmark scorecard # reproducible savings + recall/MRR + latency
```
- `cep` tracks the Context Engineering Protocol score over time — a measure of
how well-structured the agent's context has been.
- `benchmark` measures compression quality/throughput so regressions are caught
(also used in CI, Journey 9).
### Reproducible scorecard — `benchmark scorecard`
One command runs a **fixed, committed scenario matrix** (`small` / `medium` /
`large`) and reports the three numbers that matter together: compression
**savings**, retrieval **recall@5/@10 + MRR**, and search **latency**.
```bash
lean-ctx benchmark scorecard # human-readable table
lean-ctx benchmark scorecard --json # structured JSON
lean-ctx benchmark scorecard --json --output sc.json
```
The corpus is generated deterministically (content derived purely from the file
index — no RNG) and retrieval is pure BM25, so the **quality metrics are
reproducible** run-to-run and machine-to-machine. Each report embeds a
`determinism_digest` (a fingerprint of the latency-free metrics) in both the JSON
and the human table, so two artifacts are **self-verifying** — compare the
digests to confirm identical quality without diffing every number. Latency is
wall-clock and therefore reported but excluded from the digest. CI runs the
scorecard on every push and uploads `scorecard.json` as a build artifact, and a
test (`scorecard_determinism`) asserts the digest is stable.
### Edit efficiency — anchored (`ctx_patch`) vs str_replace (`ctx_edit`)
Anchored editing claims it saves **output** tokens (the ~5×-priced kind): the
model patches by `line:hash` anchor instead of re-quoting the replaced span as
`old_string`. lean-ctx **measures** that claim per applied op (never estimates
it) in a dedicated channel — see the
[Edit Metering v1 contract](../contracts/edit-metering-v1.md):
- **`ctx_metrics`** prints an `Edit efficiency (anchored vs str_replace,
all-time)` section: calls, ops, avoided output tokens, stale-anchor
`CONFLICT` retries, and the str_replace baseline (`old_string` tokens paid,
misses).
- The **dashboard ROI view** shows the same counters as the *Edit Efficiency*
card (`/api/stats` → `edit_efficiency`), labelled **measured**.
- The **A/B benchmark** is hermetic and reproducible:
```bash
cd rust && cargo test --test edit_reliability -- --nocapture
```
It fixes identical mechanical bugs across 5 languages with both tools and
reports two axes — reliability (anchored 10/10 vs minimal str_replace 5/10,
which recovers to 10/10 only by paying extra recalled context) and argument
cost on identical successful fixes (anchored ~41% fewer output tokens on the
benchmark corpus, tiny-span exceptions included honestly in the print-out).
---
## 10. Learning loops — `learn` and `gotchas`
These turn observed history into durable insight:
```bash
lean-ctx gotchas list # recorded bugs/footguns ("bug memory")
lean-ctx gotchas stats / export / clear
lean-ctx learn # learned gotchas
lean-ctx learn --apply # promote them into AGENTS.md
```
- `gotchas` (alias `bugs`) is a memory of mistakes/footguns hit in this project.
- `learn --apply` promotes high-value lessons into your agent rules — the
analytics-to-governance bridge (pairs with `export-rules`, Journey 10).
---
## 11. Raw stats & transcript compaction
```bash
lean-ctx stats # raw stats store summary
lean-ctx stats json # raw JSON
lean-ctx stats reset-cep # reset CEP scores only
lean-ctx compact [path] # compress stored agent transcripts
```
`stats` is the low-level store behind `gain`; `compact` shrinks saved agent
transcripts so long histories don't bloat the data dir.
---
## 12. Decision guide
| You want… | Reach for |
|-----------|-----------|
| Headline savings | `gain` (§1) |
| A shareable recap | `wrapped` (§2.1) |
| A social/OG image or hostable page | `gain --svg` / `gain --share` (§2.2) |
| An auditable, per-event savings record | `savings` (§2.3) |
| Tokens **and** memory footprint | `token-report` (§3) |
| Where am I still wasting tokens? | `discover`, `ghost` (§4) |
| Is lean-ctx slowing me down? | `slow-log` (§5) |
| Recover an earlier full output | `tee` (§6) |
| Rich visual exploration | `dashboard` (§7) |
| Watch it work live | `watch` (§8) |
| Context-quality / regression tracking | `cep`, `benchmark` (§9) |
| Is anchored editing actually paying off? | `ctx_metrics` / Edit Efficiency card (§9) |
| Turn history into rules | `learn`, `gotchas` (§10) |
| Raw numbers / shrink transcripts | `stats`, `compact` (§11) |
---
## Storage & data (analytics)
| Path | Contents |
|------|----------|
| `~/.lean-ctx/` stats store | savings/usage that `gain`/`stats` read |
| `~/.lean-ctx/savings/ledger.jsonl` | verified per-event savings ledger (`savings`) |
| `~/.lean-ctx/pipeline_stats.json` | provider-pipeline stats (`gain --pipeline`) |
| tee logs | captured full command outputs |
| gotchas/bug memory | recorded footguns |
---
## UX notes captured during this walkthrough
- `gain` has 12+ modes that aren't discoverable from `gain` alone; §1 tabulates
every one so users stop guessing flag names.
- The deliberate "no savings text in agent context" rule is stated up front (§0)
so users understand *why* the numbers only live in the CLI/dashboard.
- `discover`/`ghost` (waste finders) and `learn`/`gotchas` (learning loops) are
powerful but obscure; grouped here by intent so they're actually found.