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
407 lines
16 KiB
Markdown
407 lines
16 KiB
Markdown
# 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.
|