Portfolio Plan Builder
Interview-driven setup and maintenance of PORTFOLIO-PLAN.md — the file
every other skill reads for the user's intent that no broker's MCP can
know. Works over whichever broker(s) BROKERS.md names active — resolve
any capability against reference/BROKER-CAPABILITIES.md.
reference/READ-ONLY-POLICY.md (hard rule) and
reference/RESEARCH-STANDARDS.md (frameworks, disclosure) apply.
Write scope. The one skill that writes a file the user owns:
PORTFOLIO-PLAN.md at their project root, from
reference/PORTFOLIO-PLAN.example.md. Nothing else — never a broker
action, never another file, never an edit the user hasn't seen. (Note:
BROKERS.md is a separate file the user edits themselves — this skill
doesn't write it, and reads it only to know which broker(s) to pull
grounding data from.)
A conversation, not a form. The plan's value is the thinking it
forces, so probe and push back — a plan recording whatever the user said
first is worth less than one that survived a few good questions.
Interview in rounds of 2–4 questions, grounded in what they actually
hold. Never dump the template as a questionnaire.
When this runs
- File doesn't exist → offer this before doing the analysis the
user asked for. Don't proceed on guessed targets, and don't build it
unasked either: say what's missing, what it unlocks, and offer (a)
build it now, 5–10 minutes, (b) answer just the minimum for this one
question, (c) proceed without it, stating the assumptions used.
- A needed section is blank or stale → fill that section, then hand
back. Don't turn a rebalancing question into a full plan interview.
- The user asks to create, review, refresh, or change the plan →
full or section-scoped pass, as they prefer.
Steps
Locate or create. Check the project root. If absent, copy the
template and confirm PORTFOLIO-PLAN.md is git-ignored — it will hold
real financial data. If present, inventory what's filled, blank,
marked n/a (a decision — don't re-ask), and stale per its
_Last reviewed:_ stamps.
Ground the interview in real data before asking anything. One
batched pass over every active broker — noting that this covers
equity and ETFs only unless INDmoney is active and its net-worth
capability is verified working (see BROKER-CAPABILITIES.md):
equity holdings, open F&O/intraday positions, available-margin, one
batched LTP call, and fundamentals/screener capability for sector and
market-cap classification (Groww-only today). Compute the current
bucket split, top-10 weights, and sector weights.
This turns abstract questions concrete: not "what's your mid/small-cap
target?" but "you're at 41% mid/small-cap today, mostly in three names
— is that where you meant to be?" Users answer the second honestly and
guess at the first.
Interview in this order — the template documents each field; what
matters here is the sequence and what to press on:
- Goals & horizon — what the money is for, when it's needed, what
an unacceptable outcome looks like. Everything else follows, so
start here even though the template starts elsewhere.
- Risk limits — appetite, then anchored against their book: "a 30%
drawdown on today's holdings is about ₹X — hold, add, or sell?"
Single-stock, sector, and per-fund/AMC caps, each marked hard or soft.
- Target allocation — propose a split derived from their answers
and their current book, then let them correct it. Proposing beats
asking cold, as long as the reasoning shows and it's clearly a
draft. Set drift bands per bucket.
- Rebalancing rules — cadence, threshold, correction order, selling
constraints, untouchables.
- Fixed income + inventory — targets, then the inventory table.
Say plainly that direct bonds/NCDs/FDs/SGBs are invisible to every
broker's MCP configured here, so this table is the only source of
truth for
bond-ladder-planner and rate-watch.
- SIP register — this is the whole mutual fund inventory, not
just SIP amounts: no broker's MCP has verified working fund data
today (Groww has none; INDmoney's is unverified — see
BROKER-CAPABILITIES.md), so ask for every fund held with units,
average cost, and current value, then the SIP rows on top. Say
plainly that without this table their fund sleeve is invisible to
every skill and portfolio-review will be reporting on the equity
book alone. Flag lump-sum-only funds and paused SIPs explicitly.
- Tax context — note where lot-level data isn't available rather
than assuming.
- Position theses — for the top holdings, why held plus a
checkable invalidator (a number, event, or date). Highest-leverage
section: without one,
earnings-watch and portfolio-review can
only report that the price moved. If they can't name one for a large
position, that's the finding — record it as an open question rather
than inventing a thesis.
- Exclusions, deployable capital, income goal, watchlist, output
preferences — quick round, mostly preference.
Grill — the part that earns the file. Reflect contradictions back
with the numbers, once each, as a question with both branches rather
than a verdict on their judgment:
- Targets that don't sum to 100%, or a fixed-income target that
contradicts the bucket table.
- Stated appetite vs. the actual book (self-described conservative,
60% small-caps), or vs. behaviour they describe.
- Horizon vs. known outflows — money needed in 18 months sitting in a
seven-year bucket.
- Limits already breached today: is the limit the intent, or is the
position? One has to move.
- Bands so tight they'd trigger constant trading, or so wide the plan
never binds.
- Overlap they may not see — funds converging on the same top
holdings, an ETF duplicating direct holdings.
- An income goal the book can't plausibly produce; show the projected
figure against it.
Accept "yes, deliberately" and record it as such, ideally in the
decision log, so no skill re-litigates it later.
Write it. Fill the template, keeping its exact section headings and
anchors — other skills key off them.
- Only what the user actually said. No inferred numbers, no
placeholder targets. Undecided → blank; decided there's no
constraint →
n/a.
- Follow the template's conventions block (dates
YYYY-MM-DD, rupees,
percentages of current market value, exchange tickers).
- Stamp every section touched with today's
_Last reviewed:_.
- Show the diff and get confirmation before writing, and honour
the file's own "may skills propose edits" preference on later runs.
- Never commit it, and never echo real figures into any example or
tracked file.
Close the loop. State which sections are now filled, which are
still blank and what that blocks (see the template's "How the skills
use this file" table), and the natural next step — usually
rebalancing-planner against the fresh targets, or back to the
original question. stock-research is the way to test any shaky
thesis that came out of the interview.
Maintenance mode
For an existing plan, audit rather than re-interview:
- Sections stale past ~6 months (a quarter for tax and SIP), by their own
stamps.
- Plan vs. reality now: limits breached, buckets outside their bands,
theses that have hit an invalidator, watchlist triggers fired,
decision-log rows due to revisit.
- Fixed-income rows that have matured, and SIPs that changed.
Present that as a short findings list — formal version:
reference/templates/portfolio-plan-builder.md — then offer to update
only the rows that moved. A yearly full pass is worth it; a monthly one isn't.
Presentation
Lead with what the interview covers and roughly how long. Keep rounds
short — questions as a numbered list, one line each, with the grounding
number attached where there is one. Close with the filled/blank summary
table and the next step. No disclosure block for the interview itself; if
step 4 ends up giving a positioning opinion, it applies to that part.
1---2name: portfolio-plan-builder3description: Build or update the user's PORTFOLIO-PLAN.md by interviewing them against their real holdings — targets, risk limits, rebalancing rules, theses, fixed-income inventory, SIP register, tax context. Use when that file is missing, stale, or lacks a section another skill needs, or when the user asks to set up or change their plan. Writes only that file.4---56# Portfolio Plan Builder78Interview-driven setup and maintenance of `PORTFOLIO-PLAN.md` — the file9every other skill reads for the user's *intent* that no broker's MCP can10know. Works over whichever broker(s) `BROKERS.md` names active — resolve11any capability against `reference/BROKER-CAPABILITIES.md`.12`reference/READ-ONLY-POLICY.md` (hard rule) and13`reference/RESEARCH-STANDARDS.md` (frameworks, disclosure) apply.1415**Write scope.** The one skill that writes a file the user owns:16`PORTFOLIO-PLAN.md` at their project root, from17`reference/PORTFOLIO-PLAN.example.md`. Nothing else — never a broker18action, never another file, never an edit the user hasn't seen. (Note:19`BROKERS.md` is a separate file the user edits themselves — this skill20doesn't write it, and reads it only to know which broker(s) to pull21grounding data from.)2223**A conversation, not a form.** The plan's value is the thinking it24forces, so probe and push back — a plan recording whatever the user said25first is worth less than one that survived a few good questions.26Interview in **rounds of 2–4 questions**, grounded in what they actually27hold. Never dump the template as a questionnaire.2829## When this runs3031- **File doesn't exist** → offer this *before* doing the analysis the32 user asked for. Don't proceed on guessed targets, and don't build it33 unasked either: say what's missing, what it unlocks, and offer (a)34 build it now, 5–10 minutes, (b) answer just the minimum for this one35 question, (c) proceed without it, stating the assumptions used.36- **A needed section is blank or stale** → fill *that section*, then hand37 back. Don't turn a rebalancing question into a full plan interview.38- **The user asks to create, review, refresh, or change the plan** →39 full or section-scoped pass, as they prefer.4041## Steps42431. **Locate or create.** Check the project root. If absent, copy the44 template and confirm `PORTFOLIO-PLAN.md` is git-ignored — it will hold45 real financial data. If present, inventory what's filled, blank,46 marked `n/a` (a decision — don't re-ask), and stale per its47 `_Last reviewed:_` stamps.48492. **Ground the interview in real data before asking anything.** One50 batched pass over every active broker — noting that this covers51 equity and ETFs only unless INDmoney is active and its net-worth52 capability is verified working (see `BROKER-CAPABILITIES.md`):53 equity holdings, open F&O/intraday positions, available-margin, one54 batched LTP call, and fundamentals/screener capability for sector and55 market-cap classification (Groww-only today). Compute the current56 bucket split, top-10 weights, and sector weights.5758 This turns abstract questions concrete: not "what's your mid/small-cap59 target?" but "you're at 41% mid/small-cap today, mostly in three names60 — is that where you meant to be?" Users answer the second honestly and61 guess at the first.62633. **Interview in this order** — the template documents each field; what64 matters here is the sequence and what to press on:6566 1. **Goals & horizon** — what the money is for, when it's needed, what67 an unacceptable outcome looks like. Everything else follows, so68 start here even though the template starts elsewhere.69 2. **Risk limits** — appetite, then anchored against their book: "a 30%70 drawdown on today's holdings is about ₹X — hold, add, or sell?"71 Single-stock, sector, and per-fund/AMC caps, each marked hard or soft.72 3. **Target allocation** — propose a split derived from their answers73 *and* their current book, then let them correct it. Proposing beats74 asking cold, as long as the reasoning shows and it's clearly a75 draft. Set drift bands per bucket.76 4. **Rebalancing rules** — cadence, threshold, correction order, selling77 constraints, untouchables.78 5. **Fixed income + inventory** — targets, then the inventory table.79 Say plainly that direct bonds/NCDs/FDs/SGBs are invisible to every80 broker's MCP configured here, so this table is the only source of81 truth for `bond-ladder-planner` and `rate-watch`.82 6. **SIP register** — this is the whole mutual fund inventory, not83 just SIP amounts: no broker's MCP has verified working fund data84 today (Groww has none; INDmoney's is unverified — see85 `BROKER-CAPABILITIES.md`), so ask for every fund held with units,86 average cost, and current value, then the SIP rows on top. Say87 plainly that without this table their fund sleeve is invisible to88 every skill and `portfolio-review` will be reporting on the equity89 book alone. Flag lump-sum-only funds and paused SIPs explicitly.90 7. **Tax context** — note where lot-level data isn't available rather91 than assuming.92 8. **Position theses** — for the top holdings, why held plus a93 *checkable* invalidator (a number, event, or date). Highest-leverage94 section: without one, `earnings-watch` and `portfolio-review` can95 only report that the price moved. If they can't name one for a large96 position, that's the finding — record it as an open question rather97 than inventing a thesis.98 9. **Exclusions, deployable capital, income goal, watchlist, output99 preferences** — quick round, mostly preference.1001014. **Grill — the part that earns the file.** Reflect contradictions back102 with the numbers, once each, as a question with both branches rather103 than a verdict on their judgment:104 - Targets that don't sum to 100%, or a fixed-income target that105 contradicts the bucket table.106 - Stated appetite vs. the actual book (self-described conservative,107 60% small-caps), or vs. behaviour they describe.108 - Horizon vs. known outflows — money needed in 18 months sitting in a109 seven-year bucket.110 - Limits already breached today: is the limit the intent, or is the111 position? One has to move.112 - Bands so tight they'd trigger constant trading, or so wide the plan113 never binds.114 - Overlap they may not see — funds converging on the same top115 holdings, an ETF duplicating direct holdings.116 - An income goal the book can't plausibly produce; show the projected117 figure against it.118119 Accept "yes, deliberately" and record it as such, ideally in the120 decision log, so no skill re-litigates it later.1211225. **Write it.** Fill the template, keeping its exact section headings and123 anchors — other skills key off them.124 - Only what the user actually said. No inferred numbers, no125 placeholder targets. Undecided → blank; decided there's no126 constraint → `n/a`.127 - Follow the template's conventions block (dates `YYYY-MM-DD`, rupees,128 percentages of current market value, exchange tickers).129 - Stamp every section touched with today's `_Last reviewed:_`.130 - **Show the diff and get confirmation before writing**, and honour131 the file's own "may skills propose edits" preference on later runs.132 - Never commit it, and never echo real figures into any example or133 tracked file.1341356. **Close the loop.** State which sections are now filled, which are136 still blank and what that blocks (see the template's "How the skills137 use this file" table), and the natural next step — usually138 `rebalancing-planner` against the fresh targets, or back to the139 original question. `stock-research` is the way to test any shaky140 thesis that came out of the interview.141142## Maintenance mode143144For an existing plan, audit rather than re-interview:145146- Sections stale past ~6 months (a quarter for tax and SIP), by their own147 stamps.148- Plan vs. reality now: limits breached, buckets outside their bands,149 theses that have hit an invalidator, watchlist triggers fired,150 decision-log rows due to revisit.151- Fixed-income rows that have matured, and SIPs that changed.152153Present that as a short findings list — formal version:154`reference/templates/portfolio-plan-builder.md` — then offer to update155only the rows that moved. A yearly full pass is worth it; a monthly one isn't.156157## Presentation158159Lead with what the interview covers and roughly how long. Keep rounds160short — questions as a numbered list, one line each, with the grounding161number attached where there is one. Close with the filled/blank summary162table and the next step. No disclosure block for the interview itself; if163step 4 ends up giving a positioning opinion, it applies to that part.