finance — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited finance (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
/finance-pulse/finance-cleanup/finance-trip/amazon-syncAnswer open-ended financial questions using transaction data, account balances, and the user's financial profile. This is the thinking skill — it reasons about affordability, tradeoffs, and financial decisions.
~/.claude/copilot-money/user-profile.md. If the file doesn't exist: run mkdir -p ~/.claude/copilot-money, then copy skills/user-profile.template.md (relative to the copilot-money-mcp repo root) to the profile path. First-time bootstrap may require CWD = repo root for the template read. You need:If the profile is mostly empty, suggest: "I need some baseline numbers to answer this well. Want to run /finance-pulse first to set up your profile?"
get_transactions_live (live), you are in live mode — always the case when write tools are on. If it has get_transactions (cache) instead, you are in cache mode. Call only the tool for your mode. Based on the question:get_accounts_live (live) / get_accounts (cache).get_transactions_live (live) / get_transactions (cache) with period: "this_month". The default terse row carries what this skill reasons about (amount, date, name, category_name).fields: ["default", "type"] to get_transactions_live (live), so the spend recipe in 2.1 can keep REGULAR rows only.fields: ["default", "original_name"] to get_transactions (cache) when you are going to SHOW transactions: Rule 6 asks for the full merchant name, and original_name is not in the default row. Live rows have no such field; show name.get_upcoming_recurrings_live (live) for bills due soon and get_recurring_live (live) for the full list, or get_recurring_transactions (cache).get_categories_live (live) / get_categories (cache). Compute the category's spending from the transaction rows (2.1), not from this tool.get_goals (both modes).Does the purchase fit within Free Money?
Free Money = Net Monthly Income
− Fixed Obligations
− Savings Target
− Amortized Irregular Expenses
− Already Spent This Month (actual merchant charges, not profile estimates)Use the same computation as /finance-pulse. If the profile has these numbers, use them. If not, compute from transaction data using Python via Bash.
"Spent this month" must match the app. When you quote what the user has spent this month, in total or for a category, use /finance-pulse section 2.2, which is how the Copilot app computes it. Summing every amount is wrong, because income rows are negative. In short:
type is REGULAR in live mode. In cache mode rows have no type, and skipping uncategorized rows drops income.get_upcoming_recurrings_live (live). It appears to cover only about the next 14 days, so also add the get_recurring_live (live) rows whose nextPaymentDate falls later in this month, and drop duplicates by id. For a month that has ended, this term is zero.Skipping step 5 under-reports by exactly the unpaid bills, which is the gap the app's figure shows. For Free Money's "Already Spent" term, use steps 1–4 only: unpaid fixed bills are already in Fixed Obligations.
Will account balances stay above a safe buffer after the purchase clears?
If budget check says "yes" but cash flow says "no" (or vice versa), explain the contradiction:
What would the user need to give up or adjust?
Scale the comparison to something relatable. Don't just show numbers — show what they mean.
Proactively flag relevant context:
Tone: Match ~/.claude/copilot-money/user-profile.md Communication Style. Default: blunt, dollar amounts.
Never give binary yes/no. Always present:
Scaling output to magnitude:
Small ($30 book):
That's fine. You have $2,449 left this month — $144/day for 17 days. A $30 book barely moves the needle.
Medium ($200 dinner):
Tight but possible. You have $2,449 left this month ($144/day). A $200 dinner drops that to $2,249 ($132/day) — still workable, but you've already spent $630 on restaurants this month, about twice your usual.
Large ($1,500 weekend trip):
Would create strain. You have $2,449 in Free Money this month. A $1,500 trip would leave $949 for the remaining 17 days ($56/day vs your usual $187/day pace).
>
Your next paycheck ($4,611) lands around Apr 17, which helps — but your rent ($3,142), credit card autopays, and subscriptions will eat most of it.
>
If you want to do this: push discretionary spending to near-zero for the rest of April, and you'll be fine by May 1.
If the user asks "what if" variations, re-run the analysis with the new parameters. Keep the conversation flowing — don't re-pull all data unless the question changes significantly.
If the question reveals new financial context (e.g., "I'm getting a raise next month"), offer to update the profile: "Want me to update your income in the profile?"
name or original_name, never truncated./finance-pulse, /finance-cleanup, or /finance-trip, suggest it. Don't try to replicate their functionality.get_budgets_live (live) / get_budgets (cache). The amount Copilot returns for this month has rollover applied (in live mode it is budget_amount on get_categories_live (live)), so it is not the figure the user set: it can be far above it, or negative after an overspent month. Don't phrase it as "your $X budget is at $Y". If a budget is useful context, say what is left: "you have about $20 left in your restaurant budget this month". Skip a budget whose amount is zero or negative.get_goals returns 0, Free Money doesn't reserve for savings. Flag this in affordability analysis: "Note: you have no savings target set, so this calculation doesn't protect any savings."refresh_cache (live). In cache mode, reads come from the local LevelDB cache that the Copilot Money app syncs, which can lag behind the app. If data looks stale, call refresh_database (cache), and if that does not help, ask the user to open the Copilot app so it syncs.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.