v1.0.3 - Dedup, Rate Limiting & Idempotency
What's Changed
Anti-Loop Protections
- In-flight request deduplication — concurrent requests for the same repo URL share a single Playwright fetch via threading.Event barrier (
dedup.py) - Per-repo sliding-window rate limiter — max 10 calls per 60s window per repo URL; returns
RATE_LIMITEDerror when exceeded (rate_limit.py) - Topic-list dedicated cache — 30-min TTL (vs 5-min for pages) since structural topic data rarely changes
Response Intelligence
- Content hash in
ResponseMeta— MD5-12 fingerprint lets clients detect unchanged responses - Idempotency key in
ToolResponse—repo_url::content_hashcomposite key for client-side dedup recognition - Response size hints in all 4 tool docstrings — agents can plan token budgets before calling
Code Quality
- Pylint: 9.93/10
- Ruff: all checks passed
- Black: fully formatted
- Tests: 129 passed (up from 101), 0 failures
Full Changelog: v1.0.2...v1.0.3