Inspiration

I paid for four subscriptions I meant to cancel. I had the receipts. What I didn't have was one list that said "decide by this day". Reminder apps make you type every plan in by hand, and they believe you when you say you cancelled. The documents that prove what you pay for are already sitting on the NAS, so this Skill starts from them.

What it does

Contract Duty reads the receipts, invoices, contracts and subscription screenshots in one NAS folder and builds a "decide-by" ledger:

  • what each plan is, who bills it (Apple, Google Play or the company), how much, and when it renews or the trial ends;
  • the last safe day to cancel, with the calculation written next to it (Apple: end date minus 2 days, because Apple asks for 24 hours before renewal; Google Play: minus 1 day; contracts: minus the notice period quoted from the clause);
  • sorted by that day, so the next decision is always at the top.

Run it again next month with the saved ledger and it compares: a plan you marked "cancelled" that still has a newer receipt is flagged charged after cancellation. A claim of cancelling is not proof; the next receipt is.

It never cancels anything, logs in anywhere, or moves or deletes files. Saving the ledger needs your yes and the platform's approval.

How I built it

A Uliya orchestration Skill written with the official uliya-skill-kit (0.7.7) and checked against its capability catalog. The parent Skill only delegates:

  1. file-agent (ug-filesystem find) finds candidate files in the folder you name.
  2. document-agent (ug-document extract) reads billing facts, with dedupe and low-confidence flags.
  3. photo-agent (ug-photo vision-ocr) reads screenshots; those facts are marked "from screenshot".
  4. document-agent (ug-document qa) quotes cancellation clauses when the notice period is missing.
  5. The Skill applies the date rules and builds the ledger; file-agent reads the previous ledger by path on repeat runs.
  6. knowledge-agent (ug-knowledge save-text) saves the ledger as Markdown after approval.

Every step passes on only the real values returned as completed. Empty, failed, cancelled, waiting_user and waiting_approval are each handled, and nothing is invented.

Challenges

  • Keeping the dates honest. Unknown terms stay "check terms" or "date missing" instead of a guess, and every date shows its rule.
  • Designing the repeat run so the ledger itself becomes the memory, read back by its known path rather than through search.

What's next

Test on a real UGREEN NAS with fictional receipts: two core cases (six mixed receipts; a "charged after cancellation" repeat run) and one edge case (only unreadable scans → honest empty result).

Disclosure

No third-party components; the package is Markdown only and uses UGREEN platform experts through delegate. All files were written on Nov 15–16, 2026 for this hackathon. The idea comes from my own forgotten cancellations and a separate web prototype I built at another hackathon on Nov 15; no code or text is reused. Claude Code (Anthropic) helped me read the kit and draft the files under my direction.

Built With

Share this project:

Updates

Submission history