Skip to content
Ritesh FirodiyaGet in touch

Work / Chitragupt / Wiki / Entities

pillar-expense

Entitycanonicalverified 2026-08-10

PILLAR.EXPENSE

Expense pillar

Summary

Household cashflow lens — review-only. KPI strip (4 metrics) → stacked cashflow chart with two independent markers → where-money-went donut → largest single outflows. Categorisation is a parser-teaching pattern, never an external action. See expense-pillar for invariants.

Canonical values

Key Value Last changed
PILLAR.EXPENSE.ROUTE /expense (review) + /expense/transactions (categorisation workbench) 2026-07-10
PILLAR.EXPENSE.STATES locked · empty · review · transactions · family-locked · family-combined + categorise (modal) 2026-07-10
PILLAR.EXPENSE.KPI-STRIP.METRICS Income · Expense · Invested · Saving (4 metrics, not 3) 2026-07-10
PILLAR.EXPENSE.KPI.DEFINITIONS Income = salary + refunds + interest · Expense = consumption + EMI + tax + rent · Invested = money moved into MFs / stocks / FDs · Saving = Income − Expense. 2026-08-06 fix: generic bank credits (bank_credit) no longer default to entry_class: "income" — every real income type already has its own dedicated, better-sourced ledger entry (salary, foreign remittance, professional receipts, interest, dividends); a bare bank credit lands in entry_class: "other" (excluded from every KPI) instead of double-counting a salary already captured via Form 16/payslip. Also fixed same-day: Form 16's salary_gross (when present) now suppresses the salary_gross_monthly payslip-fallback sum instead of adding to it — one real AY dropped from a false ₹34.7L "Income" to the real ₹14.6L. 2026-08-10: the entry_class: "other" exclusion also now absorbs AIS rows demoted by reconcileAisAgainstEvidenceDocuments when they duplicate a bank-interest-cert/broker-dividend-log/mf-cas row — see 2026-08-10-ais-vs-evidence-doc-income-dedup. 2026-08-06
PILLAR.EXPENSE.MARKER.DEFICIT ▼ rose — Expense > Income. Consumption exceeded income. 2026-07-10
PILLAR.EXPENSE.MARKER.DREW-FROM-BALANCE ▲ blue — Invested > (Income − Expense). Drew from stored balance to invest. Not a deficit. 2026-07-10
PILLAR.EXPENSE.MARKER.INDEPENDENCE Both markers can appear independently; a month may carry ▲ without ▼ (Feb example: "Income ₹3.20L covered ₹2.34L expenses (no deficit). You then invested ₹2.82L — ₹86k from surplus + ₹1.96L drawn from your saved balance.") 2026-07-10
PILLAR.EXPENSE.CHART.CASHFLOW-12M V1 ✅ — stacked bars (Expense rose · Invested blue · Saving amber) + Income (emerald) line + marker glyphs (▲/▼) per month. Shared with pillar-dashboard. 2026-07-10
PILLAR.EXPENSE.CHART.WHERE-MONEY-WENT-DONUT V1 ✅ — 8 categories: Housing · Food & groceries · Loan EMI · Other · Transport · Tax · Subscriptions · Health 2026-07-10
PILLAR.EXPENSE.CHART.LARGEST-OUTFLOWS V1 ✅ — ≥ ₹25,000 this AY · excludes investments & family transfers. Rows carry tax-linked chips (§80C · §80D · §80C · Edu · Loan · Housing) that feed pillar-tax. 2026-07-10
PILLAR.EXPENSE.RANGE-SELECTOR 1M · 3M · 6M · 1Y · Custom (default 1Y) — only date control 2026-07-10
PILLAR.EXPENSE.AY-PIVOT none — no AY selector on Expense. AY may appear in copy labels only (2026-06-11-ay-selector-tax-only). 2026-06-26
PILLAR.EXPENSE.BUDGETS not supported — permanently out of scope. See read-only-review. 2026-06-26
PILLAR.EXPENSE.CATEGORY.TAXONOMY.BASE 8 base + tax-linked chip list on categorise-assist: §80C invest · §80D health insur · §80DDB · §80C · Edu · Insurance · Loan · Housing · Transfer · Gift / loan · One-off · skip · + Custom 2026-07-10
PILLAR.EXPENSE.MERCHANT-RULES on — created from categorise-assist modal ("Apply to all future <MERCHANT> charges" checkbox); editable in Settings · Merchant rules (e.g. "23 active") 2026-07-10
PILLAR.EXPENSE.CATEGORISE-ASSIST Modal on transactions surface — see categorise-assist. Shows txn context, merchant-history suggestions with confidence % (computeSuggestions — real frequency count / history.length over that merchant's past categorisations, not an invented ML score), full chip menu, and merchant-rule creation. Skip + Save-next auto-advances through the uncategorised queue. Header: "Pick a category — teach the auto-categoriser". 2026-08-07 fixes: (1) merchant rules (expense_category_overrides) were written on save but never consulted at parse time for future statements — now threaded through MapperContext → bank-statement.ts; (2) extractMerchant() was returning the literal "DR"/"CR" debit/credit marker as the merchant name for the dominant SBI UPI narration shape (UPI/DR/<ref>/<payee>/...) — affected 59% of a real user's expense rows; (3) the SBI PDF row extractor was silently truncating narration before the payee text for a large fraction of real bank-statement PDFs (pdfjs's flattened single-line-per-page text put the Ref No. column after the amount columns, and the row parser never read past them) — see 2026-08-07-broker-holdings-statement for the full real-data audit. 2026-08-07
PILLAR.EXPENSE.TRANSACTIONS.TABLE Columns: Date · Merchant · Account · Category · Amount. Filters: search / category / account / date range (default 1Y). Totals strip: Showing · Inflow · Outflow · Net · Uncategorised. Aside: uncategorised queue + Download CSV + Add a merchant rule. 2026-07-10
PILLAR.EXPENSE.LOCKED.STATUS "Expense Review is locked for AY 2026-27" · Unlock · ₹249 2026-07-10
PILLAR.EXPENSE.FAMILY.LENSES Built 2026-08-07, real per-member data throughout, all backed by getFamilyExpenseOverview: HouseholdBurnDonut (household burn split by member, SCOPE HIDDEN chip on un-granted members) · StackedByMemberChart (12M stacked-by-member) · CategoryByMemberGrid (category × member) · OttOverlapCard (same merchant_slug on subscriptions category paid by ≥2 members in the same month — detected, not invented) · TopMerchantsHouseholdTable · HouseholdAdvisorCard (real §80D senior-parent hint: relationship === "parent" + their health-category spend, not fabricated AI copy). Status banner: "Pro Family active · <N> PANs combined · <X>% household save rate · <N> OTT subs overlap (₹<Y>/yr saveable)" — each clause conditional on real data being present. Joint-bill split is NOT built — never appeared in this session's implementation; treat as an open gap, not a shipped feature, until built. 2026-08-07
PILLAR.EXPENSE.FAMILY-LOCKED.CTA "Upgrade · ₹550" (delta from Self) → ₹799 total 2026-07-10

Related

Sources

  • .context/designs/web/expense/*.html (7 files — see expense-pillar Sources)

Every project of mine is written down like this.

Read the résumé