ADR

ADR 001: Store provider config in the database

Decision: use search_providers rows instead of only static config.

Reason: provider activation, priority, timeout, and credentials often differ by environment and can change without deploys.

Consequence: migrations and secret encryption must be handled correctly in the host app.

ADR 002: Use one result contract

Decision: all providers return SearchResultCollection.

Reason: downstream AI/catalog workflows need a stable shape even when upstream APIs differ.

Consequence: driver tests must cover provider-specific response quirks.

ADR 003: Keep rate limits advisory

Decision: store rate_limit_per_minute but do not enforce it in the manager.

Reason: Laravel apps may already use queues, cache locks, external throttlers, or provider-specific budgets.

Consequence: production apps that require strict quotas should wrap providers with a rate-limiting decorator.