Thesis Audit
Read-only across the user's live account(s). reference/READ-ONLY-POLICY.md
(hard rule) and reference/RESEARCH-STANDARDS.md (peer and technical
frameworks, data efficiency, completeness checklist, news freshness,
disclosure) apply. Steps name capabilities — resolve each against
reference/BROKER-CAPABILITIES.md for the active broker.
This is the deep, whole-book version of one lens: portfolio-review
tests theses as one section among five, and portfolio-plan-builder's
audit mode only reports which invalidators have been hit. Here the
re-test is the work — every thesis row, measured against a number.
Steps
Load the theses. PORTFOLIO-PLAN.md — Position theses (thesis,
invalidator, target weight, per-row Reviewed date), plus the
Decision log (a thesis the user already re-affirmed shouldn't be
re-litigated) and Risk limits for the horizon each thesis is
written against. No theses section → say so and offer
portfolio-plan-builder; never reconstruct a thesis from the fact
that a position exists.
Reconcile against live holdings — equity holdings capability from
every active broker, plus the MF sleeve (SIP register, or
INDmoney's fund holdings if active). Three reconciliation findings,
all worth reporting even though no market data is involved:
- a thesis row for something no longer held (stale row),
- a material holding with no thesis (why is this owned?),
- actual weight vs. the row's target weight.
Classify each invalidator by what would test it, before pulling
anything: a price level, a fundamental number (margin,
revenue, debt, payout), an event or date (results, verdict,
approval, lock-in), or untestable ("if the story changes"). An
untestable invalidator is itself the finding — flag it and propose a
checkable rewrite.
Pull only what the invalidators need, per the data-efficiency
rules: one batched LTP call covering every name; technical indicators
batched (up to 10) only for price-level invalidators; fundamentals
(single-name or screener) only where the invalidator is fundamental;
historical candles only for a level or drawdown the indicators don't
give. A thesis whose invalidator is nowhere near tripping doesn't earn
a deep dive.
News only for event-shaped invalidators — date-anchored, 1–2
searches for that name, per the freshness rules. "Nothing in the last
30 days on the thing that would break this" is a valid result.
Classify each thesis and show the number that decided it:
- Intact — invalidator measured, comfortably untripped.
- Weakening — moving toward the invalidator; say how far.
- Tripped — the stated condition is met. The loudest finding in
the report, whether or not the price agrees.
- Untestable — no measurable invalidator.
- Stale —
Reviewed older than ~6 months, or written for
conditions that no longer exist.
A rising price does not repair a broken thesis, and a falling price
does not break an intact one — separate the two explicitly.
Present. Lead with the counts and the tripped rows. Then one table:
holding, weight, thesis (abbreviated), invalidator, status, measured
value, suggested action. Detail prose only for tripped/weakening rows,
each meeting the completeness checklist; data as-of near the top;
disclosure block, since a "thesis broken → consider reducing" is a
view. Formal version: reference/templates/thesis-audit.md.
Propose plan edits, don't write them — rewritten invalidators,
refreshed Reviewed dates, a thesis row for an unexplained holding.
Only portfolio-plan-builder writes that file. For a tripped thesis,
hand off to stock-research to re-underwrite the name from scratch,
rebalancing-planner to size any change, and tax-capital-gains
before anything gets sold.
1---2name: thesis-audit3description: Re-test every position thesis in PORTFOLIO-PLAN.md against current data — is the stated reason for owning it still true, and has any invalidator tripped. Use when the user asks why they own something, whether a thesis still holds, or wants a conviction/thesis check across holdings. Read-only.4---56# Thesis Audit78Read-only across the user's live account(s). `reference/READ-ONLY-POLICY.md`9(hard rule) and `reference/RESEARCH-STANDARDS.md` (peer and technical10frameworks, data efficiency, completeness checklist, news freshness,11disclosure) apply. Steps name capabilities — resolve each against12`reference/BROKER-CAPABILITIES.md` for the active broker.1314This is the deep, whole-book version of one lens: `portfolio-review`15tests theses as one section among five, and `portfolio-plan-builder`'s16audit mode only reports which invalidators have been hit. Here the17re-test *is* the work — every thesis row, measured against a number.1819## Steps20211. **Load the theses.** `PORTFOLIO-PLAN.md` — **Position theses** (thesis,22 invalidator, target weight, per-row `Reviewed` date), plus the23 **Decision log** (a thesis the user already re-affirmed shouldn't be24 re-litigated) and **Risk limits** for the horizon each thesis is25 written against. No theses section → say so and offer26 `portfolio-plan-builder`; never reconstruct a thesis from the fact27 that a position exists.28292. **Reconcile against live holdings** — equity holdings capability from30 every active broker, plus the MF sleeve (**SIP register**, or31 INDmoney's fund holdings if active). Three reconciliation findings,32 all worth reporting even though no market data is involved:33 - a thesis row for something no longer held (stale row),34 - a material holding with no thesis (why is this owned?),35 - actual weight vs. the row's target weight.36373. **Classify each invalidator by what would test it**, before pulling38 anything: a **price level**, a **fundamental number** (margin,39 revenue, debt, payout), an **event or date** (results, verdict,40 approval, lock-in), or **untestable** ("if the story changes"). An41 untestable invalidator is itself the finding — flag it and propose a42 checkable rewrite.43444. **Pull only what the invalidators need**, per the data-efficiency45 rules: one batched LTP call covering every name; technical indicators46 batched (up to 10) only for price-level invalidators; fundamentals47 (single-name or screener) only where the invalidator is fundamental;48 historical candles only for a level or drawdown the indicators don't49 give. A thesis whose invalidator is nowhere near tripping doesn't earn50 a deep dive.51525. **News only for event-shaped invalidators** — date-anchored, 1–253 searches for that name, per the freshness rules. "Nothing in the last54 30 days on the thing that would break this" is a valid result.55566. **Classify each thesis** and show the number that decided it:57 - **Intact** — invalidator measured, comfortably untripped.58 - **Weakening** — moving toward the invalidator; say how far.59 - **Tripped** — the stated condition is met. The loudest finding in60 the report, whether or not the price agrees.61 - **Untestable** — no measurable invalidator.62 - **Stale** — `Reviewed` older than ~6 months, or written for63 conditions that no longer exist.6465 A rising price does not repair a broken thesis, and a falling price66 does not break an intact one — separate the two explicitly.67687. **Present.** Lead with the counts and the tripped rows. Then one table:69 holding, weight, thesis (abbreviated), invalidator, status, measured70 value, suggested action. Detail prose only for tripped/weakening rows,71 each meeting the completeness checklist; data as-of near the top;72 disclosure block, since a "thesis broken → consider reducing" is a73 view. Formal version: `reference/templates/thesis-audit.md`.74758. **Propose plan edits, don't write them** — rewritten invalidators,76 refreshed `Reviewed` dates, a thesis row for an unexplained holding.77 Only `portfolio-plan-builder` writes that file. For a tripped thesis,78 hand off to `stock-research` to re-underwrite the name from scratch,79 `rebalancing-planner` to size any change, and `tax-capital-gains`80 before anything gets sold.