Each ### heading is meant to be copy-pasted as one GitHub Issue. Checkboxes
become the issue's task list. Suggested labels are in brackets.
- Create GitHub repo, add
.gitignorefor R (*.Rhistory,*.RData) - Confirm Colab R runtime works end-to-end (Runtime > Change runtime type > R)
- Add
financial_risk_engine.Rand confirm it runs top-to-bottom with simulated data - Write a short
README.md: what the project does, how to run it in Colab
- Find a Kaggle dataset for debt/collections or credit risk (search terms: "debt collection", "loan default", "credit risk dataset")
- Map its columns onto
MASTER_LEDGER_SCHEMAandRISK_REGISTRY_SCHEMA— note any gaps - Decide how to fill schema gaps (e.g. no
Cost_To_Acquirein the raw data → derive or simulate it) - Document the mapping decisions in
LEARNING_JOURNAL.mdorDATA_SOURCES.md
- Implement
load_and_validate_csv()against the real dataset (already stubbed in the script) - Handle type coercion issues (dates, TRUE/FALSE stored as 0/1 or "Y"/"N", etc.)
- Add at least 3 unit-style checks (row count > 0, no duplicate
Debtor_ID, no negativeOriginal_Debt)
- Merge Master Ledger + Risk Registry on
Debtor_ID - Confirm row count doesn't change after merge (catches join fan-out bugs)
- Decide and document how to handle debtors present in one dataset but not the other
- Implement
Remaining_Balance,Net_Profit - Decide the zero-balance interest edge case (see note below) and implement it
- Add
Days_Past_Dueusing a real "today" reference or a fixed evaluation date if working with historical Kaggle data
- Implement
Critical_Alert(active balance AND blacklisted/external debt) - Add a
Risk_Tierbreakdown (Clear / Watch / Critical / Severe) for more useful reporting than a binary flag - Validate against a few hand-picked rows to confirm the logic matches intent
- Implement email draft template (professional, urgent, includes balance/days past due/call to action)
- Implement SMS draft template, enforce the 160-character limit programmatically
- Export
notification_queue.csvfor manual review before any real send integration - Write a short section in the README on the legal/compliance considerations of automated collections messaging in your jurisdiction (this matters before ever wiring this to a real send step)
- Balance distribution histogram (Critical vs. non-Critical)
- Risk matrix scatter (balance vs. days past due, colored by tier)
- Monthly profit/loss bar chart
- Save all charts as PNG for the final report/demo deck
- Get
chattr(or a direct API call) working with a real LLM backend, OR - Extend the offline
ask_data()fallback with 3–5 more question patterns your grader/reviewer is likely to try - Document which option you used and why (API key friction is a legitimate reason to use the fallback for a class project)
- Zero-balance accounts: confirm they're never flagged Critical Alert
- Fully-paid accounts with external debt flags: confirm no false positive
- Duplicate
Debtor_IDacross datasets: confirm merge behavior is intentional, not accidental - Extremely large/small dollar values: confirm formatting doesn't break SMS length or currency display
- Finalize
README.mdwith setup, run instructions, and a screenshot of one chart - Finalize
LEARNING_JOURNAL.mdwith design decisions (schema choices, risk rule rationale, zero-balance resolution, chattr vs. fallback decision) - Record a 2–3 min walkthrough or write a short "system overview" doc if this is being presented
- Run the full script fresh in a clean Colab session start to finish, confirm no errors
- Sanity-check all output files (
unified_ledger.csv,notification_queue.csv,portfolio_summary.csv) - Peer review (if applicable) or self-review against the original spec, section by section
You mentioned this is still open. The two common approaches:
- No balance, no interest — if
Remaining_Balance <= 0, interest/penalty calculations simply don't apply, and the account can never beCritical_Alertregardless of blacklist/external-debt status. This is what the current script does implicitly, sinceCritical_AlertrequiresRemaining_Balance > 0. - Grace-period interest — some ledgers still accrue a small interest charge on a technically-closed account during a grace window (e.g. a late final payment). If your Kaggle dataset or assignment brief implies this, you'd add an
Interest_Accruedcolumn and a separate flag rather than folding it intoCritical_Alert, so the two concerns (repayment status vs. risk status) stay clearly separated.
Worth deciding this early since it affects both the risk rule and the notification templates.