Skip to content

Finance Pipeline End-to-End Audit, 2026-07-06

Read-only audit run ~16:30 CDT on Console. No syncs, posts, restarts, or writes performed.

Architecture note (verified, corrects the prior mental model)

The SQLite-first pipeline is retired. Since the CreatorTrack finance module cutover (finance.db frozen 2026-07-05 ~19:01 CDT), the canonical flow is:

SimpleFIN -> forge_creatortrack_finance_jobs.sh sync (jobs route, FINANCE_JOBS_TOKEN, :3070) -> lifeos Postgres finance.* -> CreatorTrack UI + ERPNext daily post.

  • Old user timers forge-finance-sync.timer, forge-finance-snapshot.timer, forge-finance-receipt-reconcile.timer: all disabled.
  • scripts/forge_finance_migrate_to_lifeos.py is a one-time truncate-and-backfill tool (dry-run by default), not a per-sync mirror. It is not scheduled and should not be re-run.
  • SQLite data/finance/finance.db is a frozen legacy copy and will drift behind PG by design.

Health table

Component Last success Data freshness Status Evidence
SimpleFIN sync (forge-creatortrack-finance-sync.timer, 3x daily) 2026-07-06 13:00 CDT, HTTP 200 PG max tx posted_at 2026-07-05 18:45 UTC; 28/28 balances written 07-06 (PG max as_of 2026-07-06 15:42 UTC); Jul 6 runs found 0 new txns (normal posting lag) OK, one institution degraded journalctl user unit: sync -> 200 ... 28 accounts seen, 28 balances written (0 missing); warning: Connection to PNC Bank may need attention. Auth required
PG finance.* (lifeos, write authority) continuous tx 8837 (7969 live), balances 2644, accounts 62, holdings 23; ahead of frozen SQLite (8812 tx / 2560 bal / max tx 07-03, mtime 07-05 19:01) OK direct SELECTs via forge_workspace_db.admin_connect()
SQLite -> PG mirror (forge_finance_migrate_to_lifeos.py) n/a (retired) n/a RETIRED by design script docstring: one-time backfill, truncates finance.*; no unit references it
CreatorTrack prod :3070 serving now next-server pid 1184171 on :3070; /login 200; jobs route returning 200s all weekend OK ss -ltnp; sync journal 200 responses 07-05 21:54, 07-06 07:01, 07-06 13:00
Receipts reconcile (forge-creatortrack-finance-receipts.timer) 2026-07-06 08:00 CDT daily 08:00 OK list-timers LAST column
Weekly snapshot (forge-creatortrack-finance-snapshot.timer) 2026-07-05 21:53 CDT Sundays 18:00 cadence OK list-timers; unit runs finance_jobs.sh snapshot
ERPNext daily post (forge-erpnext-post.timer, 4x daily :21) 2026-07-06 13:20 CDT, posted 1/1 (rc_post=0) 07-06 01:20 run posted 20/20 (through 07-03); JVs confirmed in ERPNext via GET: ACC-JV-2026-00298 posting_date 2026-07-05 docstatus 1, plus 00282-00297 for 07-02/07-03 OK, perpetual warning noise logs/erpnext-daily-post.log; API GET Journal Entry list
ERPNext verify step never (rc_verify=2 every run since at least 07-05) n/a DEGRADED (known, single item) log FINDINGS every run: clearing leg unpaired >7d: txn 27856 [2026-06-09] -3,477.73 Sip 'N' Serve Society LLC (run \sweep`)`; fires "ERPNext daily post needs attention" warning every 6h
Google Sheets net-worth backup (forge_finance_sheet_mirror.py) 2026-07-05 08:01 CDT ("mirrored: 55 accounts, 139 history weeks, net worth $216,056.69") Sheet "Wieb Finances" Net Worth tab last row: 2026-06-29, $218,699 (153 rows) BROKEN going forward (orphaned) mirror is ExecStartPost of forge-finance-snapshot.service only; that timer is now disabled; new forge-creatortrack-finance-snapshot.service does NOT call it; script reads frozen SQLite anyway

Root causes and gaps

  1. PNC Bank not refreshing at SimpleFIN. Every sync since at least 07-05 carries Connection to PNC Bank may need attention. Auth required. Balances/txns for PNC accounts are riding on stale bridge data. Also a benign date range exceeds limit of 90 days and was capped warning on every run.
  2. ERPNext verify never goes green. rc_verify=2 solely from txn 27856 (2026-06-09, -3,477.73, Sip 'N' Serve clearing leg unpaired >7d). Posting itself is healthy (90 posted, 0 held, 0 unhandled as of 07-06). The 4x-daily warning notification is pure noise until this one txn is swept.
  3. Sheets backup orphaned by the cutover. Last push was the final run of the retired forge-finance-snapshot.service (07-05 08:01). Nothing will write the sheet next Sunday: the new CT snapshot unit has no ExecStartPost, and the mirror script reads the frozen SQLite, so even a manual run would push stale numbers.
  1. Justin re-authenticates PNC at the SimpleFIN bridge (manual browser action; cannot be automated per doctrine).
  2. One-time python3 scripts/forge_erpnext_daily_post.py sweep (the script's own suggested remedy) to pair clearing txn 27856, then confirm next run shows rc_verify=0. Do NOT re-run post --apply manually; the timer handles posting.
  3. Decide the sheet's fate: either port forge_finance_sheet_mirror.py to read lifeos PG and hook it as ExecStartPost of forge-creatortrack-finance-snapshot.service, or formally retire the "Wieb Finances" sheet and note it in the finance module topic file.
  4. Update data/finance/COORDINATION.md / topic files that still describe SQLite as write authority with the per-sync migrate mirror; that path no longer exists.

URL: https://mkdocs.justinsforge.com/memory/handoffs/finance-pipeline-audit-2026-07-06/