jml
4012791e7e
fix(api): enable non-strict mode for URL-encoded bracket notation
## Problem
Dashboard sends URL-encoded query parameters:
?sources%5B%5D=rfc&sources%5B%5D=owasp
(%5B = '[', %5D = ']')
But QsQuery extractor used strict mode, which rejects encoded brackets:
Error: "Invalid field contains an encoded bracket"
Result: All corpus filters in the dashboard failed silently.
## Solution
Changed QsQuery to use serde_qs non-strict mode:
Config::new(5, false) // false = non-strict
Now accepts BOTH:
- Literal brackets: ?sources[]=rfc
- Encoded brackets: ?sources%5B%5D=rfc (browsers)
## Verification
✅ URL-encoded query: ?sources%5B%5D=rfc&sources%5B%5D=community
Returns: 24 items (was: error)
Logs: sources=Some(["rfc", "community"]) ✅
✅ Literal brackets: ?sources[]=rfc (still works)
✅ All 4 extractor tests pass (added encoded brackets test)
✅ Clippy clean (0 warnings)
## Files Changed
- crates/stemedb-api/src/extractors.rs: Use non-strict Config
- crates/stemedb-api/README.md: Document QsQuery usage
- .claude/guides/backend/api-endpoints.md: Add best practices
- CLAUDE.md: Reference extractors documentation
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>