This skill only assembles and flags. It never writes a journal entry, never
edits a recorded ledger amount, and never marks the checklist or the period
as closed.
Step 0 — Orient from the sheet, not from memory
This is a fresh session — there is no prior turn to resume. {{close_sheet}}
is the memory.
- Open
{{close_sheet}} and read the checklist tab's current state and the
prior month's close-status notes (recurring explained swings, standing
reconciliation tolerances, checklist items with a documented exception).
- Set the period to the calendar month that just closed (the month before
{{cadence}} fired, unless a human gives an explicit period).
Step 1 — Pull Stripe revenue for the period
Read (never write) Stripe for the closed period: charges, refunds, and
payouts, with amount, date, and the associated invoice/customer reference for
each. This is the source of truth you reconcile the ledger against.
Step 2 — Reconcile revenue against the ledger
Read (never write) the ledger tab in {{close_sheet}} for the same period.
For every revenue line:
- Exact match — the ledger's recorded amount matches Stripe for the
period. Tie out silently.
- Tolerance match — the difference is explained by a recurring,
already-noted pattern in the sheet (a disclosed fee, a standing timing
lag). Tie out with a one-line reference to the existing note.
- Unreconciled — anything else: a Stripe amount with no matching ledger
line, a ledger line with no matching Stripe activity, or a difference
bigger than an existing explanation covers. This is an open item.
Step 3 — Walk the rest of the checklist
For every remaining checklist item (bank reconciliation attached, AR aging
reviewed, accruals booked, deferred revenue schedule updated, and whatever
else {{close_sheet}} lists), check whether the required supporting document
or evidence is present and linked. Anything missing is an open item: name the
checklist row and exactly what's missing.
Step 4 — Compare against prior months for anomalies
Pull the trailing months of ledger and checklist history from
{{close_sheet}}. Flag a figure as an anomaly when:
- It swings more than the sheet's tolerance (default 15% unless the sheet
states otherwise) against the trailing average, and
- The swing has no existing explanation already noted on the sheet.
A swing with a standing explanation (a known seasonal pattern, a one-time
event already logged) ties out silently — don't re-flag it every month.
Step 5 — Write flags to the checklist, never the ledger
Update only the checklist tab's status and flag columns in {{close_sheet}}:
per-item status (clean / needs doc / unreconciled / anomaly) with a short
reason. Never edit a ledger amount, never add a journal line, and never check
off "period closed" or any equivalent completion status — that's a human
action after review.
Step 6 — Post the close-status summary
Post one summary to {{close_channel}}: the period covered, the checklist
completion rate, and every open item grouped by kind (unreconciled revenue,
missing docs, anomalies), each with what a human needs to resolve it. This is
the only channel output for the run.
Step 7 — Stop — hand off to a human
Your last actions are the checklist flags and the Slack post. You never
write a journal entry, never adjust a ledger amount, and never mark the
checklist or the period as closed. The finance team reviews the open items
and closes the books themselves.