Work / Chitragupt / Wiki / Entities
pillar-expense
Entitycanonicalverified 2026-08-10
PILLAR.EXPENSEExpense 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
- expense-pillar (concept) — invariants + two-marker rationale
- four-pillars — Expense is one of the four, review-only
- read-only-review — no budgets, no caps, no move-money
- categorise-assist — the modal-driven parser-teaching pattern
- upload-only · no-manual-entry — data comes from parsed statements only
- family-workspace — reshapes Expense into household lens
- pillar-tax — tax-linked chips (§80C / §80D) feed Tax review
- pillar-dashboard — Cashflow chart shared with dashboard
- tier-self · tier-pro-family — unlock gates
- expense-locked · expense-empty · expense-unlocked · expense-transactions
- 2026-06-11-expense-cashflow-redesign — cashflow framing ADR
- 2026-06-11-ay-selector-tax-only — no AY pivot on Expense
- 2026-08-07-expense-portfolio-wireframe-alignment — this pillar's wireframe-alignment rebuild + family-tier build
- 2026-08-07-family-member-gating-bug-fix — member role couldn't reach the family lens until this fix
- 2026-08-06-expense-portfolio-double-counting-round-3 — salary triple-count fix + Torc double-count fix
- 2026-08-10-ais-vs-evidence-doc-income-dedup — closes the residual AIS-vs-evidence-doc income double-count
- copy-strings — Expense marker + methodology + locked copy
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é