26382a7ac6
CI / Clippy (push) Failing after 15m13s
CI / Test (ubuntu-latest) (push) Failing after 16m1s
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Build (no embeddings / no ORT) (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Cookbook (Node) (push) Has been cancelled
CI / Pi Extension (Node) (push) Has been cancelled
CI / Rust SDK (lean-ctx-client) (push) Has been cancelled
CI / Embed SDK (lean-ctx-sdk) (push) Has been cancelled
CI / Python SDK (leanctx) (push) Has been cancelled
CI / Hermes Plugin (Python) (push) Has been cancelled
CI / SDK Conformance Matrix (push) Has been cancelled
CI / Coverage (push) Has been cancelled
CI / cargo-deny (push) Has been cancelled
CI / Adversarial Safety (push) Has been cancelled
CI / Benchmarks (push) Has been cancelled
CI / Output-Quality Gate (eval A/B) (push) Has been cancelled
CI / Documentation (push) Has been cancelled
CI / CI Green (push) Has been cancelled
JetBrains Plugin / Actionlint (push) Has been cancelled
CodeQL / Analyze (actions) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
CodeQL / Analyze (rust) (push) Has been cancelled
JetBrains Plugin / Validation (push) Has been cancelled
JetBrains Plugin / Build (push) Has been cancelled
JetBrains Plugin / Test (push) Has been cancelled
Security Check / Security Scan (push) Has been cancelled
158 lines
6.6 KiB
Markdown
158 lines
6.6 KiB
Markdown
# LeanCTX in the FinOps Stack — CloudZero, Vantage, FOCUS
|
||
|
||
`lean-ctx finops export` turns the tamper-evident savings ledger into daily
|
||
cost rows your FinOps platform ingests for showback/chargeback. Unlike
|
||
self-reported savings claims, every exported number is backed by a
|
||
hash-chained event (`lean-ctx ledger verify`) with the model price pinned at
|
||
recording time — an auditor can replay the chain.
|
||
|
||
```text
|
||
savings ledger (hash-chained JSONL)
|
||
│ aggregate: day × project × agent × model × tool
|
||
▼
|
||
DailyCostRow { date, project, agent_role, model, tool,
|
||
tokens_actual, tokens_saved, cost_usd, savings_usd }
|
||
│
|
||
├── FOCUS 1.2 CSV ──────────► any FOCUS consumer / data warehouse
|
||
├── CBF CSV / Stream JSON ──► CloudZero (AnyCost)
|
||
└── Vantage CSV ────────────► Vantage (Custom Provider)
|
||
│
|
||
▼
|
||
CFO cost report
|
||
```
|
||
|
||
## Quick reference
|
||
|
||
```bash
|
||
lean-ctx finops export --target=focus --out=leanctx_focus.csv
|
||
lean-ctx finops export --target=cbf --from=2026-06-01 --to=2026-06-30 --upload
|
||
lean-ctx finops export --target=vantage --out=leanctx_vantage.csv --upload
|
||
```
|
||
|
||
## Data model decisions (read before importing)
|
||
|
||
- **Costs are real reads**: `cost_usd` = tokens actually sent through
|
||
lean-ctx × the per-event pinned model price. No counterfactuals.
|
||
- **Savings are separate rows, never mixed into spend**: FOCUS/Vantage get
|
||
`ChargeCategory=Credit` rows with negative `BilledCost` (FOCUS's category
|
||
for granted reductions); CloudZero gets `lineitem/type=Discount` rows
|
||
(CBF's documented mechanism, included in CloudZero "Real Cost"). Budgets
|
||
built on Usage stay clean; savings stay drillable.
|
||
- **No pricing table to maintain**: each ledger event stores
|
||
`unit_price_per_m_usd` at recording time. Provider price changes never
|
||
rewrite history — the export is reproducible forever.
|
||
- **Privacy**: `project` is the truncated repo hash from the ledger (paths
|
||
never leave the machine). For readable dashboards, add an opt-in showback
|
||
mapping (see below) — applied at export time only, so the ledger and signed
|
||
batch stay privacy-preserving.
|
||
|
||
## Showback project names (`--aliases`, #668)
|
||
|
||
The ledger stores only a truncated repo hash, never a path. To show readable
|
||
team/project names in chargeback dashboards, drop a mapping file and it is
|
||
applied **at export time only** — the ledger, the signed batch and the hash
|
||
chain are never touched.
|
||
|
||
```toml
|
||
# <config_dir>/finops-aliases.toml (or point --aliases=FILE / $LEAN_CTX_FINOPS_ALIASES)
|
||
[projects]
|
||
# <repo_hash> = "<display name>"
|
||
a1b2c3d4e5 = "Payments"
|
||
deadbeef00 = "Platform / SRE"
|
||
```
|
||
|
||
```bash
|
||
lean-ctx finops export --target=focus --out=leanctx_focus.csv # uses the default file
|
||
lean-ctx finops export --target=focus --aliases=team-map.toml # explicit mapping
|
||
```
|
||
|
||
Unmapped hashes fall back to the hash, so an incomplete map never drops rows.
|
||
Find the hashes to map in the `project` column of a plain (unmapped) export.
|
||
|
||
## CloudZero (AnyCost)
|
||
|
||
Spec pinned: [CBF — Common Bill Format](https://docs.cloudzero.com/docs/anycost-common-bill-format-cbf),
|
||
required columns `time/usage_start` + `cost/cost`.
|
||
|
||
1. In CloudZero, create an **AnyCost Stream** connection and note the
|
||
connection ID + an API key.
|
||
2. Export and upload:
|
||
|
||
```bash
|
||
export CLOUDZERO_API_KEY="..."
|
||
export CLOUDZERO_CONNECTION_ID="..."
|
||
lean-ctx finops export --target=cbf --from=2026-06-01 --to=2026-06-30 --upload
|
||
```
|
||
|
||
3. **Idempotency**: uploads carry `"operation": "replace_drop"` per month —
|
||
re-running an export replaces that month's drop instead of duplicating
|
||
(CloudZero-side guarantee). One drop is posted per calendar month in the
|
||
range.
|
||
|
||
Dimensions arrive as `resource/tag:project|agent_role|model|tool` tags and
|
||
are filterable in CloudZero Explorer.
|
||
|
||
## Vantage (Custom Provider)
|
||
|
||
Spec pinned: Vantage Custom Providers ingest a FOCUS-aligned CSV — required
|
||
columns `BilledCost`, `ChargeCategory`, `ChargePeriodStart`, `ServiceName`;
|
||
negative costs documented as accepted.
|
||
|
||
1. Create the provider once: `POST /v2/integrations/custom_provider` (or
|
||
console → Integrations → Custom Provider) and note the integration token.
|
||
2. Export and upload:
|
||
|
||
```bash
|
||
export VANTAGE_API_TOKEN="..."
|
||
export VANTAGE_INTEGRATION_TOKEN="accss_crdntl_..."
|
||
lean-ctx finops export --target=vantage --from=2026-06-01 --to=2026-06-30 --upload
|
||
```
|
||
|
||
3. **Idempotency warning**: Vantage treats each CSV upload as an additive
|
||
dataset — there is no replace operation. Before re-sending a period,
|
||
delete the previous upload in Vantage (Settings → Integrations → your
|
||
provider). The CLI prints the dataset window after every upload as a
|
||
reminder.
|
||
|
||
Dimensions arrive in the `Tags` JSON column (`project`, `agent_role`,
|
||
`model`, `tool`).
|
||
|
||
## FOCUS CSV (generic)
|
||
|
||
Spec pinned: [FOCUS v1.2](https://focus.finops.org/focus-specification/v1-2/)
|
||
(June 2024 — first version with SaaS/token-denominated pricing columns). The
|
||
file emits all 21 v1.2 Mandatory columns **plus** the FOCUS 1.0 required set
|
||
(`Provider`, `InvoiceIssuer`, `ResourceID`, `ChargeType`, `Tags`, …) so both
|
||
generations of consumers accept it; additive columns are explicitly allowed.
|
||
lean-ctx dimensions ride in `x_project`, `x_agent_role`, `x_model`,
|
||
`x_tool`, `x_tokens_saved`.
|
||
|
||
Validated against the FinOps Foundation's official validator
|
||
([`focus-validator` 1.0.0](https://pypi.org/project/focus-validator/)):
|
||
|
||
```bash
|
||
pip install focus-validator 'multimethod<2.0'
|
||
lean-ctx finops export --target=focus --out=leanctx_focus.csv
|
||
# Run from the site-packages dir — the 1.0.0 validator resolves its
|
||
# currency-code list via a relative path (upstream packaging bug):
|
||
cd "$(python3 -c 'import focus_validator, os; print(os.path.dirname(os.path.dirname(focus_validator.__file__)))')"
|
||
focus-validator --data-file /path/to/leanctx_focus.csv --column-namespace x
|
||
# → Validation succeeded.
|
||
```
|
||
|
||
## Showback queries that now work
|
||
|
||
- *"What did agent context cost per project last month, and what did
|
||
lean-ctx save us?"* — group by `project` (tag/column), compare Usage vs.
|
||
Credit/Discount.
|
||
- *"Which agent role burns the most tokens?"* — group by `agent_role`.
|
||
- *"Is the savings rate degrading after the editor update?"* — Credit ÷
|
||
Usage trend per day.
|
||
|
||
## Verifying the numbers
|
||
|
||
Every row aggregates hash-chained ledger events recorded on the producing
|
||
machine. To audit: `lean-ctx ledger verify` (chain integrity) and
|
||
`lean-ctx gain` (the same totals the export uses). The ledger design is
|
||
documented in `docs/business/03-verified-savings-ledger.md`.
|