Files
cleveragents-core/features/fixtures/scale/baseline_thresholds.json
brent.edwards b88bc0ec1b feat(perf): large project scaling tests (#984)
## Summary

Add large project scaling benchmarks and tests at production scale (10K–100K files).

### New ASV Benchmarks

**IndexingScalingSuite** (`large_project_scaling_bench.py`):
- `time_walk_and_index` at 1K/10K/50K/100K files
- `time_incremental_refresh` (1% modified files)
- `track_indexed_file_count`, `track_tokens_per_second`

**ContextAssemblyScalingSuite** (`context_assembly_scaling_bench.py`):
- `time_full_pipeline` at 100/1K/5K/10K fragments
- `time_tiered_strategy`, `time_recency_strategy`
- `track_assembled_tokens`, `track_fragments_per_second`

**ExecutionThroughputSuite** (`execution_throughput_bench.py`):
- `time_sequential_plans` at 10/50/100 plans
- `time_executor_construction`, `time_decision_tree_scaling`

### Scale Fixture Updates

- Added `xlarge` (50K files) and `xxlarge` (100K files) profiles to `scale_metadata.json`
- Added 50K/100K thresholds to `baseline_thresholds.json`
- Added `context_assembly` and `execution_throughput` threshold sections

### Tests & Documentation

- 15 Behave scenarios validating profiles, thresholds, monotonicity, memory budgets
- 6 Robot integration tests including live 1K-file indexing throughput check
- `docs/reference/scaling_baselines.md` documenting all baseline metrics

### Quality Gates

| Session | Result |
|---|---|
| `nox -s lint` | PASS |
| `nox -s typecheck` | PASS (0 errors) |
| `nox -s unit_tests` | PASS (10,910 scenarios) |
| `nox -s integration_tests` | PASS (1,526 tests) |
| `nox -s coverage_report` | 97% (>= 97%) |

Closes #859

Reviewed-on: cleveragents/cleveragents-core#984
Co-authored-by: Brent E. Edwards <brent.edwards@cleverthis.com>
Co-committed-by: Brent E. Edwards <brent.edwards@cleverthis.com>
2026-03-21 04:46:45 +00:00

155 lines
3.8 KiB
JSON

{
"schema_version": "1.0",
"description": "Baseline performance thresholds for scale testing. Values are in milliseconds unless noted otherwise.",
"indexing": {
"1000_files": {
"p50_ms": 2000,
"p95_ms": 5000,
"p99_ms": 8000,
"max_ms": 12000,
"notes": "Small repo: single microservice scale"
},
"5000_files": {
"p50_ms": 10000,
"p95_ms": 25000,
"p99_ms": 40000,
"max_ms": 60000,
"notes": "Medium repo: multi-service monorepo scale"
},
"10000_files": {
"p50_ms": 18000,
"p95_ms": 45000,
"p99_ms": 72000,
"max_ms": 110000,
"notes": "Large repo: enterprise monorepo scale; sub-linear scaling expected"
},
"50000_files": {
"p50_ms": 75000,
"p95_ms": 180000,
"p99_ms": 290000,
"max_ms": 450000,
"notes": "XLarge repo: multi-team enterprise monorepo; sub-linear scaling expected"
},
"100000_files": {
"p50_ms": 140000,
"p95_ms": 340000,
"p99_ms": 550000,
"max_ms": 850000,
"notes": "XXLarge repo: maximum production scale; sub-linear scaling expected"
}
},
"decomposition": {
"1000_files": {
"p50_ms": 4000,
"p95_ms": 10000,
"p99_ms": 16000,
"max_ms": 24000,
"notes": "Decomposition typically 2x indexing time"
},
"5000_files": {
"p50_ms": 20000,
"p95_ms": 50000,
"p99_ms": 80000,
"max_ms": 120000,
"notes": "Decomposition typically 2x indexing time"
},
"10000_files": {
"p50_ms": 40000,
"p95_ms": 100000,
"p99_ms": 160000,
"max_ms": 240000,
"notes": "Decomposition typically 2x indexing time"
},
"50000_files": {
"p50_ms": 160000,
"p95_ms": 400000,
"p99_ms": 640000,
"max_ms": 960000,
"notes": "Decomposition typically 2x indexing time; sub-linear scaling"
},
"100000_files": {
"p50_ms": 300000,
"p95_ms": 750000,
"p99_ms": 1200000,
"max_ms": 1800000,
"notes": "Decomposition typically 2x indexing time; sub-linear scaling"
}
},
"memory_usage_mb": {
"1000_files": {
"peak_mb": 256,
"steady_state_mb": 128
},
"5000_files": {
"peak_mb": 768,
"steady_state_mb": 384
},
"10000_files": {
"peak_mb": 1536,
"steady_state_mb": 768
},
"50000_files": {
"peak_mb": 6144,
"steady_state_mb": 3072
},
"100000_files": {
"peak_mb": 12288,
"steady_state_mb": 6144
}
},
"context_assembly": {
"100_fragments": {
"p50_ms": 50,
"p95_ms": 150,
"p99_ms": 300,
"notes": "Baseline context assembly at small scale"
},
"1000_fragments": {
"p50_ms": 500,
"p95_ms": 1500,
"p99_ms": 3000,
"notes": "Medium context assembly scale"
},
"5000_fragments": {
"p50_ms": 2500,
"p95_ms": 7500,
"p99_ms": 15000,
"notes": "Large context assembly; linear scaling expected"
},
"10000_fragments": {
"p50_ms": 5000,
"p95_ms": 15000,
"p99_ms": 30000,
"notes": "Maximum context assembly scale"
}
},
"execution_throughput": {
"10_plans": {
"p50_ms": 200,
"p95_ms": 500,
"p99_ms": 1000,
"notes": "Light execution workload"
},
"50_plans": {
"p50_ms": 1000,
"p95_ms": 2500,
"p99_ms": 5000,
"notes": "Medium execution workload"
},
"100_plans": {
"p50_ms": 2000,
"p95_ms": 5000,
"p99_ms": 10000,
"notes": "Heavy execution workload"
}
},
"scaling_expectations": {
"indexing_complexity": "O(n log n)",
"decomposition_complexity": "O(n log n)",
"context_assembly_complexity": "O(n log n)",
"execution_complexity": "O(n)",
"memory_complexity": "O(n)",
"notes": "Thresholds assume local SSD storage and 8+ GB RAM available"
}
}