# Scale-Adaptive Promotion Thresholds ## Overview Scale-adaptive thresholds automatically adjust promotion criteria based on organization size, enabling small teams to see value immediately while maintaining quality gates for larger organizations. ## The Problem **Before adaptive thresholds:** - Hardcoded minimums: 850/100/50 projects for regulatory/clinical/emerging - Small teams (2-5 projects) → **0 patterns promoted** → empty dashboard - No immediate value demonstration → adoption killed before flywheel starts **Root cause:** - Thresholds designed for enterprise scale (850 projects for regulatory) - Small teams locked out: can't meet 50-project minimum for emerging tier - Dashboard queries promoted patterns only (no visibility into raw aggregates) ## The Solution ### Adaptive Formula ```rust effective_min_projects = max( absolute_floor, // Safety: prevent single-project noise (percentage * total_projects).ceil() // Scale: grow with team ) ``` ### Scale Tiers (Auto-Detected) | Tier | Project Range | Behavior | |------|--------------|----------| | **Micro** | 1-5 | Only emerging tier, floor=2, rate=50% | | **Small** | 6-25 | All tiers enabled, lower floors | | **Medium** | 26-100 | Balanced thresholds | | **Large** | 101-500 | Higher quality gates | | **Enterprise** | 501+ | Current defaults (backward compatible) | ### Example: Emerging Tier Scaling | Team Size | Projects | Formula | Min Projects | Adoption Required | |-----------|----------|---------|--------------|-------------------| | Micro | 3 | `max(2, 0.50*3)` | **2** | 2/3 projects (67%) | | Small | 10 | `max(2, 0.40*10)` | **4** | 4/10 projects (40%) | | Medium | 50 | `max(5, 0.40*50)` | **20** | 20/50 projects (40%) | | Enterprise | 1000 | `max(25, 0.50*1000)` | **500** | 500/1000 projects (50%) | ## Quality Maintained ✅ **Floor prevents noise:** Single-project patterns blocked ✅ **Adoption rate required:** Community consensus still matters ✅ **Authority matching enforced:** Regulatory/clinical tiers need RFC/OWASP match ✅ **Manual review:** Emerging tier still requires review (auto_promote=false) ✅ **Backward compatible:** Enterprise behavior unchanged ## Configuration ### Default (Adaptive) ```toml # .aphoria/config.toml [corpus] use_community = true aggregation_enabled = true # adaptive_thresholds = use_legacy_thresholds = false # Default: use adaptive ``` ### Legacy Mode (Static Thresholds) ```toml [corpus] use_legacy_thresholds = true # Use fixed 850/100/50 ``` ### Custom Thresholds ```toml [corpus.adaptive_thresholds.micro.emerging] min_projects_floor = 1 # Override: allow 1 project (risky!) min_projects_percentage = 0.40 min_adoption_rate = 0.40 ``` ## Implementation ### Core Components 1. **`ScaleTier`** (`corpus/thresholds.rs`): - `from_total_projects(u64) -> ScaleTier` - Auto-detects tier from project count 2. **`AdaptiveCriteria`** (`corpus/thresholds.rs`): - `effective_min_projects(total_projects) -> u64` - Applies `max(floor, percentage * total)` formula 3. **`ScaleAdaptiveThresholds`** (`corpus/thresholds.rs`): - `evaluate(project_count, total_projects, ...) -> PromotionDecision` - Returns `AutoPromote(tier)`, `RequireReview`, or `Skip` 4. **`CommunityCorpusBuilder`** (`corpus/community.rs`): - Updated to use adaptive thresholds when `use_adaptive=true` - Falls back to legacy thresholds when `use_legacy_thresholds=true` - Logs scale tier and threshold mode on build ### Configuration Fields **`CorpusConfig`** (`config/types/scan.rs`): - `adaptive_thresholds: Option` - Custom thresholds - `use_legacy_thresholds: bool` - Backward compatibility flag (default: false) ## Usage ### Micro Team Example (3 projects) ```bash # Scan 3 projects cd project1 && aphoria scan --persist --sync cd project2 && aphoria scan --persist --sync cd project3 && aphoria scan --persist --sync # Check logs # Should see: # scale_tier=Micro, use_adaptive=true # Pattern promoted: 2/3 projects (67%) → RequireReview ``` ### Query Patterns ```bash # API: Patterns with min 1 project (shows all for micro teams) curl 'http://localhost:18180/api/patterns?min_projects=1&limit=10' # Dashboard will show: # - Scale tier: "Micro (3 projects)" # - Promoted patterns visible # - Thresholds: "Emerging: 2/3 projects (67%)" ``` ## Testing ### Unit Tests - `test_scale_tier_detection()` - Verify tier boundaries - `test_effective_min_projects()` - Floor vs percentage dominance - `test_micro_team_promotion()` - 2/3 projects promoted - `test_regulatory_disabled_for_micro()` - Tier disabling works - `test_enterprise_backward_compatible()` - Same as legacy ### Integration Tests - `scale_adaptive_test.rs` - 7 tests covering all scenarios - All 1199 library tests pass ## Migration **Existing deployments:** No action required - Adaptive thresholds default to enabled - Enterprise behavior unchanged (501+ projects) - Legacy mode available if needed **New deployments:** Immediate value - Small teams see patterns after 2-3 scans - Quality maintained via floors and adoption rates - Natural growth path as team scales ## Philosophy **Start simple, scale naturally:** - Small teams see value immediately (2-3 projects → patterns visible) - Quality maintained via floors (no single-project noise) - Adoption rate still matters (community consensus) - Enterprise behavior unchanged (backward compatible) - Configuration optional (defaults work for 95%) **This unlocks the flywheel:** - Small teams adopt → see patterns → gain trust - Teams grow → thresholds tighten → quality improves - Cross-team patterns emerge → community corpus strengthens - No manual threshold tuning required