Storage insights & benchmarks
CAVS measures your data rather than estimating it. This page explains what each number means and where it comes from, so you can act on it.
Logical vs physical
Section titled “Logical vs physical”Two numbers, everywhere:
| Definition | What it’s for | |
|---|---|---|
| Logical bytes | The sum of your objects’ nominal sizes. What a naive store would need. | “how much data do we have?” |
| Physical bytes | The unique compressed bytes actually stored, after chunk dedup. | “what are we paying for?” |
The dedup ratio is 1 − physical / logical, shown as a percentage saved.
Quotas and overage are billed on physical managed storage. BYOS physical bytes are not metered by CAVS at all — you pay your provider.
Repository usage
Section titled “Repository usage”export API=https://cavsnode.com/api/v1export H="Authorization: Bearer $CAVS_TOKEN"
curl -sS "$API/repositories/$REPO/usage" -H "$H"Returns logical bytes, physical bytes, object count, egress for the period and the current generation. It reads a reconciled snapshot rather than scanning live, so it’s cheap to poll — and it lags a push by seconds.
Storage over time
Section titled “Storage over time”curl -sS "$API/repositories/$REPO/storage/series?days=90" -H "$H"curl -sS "$API/organizations/acme-ai/usage/series?days=90" -H "$H"days is 1–365 (default 90). Both return daily points of logical bytes,
physical bytes and object count. This is the chart that tells you whether growth
is linear (expected) or stepped (someone committed a dataset).
Where the bytes are
Section titled “Where the bytes are”# Roll up the indexed tree by directorycurl -sS "$API/repositories/$REPO/storage/folders?depth=2&limit=20" -H "$H"
# Summary: totals, dedup ratio, biggest objectscurl -sS "$API/repositories/$REPO/storage/summary" -H "$H"
# Raw object list, largest firstcurl -sS "$API/repositories/$REPO/objects?sort=size&limit=20" -H "$H"| Parameter | Range | Default |
|---|---|---|
depth |
1–5 | 1 |
limit |
1–100 | 20 |
ref |
any indexed ref | default branch |
Folder roll-ups need the Git index — the data plane alone has no directories.
Organization-wide, the Storage view ranks repositories by physical size and groups them by storage group, which is usually enough to find the surprise.
Transfer benchmarks
Section titled “Transfer benchmarks”When the CAVS transfer agent handles a transfer it reports what it actually did. Those records are your benchmarks — measured, not modelled.
curl -sS "$API/repositories/$REPO/transfers?kind=push&limit=10" -H "$H"curl -sS "$API/repositories/$REPO/transfers?kind=pull&limit=10" -H "$H"| Field | Meaning |
|---|---|
kind |
push or pull |
duration_ms |
Wall clock for the whole transfer |
ingest_ms |
Chunking, hashing and packing (push) |
mirror_ms |
Uploading the static tree (push) |
logical_bytes |
Nominal size of what was transferred |
stored_bytes |
Bytes that actually hit storage (push) |
object_count, chunk_count |
How many objects and chunks were involved |
new_chunks / reused_chunks |
The dedup story for this transfer |
files_put / files_skipped |
Tree files written vs already present |
Pull records additionally report wire bytes vs logical bytes, chunks fetched vs reused from cache, and a timing breakdown (metadata, plan, payload, reconstruct).
What good looks like
Section titled “What good looks like”| Signal | Healthy | Investigate |
|---|---|---|
reused_chunks / chunk_count on a small edit |
high (> 80%) | near zero — your format probably reshuffles on write |
stored_bytes / logical_bytes on a re-push |
small | ≈ 1 — nothing deduped; check the agent is actually wired |
| Pull wire bytes with a warm cache | small fraction of logical | ≈ logical — cold cache, or the object changed wholesale |
ingest_ms share of duration_ms |
modest | dominant — CPU-bound chunking; consider a coarser chunk profile |
The dashboard’s Benchmarks tab plots throughput in MB/s, dedup percentage, wire savings and the timing breakdown per transfer.
Health checks
Section titled “Health checks”curl -sS "$API/repositories/$REPO/health" -H "$H"The worker evaluates each repository periodically and reports findings such as:
- Stale branches — no commits in over 30 days.
- Oversized branches — more than 2× the default branch’s footprint.
- Low dedup ratio — the stored bytes are close to the logical bytes.
- Unindexed refs — the dashboard can’t show part of the repository.
- Dominant objects — a single object accounts for most of the repository.
Storage-connection health for BYOS repositories is probed separately; a failing connection raises a notification and marks the connection unhealthy. See Bring Your Own S3.
Recommendations
Section titled “Recommendations”Actionable suggestions derived from the same analysis:
curl -sS "$API/repositories/$REPO/recommendations?status=open" -H "$H"curl -sS "$API/organizations/acme-ai/recommendations" -H "$H"
# Dismiss one you've judged and rejectedcurl -sS -X POST "$API/repositories/$REPO/recommendations/$REC_ID/dismiss" -H "$H"status accepts open or dismissed. Dismissing requires
repository.update.
Forecasting
Section titled “Forecasting”The organization dashboard projects storage and egress to the end of the billing period from the current trend, alongside the plan’s included amounts and the overage that would result:
curl -sS "$API/organizations/acme-ai/dashboard" -H "$H"This is a linear projection from recent usage, not a promise. Treat a forecast that crosses your plan’s limit as a prompt to look at the folder breakdown, not as a bill.
A practical audit
Section titled “A practical audit”GET /organizations/{org}/dashboard— is total growth expected?GET /organizations/{org}/usage/series?days=90— is it linear or stepped?- Rank repositories by physical size in the Storage view. Anything surprising?
- For the top repository:
GET …/storage/folders?depth=3— which directory? GET …/objects?sort=size&limit=20— which objects specifically?GET …/artifacts/{oid}/timeline— which commit introduced it, and is it still referenced?GET …/branches— is a stale branch pinning objects nothing current needs?GET …/recommendations— has CAVS already spotted it?
Then act: delete the stale branch, retag, and let GC reclaim the unreferenced chunks.
- Deduplication explained — why your ratio is what it is.
- Lifecycle & maintenance — GC, repack, compaction.
- Usage & metering — how usage becomes a bill.

