Skip to content
Ritesh FirodiyaGet in touch

Work / Chitragupt / Wiki / Entities

pillar-portfolio

Entitycanonicalverified 2026-08-10

PILLAR.PORTFOLIO

Portfolio pillar

Summary

Household investment lens — review-only, observation-only. Asset-allocation donut · portfolio-vs-Nifty trajectory · per-AY CG-booked timeline · three observation panels · goal-mapping. Holdings from parsed statements only; no trades, no advice. See portfolio-pillar for invariants.

Canonical values

Key Value Last changed
PILLAR.PORTFOLIO.ROUTE /portfolio (review) + /portfolio/holdings (drill) 2026-07-10
PILLAR.PORTFOLIO.STATES locked · empty · review · cg-booked · holdings · family-locked · family-combined · view-only (member) + map-goal (modal) 2026-07-10
PILLAR.PORTFOLIO.REVIEW.BLOCK-ORDER Main column: (1) Allocation donut + "vs balanced ideal" · (2) Portfolio-vs-Nifty trajectory · (3) CG booked per AY · (4) Holdings drill link. Sticky aside: (5) Goals · funding pace · (6) the three observation panels. Corrected 2026-09-07 — the numbering used to read "(4) Observation panels · (5) Goals aside" without naming a column, and the code took it literally, rendering the panels as a full-width 3-column grid in <main>. Both portfolio-review.html and portfolio-holdings.html put all four blocks inside <aside>, and PATTERN-PANELS below already called them "asides". See 2026-09-07-portfolio-observation-panels-belong-in-aside. 2026-09-07
PILLAR.PORTFOLIO.CHART.ALLOCATION-DONUT V1 ✅ — 4 buckets: Equity + MFs · FDs + bonds · EPF + NPS · Cash. "vs balanced ideal" comparison table Now / Ideal / Δ. 2026-07-10
PILLAR.PORTFOLIO.CHART.PORTFOLIO-VS-NIFTY V1 ✅ — Chart.js: ₹ invested blue bars + Realised gain emerald + Realised loss rose stacked + Your value emerald line + Nifty 50 hypo dashed grey line. Shared with pillar-dashboard. 2026-07-10
PILLAR.PORTFOLIO.CHART.CG-BOOKED-PER-AY V1 ✅ — per-AY LTCG + STCG timeline. Callout: "₹1.25L of long-term capital gains exemption unused this AY (the annual §112A limit)". 2026-07-10
PILLAR.PORTFOLIO.PATTERN-PANELS V1 ✅ — three narrative-list panels stacked vertically in the sticky aside (see REVIEW.BLOCK-ORDER), ranked by RUPEES gained/lost, not by percentage: "What lost you money" · "What made you money" · "Gaps in your safety net". Replaces earlier HOLDINGS-PNL-BAR mental model. 2026-07-10
PILLAR.PORTFOLIO.STATUS-BANNER "From your 5-year trading history we found <N> patterns — <a> that lost money · <b> that made money · <c> gaps in your safety net" + disclaimer "Observations from your own data, not investment advice." 2026-07-10
PILLAR.PORTFOLIO.BALANCED-IDEAL 60 / 25 / 10 / 5 (Equity+MFs / FDs+bonds / EPF+NPS / Cash) 2026-07-10
PILLAR.PORTFOLIO.TAXONOMY.ASSET-CLASS Donut buckets: Equity + MFs · FDs + bonds · EPF + NPS · Cash (4) 2026-07-10
PILLAR.PORTFOLIO.TAXONOMY.HOLDING-CLASS Holdings filters: Equity · MF · FD · EPF · REIT · SGB (6). MF sub-classes: Debt MF · Flexi MF · Index MF. 2026-07-10
PILLAR.PORTFOLIO.INGESTION.BROKER-HOLDINGS Built 2026-08-07 — broker-holdings-statement doc type (Zerodha Console "Holdings" export, Combined sheet) is the ONLY ingestion path with real per-instrument current market value; feeds ONE portfolio_holdings/portfolio_positions row per instrument (keyed by ISIN), unlike every other portfolio doc type which collapses to a single synthetic position per statement. Previously misclassified onto broker-cg — a real user's ₹25L equity+MF portfolio was invisible on the Portfolio page as a result. See 2026-08-07-broker-holdings-statement. 2026-08-07
PILLAR.PORTFOLIO.HOLDINGS-TABLE.COLUMNS Holding · Class · Account · Goal · Value · YTD · Notes (7). No qty / LTV / unrealised-gain columns. Note (2026-07-12): the YTD column currently displays total return since inception = (NAV − cost) / cost — real YTD (FY-start to now) requires a monthly NAV snapshot job (V2). Field name migrated from ytd_return_pct → total_return_pct per 2026-07-12-portfolio-position-dedup. 2026-08-07 fixes: latestPerHolding() now dedupes portfolio_positions to one row per holding (positions intentionally keep one row per (holding, AY) for history; the table wasn't collapsing that, so e.g. a 4-year PPF position showed as 4 rows); computeHoldingsTotals() now only pools cost_paise > 0 rows into the YTD ratio (EPF/PPF's zero cost-basis was poisoning the household YTD figure — same root cause as 2026-07-12-portfolio-position-dedup, not previously applied to this call site). 2026-08-07
PILLAR.PORTFOLIO.HOLDINGS.STATUTORY-BADGE EPF and similar carry "Locked · Statutory · <rate>% guaranteed" in Notes column 2026-07-10
PILLAR.PORTFOLIO.GOAL-MAPPING First-class Portfolio surface — see portfolio-goal-taxonomy. Unmapped-count banner + progress counter. Map-goal modal (MapGoalModal, rebuilt 2026-08-07): real suggestGoals() horizon-matching (SHORT_HORIZON_ASSET_CLASSES = fd/cash/bond/debt_mf vs LONG_HORIZON_ASSET_CLASSES = equity/equity_mf/index_mf/epf/nps/ppf — not fabricated AI), separate Cancel + Skip buttons. Not built — scoped out, not fabricated: split-across-goals % and an "apply to future units" SIP auto-mapping rule; both need schema work this session didn't take on. Goal mapping is Portfolio-only and never mutates the source statement. 2026-08-07
PILLAR.PORTFOLIO.GOAL-MAPPING.ADMIN-ONLY-IN-FAMILY In Family workspace, mapping is admin-only; view-only members get read-only footer 2026-07-10
PILLAR.PORTFOLIO.CG.RATES Equity §111A STCG @ 20% · Equity §112A LTCG @ 12.5% over ₹1.25L. Debt MF (per Finance Act 2023 + 2024): STCG at slab · LTCG at 20% w/ indexation (pre-1-Apr-2023 units up to 22-Jul-2024) · 12.5% w/o indexation (pre-1-Apr-2023 units post-23-Jul-2024) · slab (post-1-Apr-2023 units). VDA §115BBH flat 30%. See 2026-07-12-debt-mf-treated-independently-of-equity-cg. 2026-07-12
PILLAR.PORTFOLIO.CG.DEBT-MF-DATA-STATUS Real, non-zero as of 2026-08-10-debt-mf-capital-gains-three-regime-split — was dead code before: mf-cas's ledger mapper read 4 debt-CG fields no schema/extractor ever populated, so portfolio-review-engine.ts's debt_mf_stcg/ltcg_indexed/ltcg_flat/ltcg_slab buckets always evaluated to zero. Now emits real data from broker-cg's "Non Equity" section (Zerodha Console per-row Entry/Exit dates → packages/parser/src/broker-cg/debt-cg.ts classifier). mf-cas (CAMS/KFintech CAS) remains a documented no-op — no real CAS document in the corpus proves it prints per-lot dates, so no fixture-backed extraction was added there rather than guessing. 2026-08-10
PILLAR.PORTFOLIO.CG.HEADROOM-PERSONAL ₹1.25L per AY (§112A annual exemption) 2026-07-10
PILLAR.PORTFOLIO.CG.HEADROOM-FAMILY Not a flat N × ₹1.25L formula — household_cg_headroom_paise (getFamilyPortfolioOverview) sums each granted, scope-visible member's own real ltcg_exemption_paise from their portfolio_reviews/{ay} doc (already AY-versioned via the real rule tables). Members who haven't shared portfolio_holdings don't contribute. Copy: "Chitragupt surfaces the sequencing — each member executes via their own broker." 2026-08-07
PILLAR.PORTFOLIO.CG.LOT-CLASSIFICATION Not built — known gap, not a silent drop. Investigated 2026-08-07: the broker-cg mapper (BrokerCgFieldsSchema) only extracts aggregate STCG/LTCG totals, zero per-trade line items — the wireframe's flagged-lots / FIFO / specific-lot workflow is unbuildable without parser work to extract per-trade data first. User chose to skip rather than fabricate. The Portfolio review page's CG section still renders its real aggregate STCG/LTCG (RealisedCgSection); only this drill-down is missing. See 2026-08-07-expense-portfolio-wireframe-alignment. 2026-08-07
PILLAR.PORTFOLIO.CG.TAX-FLOW CG numbers feed pillar-tax deterministically 2026-07-10
PILLAR.PORTFOLIO.RANGE-SWITCHER 1Y · 3Y · 5Y · MAX, rendered as the FIRST block of the sticky aside (#pf-period-switcher in the HTML), above Goals — not in the chart header. Corrected 2026-09-07. The HTML is self-contradictory here and is the one place it cannot simply be copied: its buttons read 1M · 3M · 6M · 1Y · Custom, but its own PF_PERIOD_N map defines only 1Y/3Y/5Y/MAX, so four of the five buttons fall through to "show everything" and do nothing. The series is FY-granular, so month ranges have no data to slice. Placement follows the HTML; the button set follows the HTML's working JS rather than its dead labels. See 2026-09-07-portfolio-observation-panels-belong-in-aside. 2026-09-07
PILLAR.PORTFOLIO.AY-PIVOT none — no AY selector on Portfolio (2026-06-11-ay-selector-tax-only) 2026-06-26
PILLAR.PORTFOLIO.VIEW-ONLY-MEMBER Purple accent, no map-goal write. Banner (verbatim, FamilyPortfolioBanner viewOnly): "You're viewing the household as a member. The admin sees the same data with edit rights. Chitragupt never executes trades for anyone — every section is informational." Same combined view a head sees, role-flipped — not a separate family_member workspace kind (see family-workspace). 2026-08-07
PILLAR.PORTFOLIO.FAMILY.LENSES Built 2026-08-07, real per-member data throughout, all backed by getFamilyPortfolioOverview: HouseholdNavDonut (combined NAV up to 6 PANs, SCOPE HIDDEN chip on un-granted members) · PerMemberAssetClassTable (member × asset-class matrix) · CrossPanCgHeadroomCard (household realised CG + real summed §112A headroom, see CG.HEADROOM-FAMILY above). Not built — scoped out this session, not fabricated: joint goals with per-member funding %, split-across-goals %, "apply to future units" SIP auto-mapping rule, and any Portfolio-side §80D cross-claim hint (that hint exists only on pillar-expense's HouseholdAdvisorCard, which reads health-category spend — Portfolio has no equivalent signal). Treat all of these as open gaps until built. 2026-08-07
PILLAR.PORTFOLIO.LOCKED.CTA "Portfolio Review is locked for AY 2026-27" · "Unlock · ₹249 per AY · refundable 14 days · past AYs always free" 2026-07-10
PILLAR.PORTFOLIO.EMPTY.STATUS-BANNER "No holdings parsed yet. Drop a broker P&L PDF, MF capital-statement, or EPF passbook into Inbox to populate this page." 2026-07-10
SEBI-DISCLAIMER Mandatory footer strip (verbatim; see copy-strings) — 2026-06-26-portfolio-sebi-strip 2026-06-26
NO-RECOMMENDATIONS Observation-only. No HOLD / REVIEW / SELL / BUY CTAs. 2026-06-26

Related

Sources

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

Every project of mine is written down like this.

Read the résumé