I hate finding out a trial flipped after the money is gone. Same with a $1 price creep, a gym I have not opened in two months, a charge that landed twice. None of that is hard. All of it is easy to miss. I wanted something that watches the card in the background and only talks when one of those four things is true.

RCS is a Recurring Charge Sentinel. Feed it a bank CSV or the demo stories. It classifies each line, updates a ledger, and stays silent unless:

  • a trial just became paid
  • the price jumped more than 5%
  • a sub is still charging and unused past 45 days
  • the same vendor and amount hit twice in three days

When a rule fires, it hands you keep / cancel / snooze / escalate. That is the whole product.

Strands Agents SDK with three tools: classify_charge, update_ledger_and_detect,reason_about_signal`. The four detectors are plain Python. The model does not decide if a price went up. It only writes the decision packet after a rule already fired. Offline stubs run with no AWS key. Bedrock Nova / Sonnet can replace the stubs when you want live models. Ledger can persist to JSON. Approval gate is AUTO or a human prompt. Audit log is JSONL.

The SDK wants a model in the loop. The product wants silence. We kept detection out of the model so a judge can rerun demo all and get the same four flags. CSV exports are messy. The fixture format is the contract: date, description, amount

Four canned stories, four signals, no chatter on clean charges Tests run offline MIT license rcs demo all auto strands is the demo.

An everyday agent should interrupt less, not more. If the rule is deterministic, keep it deterministic. Use the model for the sentence after the fact, not the fact.

Live bank export, a real cancel path, and a weekly digest that still stays quiet when nothing changed.

Built With

Share this project:

Updates

Submission history