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.pyis 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.dbis 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¶
- 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 benigndate range exceeds limit of 90 days and was cappedwarning on every run. - 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.
- 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.
Recommended fixes (NOT applied)¶
- Justin re-authenticates PNC at the SimpleFIN bridge (manual browser action; cannot be automated per doctrine).
- 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-runpost --applymanually; the timer handles posting. - Decide the sheet's fate: either port
forge_finance_sheet_mirror.pyto read lifeos PG and hook it as ExecStartPost offorge-creatortrack-finance-snapshot.service, or formally retire the "Wieb Finances" sheet and note it in the finance module topic file. - 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/