Repository navigation
fix(aggregator): charges producer — reject declined alerts and amount-due-only invoices (#3120) - #3193
Conversation
…-due-only invoices (#3120)
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 26 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 368faabff0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review |
|
Codex Review: Didn't find any major issues. Delightful! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Summary
Fixes #3120 (queue task 4577; triage task 4540 CONFIRMED both shapes on main).
The Gmail charges producer turned two NOT-a-charge shapes into charge candidates:
isNotChargeSubjecthad no declined/failed pattern, so "Your $20.00 purchase at OpenAI was declined" parsed amount + merchant via the at/was fallback and became a candidate.amountFromBody's bare-amount fallback accepted an "Amount due $20.00" body with no paid/charged evidence.Changes (
pm-stack/aggregator/scripts/produce-charge-candidates.ts)isNotChargeSubject(now exported for tests): addeddeclined|payment failed|purchase failed|transaction failed|unsuccessful|not approvedandamount due|balance duesubject gates.amountFromBody: paid/charged labels and the standalone-total label keep precedence (unchanged fix(aggregator): charges producer body fallback matches 'total' inside 'Subtotal', recording the subtotal as the charge (PR #2149) #3121 behaviour); if neither is present and the body carries due language (amount due|balance due|total due|payment due), it returnsundefinedinstead of falling through to the bare-amount fallback — due language is not payment evidence.Tests (
pm-stack/aggregator/test/produce-charge-candidates.test.ts)9 new tests pin: declined alert gated, failed-payment alert gated, amount-due subject gated, genuine purchase alert + receipt subject still charges, amount-due-only and balance-due-only bodies yield no amount, paid evidence wins when due language is also present, genuine receipt body still yields its amount.
Verified on the laptop worktree: targeted file 14/14 pass; charges suite (catalog/collect/feed-gate/match/push + producer) 42/42 pass. (Local
tscin the fresh worktree lacks installed bun types — a deps-not-installed artifact; CI typechecks with deps.)Need help on this PR? Tag
@codesmith-botwith what you need.