Session quality filters + content-based outsourcerer detection
Fixes
- Session quality filter: Exclude sub-1-minute and sub-1000-token sessions from savings baseline (noise floor that inflated counts)
- Outsourcerer detection: Switched from broken path-based matching (false-positived on developers working ON the outsourcerer skill) to content-based OSRC::PROGRESS protocol marker detection
- _estimate_uncaptured_runtime: Fixed numerator/denominator mismatch by adding quality filter to subagents_json query to match session_count query
- main_transformation_usd unclamped: Carries honest negative delta when the main pool grew costlier, while keeping monthly_savings_usd at 0 (gates the hero card off, issue #87)
- Path.lower() bug: Convert Path to str before .lower() for non-ASCII path safety on all platforms
Test fixes
- OpenCode: Added missing continuityEnabled param to all checkFreshSessionNudge test calls
- OpenCode: Fixed savings F1 test (window clipping + per-session arm assertions)
- OpenClaw: Fixed savings runaway test (frozen-anchor methodology scales by session count, not token volume)
Test results
- Python: 1752 passed, 2 skipped
- OpenCode: 188 passed
- OpenClaw: 164 passed
Generated with Devin