Skip to content

feat(ai-service): add per-claim verification cooldown - #1444

Open
omoh25 wants to merge 1 commit into
Pulsefy:mainfrom
omoh25:feat/verification-cooldown
Open

omoh25 wants to merge 1 commit into
Pulsefy:mainfrom
omoh25:feat/verification-cooldown

Conversation

@omoh25

@omoh25 omoh25 commented Oct 15, 2026

Copy link
Copy Markdown

Enforce a configurable minimum interval between verification attempts for the same claim identity on both the humanitarian and fraud endpoints.

  • services/verification_cooldown.py: in-memory, thread-safe, LRU-bounded cooldown service. check() returns (in_cooldown, prior_result); record() stores the fresh outcome. cooldown_seconds=0 disables it entirely. Process-wide singleton via get_cooldown_service(), injectable via app.state.cooldown_service for tests.
  • schemas/common.py: add from_cooldown: bool field to ResultEnvelope so callers can distinguish a replayed response from a fresh computation.
  • config.py: add verification_cooldown_seconds (default 60 s, env var VERIFICATION_COOLDOWN_SECONDS).
  • api/v1/humanitarian.py: cooldown check runs after all access-control gates; hits return prior result with from_cooldown=True; fresh results are recorded in the store before returning.
  • api/v1/fraud.py: same pattern, keyed on anchor claim_id; batches without an anchor always process fresh.
  • .env.example: document VERIFICATION_COOLDOWN_SECONDS=60.
  • tests/test_verification_cooldown.py: 32 tests covering inside/outside window, disabled cooldown, LRU eviction, key builders, and endpoint integration for both humanitarian and fraud.
    closes Add a Configurable Cooldown Between Repeated Verification Attempts for the Same Claim聽#1426

Enforce a configurable minimum interval between verification attempts
for the same claim identity on both the humanitarian and fraud endpoints.

- services/verification_cooldown.py: in-memory, thread-safe, LRU-bounded
  cooldown service. check() returns (in_cooldown, prior_result); record()
  stores the fresh outcome. cooldown_seconds=0 disables it entirely.
  Process-wide singleton via get_cooldown_service(), injectable via
  app.state.cooldown_service for tests.
- schemas/common.py: add from_cooldown: bool field to ResultEnvelope so
  callers can distinguish a replayed response from a fresh computation.
- config.py: add verification_cooldown_seconds (default 60 s, env var
  VERIFICATION_COOLDOWN_SECONDS).
- api/v1/humanitarian.py: cooldown check runs after all access-control
  gates; hits return prior result with from_cooldown=True; fresh results
  are recorded in the store before returning.
- api/v1/fraud.py: same pattern, keyed on anchor claim_id; batches
  without an anchor always process fresh.
- .env.example: document VERIFICATION_COOLDOWN_SECONDS=60.
- tests/test_verification_cooldown.py: 32 tests covering inside/outside
  window, disabled cooldown, LRU eviction, key builders, and endpoint
  integration for both humanitarian and fraud.
@drips-wave

drips-wave Bot commented Oct 15, 2026

Copy link
Copy Markdown

@omoh25 Great news! 馃帀 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 馃殌

Learn more about application limits

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add a Configurable Cooldown Between Repeated Verification Attempts for the Same Claim

1 participant