Align backup, agent-limit, and offering claims with what runs - #953
Merged
jfrench9 merged 1 commit intoJul 29, 2026
Merged
Conversation
…runs
Four claims the platform made and did not keep, each aligned to reality:
- Deprovisioning promised 90/180/365-day backup hosting by tier. The S3
lifecycle rule deletes backup objects at 90 days and the final backup
creates no GraphBackup row, so the tier-aware cleanup cannot extend it
either — Large and XLarge's extended hosting physically never happened.
All tiers now promise the 90 days the infrastructure delivers, pinned
by a test against the lifecycle ceiling.
- Backup retention accepted up to 2555 days (7 years) while the same
lifecycle rule destroyed the object at 90, leaving COMPLETED records
pointing at deleted objects. The request field now caps at 90, the
per-tier clamp applies even when the graph row or tier is missing
(it previously skipped entirely), and the clamp is visible: the
operation envelope reports the effective retention and says when it
was capped. The UI defaulted to 90 days and a Standard customer was
silently given 7 with no indication anywhere.
- Repository plans have always advertised agent_calls_per_* volume
limits; nothing ever passed operation="agent" to the volume limiter,
so the advertised numbers were unenforced. The operator surface (auto,
specific, batch) now applies shared-repository access + agent volume
limits through the same path query/mcp/search already use.
- /v1/offering described repository subscriptions as per-organization
("all organization members share access"). Access, credits, and volume
limits all key on the subscribing user; the copy now says per_user.
And the same tier claimed "4 GB RAM" in /offering but "3GB RAM" in
/v1/graphs/tiers features — the latter reported the LadybugDB budget,
not the machine. Both now advertise instance RAM; the memory_mb field
description no longer calls the instance budget "memory allocated to
your graph".
Full suite: 11,426 passed; only failures are the two pre-existing
test_incremental_materialize cases that reproduce on main.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Four claims the platform made and did not keep, each aligned to what actually runs. Based on
chore/stale-claims-cleanup(#952); retarget-safe once that merges.Deprovisioning backup hosting: 90 days for everyone
The config promised 90/180/365-day post-cancellation backup hosting by tier. The S3 lifecycle rule (
ExpireGraphBackups: 90) deletes the object at 90 days regardless, and the final deprovisioning backup creates noGraphBackuprow, so the tier-aware cleanup job cannot see it to extend anything. Large and XLarge's extended hosting physically never happened. All tiers now promise the 90 days the infrastructure delivers, pinned by a test against the lifecycle ceiling. (Delivering more for real means exempting final backups from the lifecycle rule and tracking them — noted in the config for whoever builds it.)Backup retention: capped at 90, clamped visibly
retention_daysaccepted up to 2555 days while the same lifecycle rule destroyed the object at 90 — producingCOMPLETEDbackup records pointing at deleted objects, with restore failing opaquely. Three changes:le=90, with a description that says why.retention_daysand the message says when it was capped. The UI defaults the field to 90; a Standard customer was silently given 7 with no indication in the response or the backup list.agent_calls_*limits: enforced for the first timeRepository plans have always advertised per-plan agent volume limits (
agent_calls_per_houretc. in/v1/offering), but nothing ever passedoperation="agent"to the volume limiter — query/mcp/search each had their enforcement hook, the operator surface had none. All three operator entry points (auto, specific, batch) now run shared-repository access + agent volume limits through the same helper the other three surfaces use.Offering copy: per-user repositories, one RAM number
/v1/offeringdescribed repository subscriptions asper_organization("all organization members share access"). Access, credits, and volume limits all key on the subscribing user (UserRepository/UserRepositoryCredits) — the copy now saysper_user./offeringand "3GB RAM" in/v1/graphs/tiers— the latter reported the LadybugDB memory budget, not the machine. Both now advertise instance RAM, and thememory_mbfield description stops calling the instance-wide budget "memory allocated to your graph".Testing
Full suite: 11,426 passed; only failures are the two pre-existing
test_incremental_materializecases that reproduce onmain. New tests pin the hosting-days ceiling, the 90-day request cap (updating the test that pinned 2555), the agent-operation delegation, and the per-user pricing model.