CompoundWise.io
Methodology Reference · Investment Framework

The Strategy Report

Methodology & Investment Framework — written so a careful reader with no finance background can follow it end to end. Covers the deterministic signal engine, the fair-value ensemble, the risk and tax architecture, the human-conviction override, the forward track record, and the tightly-governed LLM narration layer behind the “Market Intelligence Brief.”
Edition
Plain-language practitioner reference
Scope
Primer · Signals · Valuation · Risk · Tax · Validation
Jurisdiction
Canadian resident investor
Status
Current — June 2026
CW
How to read this document

Every technical section is followed by a green “In plain terms” box that restates the idea in everyday language with a real-world analogy. If you only read the plain-terms boxes and the tables, you will still understand the whole framework. The order is deliberate: we start with a Fundamentals primer (§0) that defines every building block, so nothing later assumes prior knowledge. Length is on purpose — this is a reference, not a brochure.

What this is — and isn’t This is a rules-based analytical tool, not advice. Its SELL / TRIM / HOLD / ADD outputs are starting points for your own judgement — they are not a registered adviser’s tailored recommendation under NI 31-103, nothing is individualized advice, and nothing executes automatically. See §17.
The one idea to keep in mind The report separates doing the maths from writing the words. All the numbers and decisions come from fixed, tested computer code (the “engine”). A large language model (the “AI”) only explains and prioritises them in plain English — it is never allowed to invent a number, a price, or a “sell.” That separation removes one whole category of error — the AI cannot fabricate a price or a verdict — but it does not, by itself, make every number right: the engine’s own models and thresholds are judgement calls, disclosed and logged so they can be graded forward (§14) — none of the verdicts has yet been tested against returns.
Abstract

The Strategy Report is a per-account portfolio diagnostic that fuses a deterministic, rules-based signal engine with a governed large-language-model (LLM) narration layer. The engine owns all quantitative work — fundamental quality scoring, a dispersion-aware multi-model fair-value ensemble, 26 signal rules with explicit precedence, concentration and drawdown risk analytics (now regime-aware), Canadian tax logic, a documented human-conviction override, and a measurement-only forward track record. The LLM performs exposition and prioritisation only: it cannot fabricate a price, a fair value, a SELL, or a security outside the screened universe. The output is a goal-anchored, tax-aware action plan — sized in shares and native-currency dollars, grouped by registered/non-registered account, with an explicit audit trail of any rule the model overrode. The verdicts (SELL/TRIM/HOLD/ADD) are deterministic rule outputs for the investor’s own consideration — not a registered adviser’s recommendation under NI 31-103; nothing is tailored advice and nothing executes automatically.

Separation of duties (the central design tenet) Quant is computed once in version-controlled, unit-tested code (reproducible, deterministic). The LLM is a translation/curation layer, not a calculator. This is what makes the brief defensible under scrutiny: every figure traces to a rule, not to model confabulation.
00

Fundamentals primer — the building blocks

Definitions, in plain language, for every term the rest of the document uses. Skim it now; refer back as needed.

Quality vs. price — two different questions

The framework keeps two questions strictly apart. “Is this a good business?” is about quality — profits, debt, growth durability. “Is the share a good price right now?” is about valuation. A wonderful business can be a poor buy if it’s expensive, and a weak business can look cheap and still be a trap. Mixing the two is the classic mistake; we never do.

Deep Score (0–100)

Our single quality grade for a business, built from a 16-point value-investing checklist: profitability (return on equity/capital, margins), growth (revenue and earnings over years), balance-sheet strength (debt, free-cash-flow consistency), valuation discipline, and a moat/quality factor. It deliberately ignores the share price — it grades the company, not the stock chart — so price and momentum can sharpen a decision without contaminating the quality read. Bands: ≥85 exceptional, 70–84 high quality, 55–69 acceptable, 40–54 middling, below 40 “avoid.”

Fair value — a range, not a number

Our estimate of what a share is actually worth, produced by blending several independent valuation models (see §6). We never publish a single fake-precise figure; we publish a low–high range and a confidence level (e.g. “C$240–C$320, medium confidence”). A price inside the range is fairly valued; above the top is genuinely expensive; below the bottom is a genuine discount.

Concentration, weight & “look-through”

Weight is how big a position is. Per-account weight is its size inside one account; aggregate (look-through) weight is its total size across every account you own. The aggregate is the number that matters — the same stock held in a TFSA and an RRSP is one bet, and per-account numbers hide that. Concentration is having too much in one stock, one industry, or one currency.

Market regime

A plain label for “what kind of market are we in right now,” read from interest rates, the yield curve, credit spreads, volatility (VIX), and whether the market is above its long-term trend line. The five regimes are expansion (calm, risk-on), mid-cycle (neither stressed nor calm, with no downturn behind it — no regime tilt), recovery (climbing out of trouble: the S&P 500 closed below its 200-day average within the past 12 months), late-cycle (getting toppy, caution), and contraction (stress/downturn). We never predict a price; we just describe the weather. If any of those five readings could not be fetched, the regime reads Unknown: we name the missing reading, list no regime actions, and fill nothing in with an assumed value.

Canadian tax words you need

A few more terms you’ll meet

In plain terms Think of the Deep Score as a health score for a company and fair value as a fair price tag with a margin of error. Concentration is “too many eggs in one basket,” counted across all your baskets at once. The regime is the weather forecast. And remember: selling in a regular (non-registered) account triggers a tax bill, so it’s never “free.”
01

System architecture & data flow

A single generation pass executes a deterministic pipeline; the LLM is invoked once, late, with a fully-resolved context object.

  1. Ingestion & enrichment. Holdings are joined to live prices, the latest fundamentals snapshot, account-type registry (capital-gains treatment, US-withholding flags), and the investor profile / IPS inputs. Per-lot FX conversion yields both price_native and price_cad; aggregate single-name weights are computed across accounts.
  2. Quality & valuation. Each name carries a fundamental Deep Score and an ensemble fair-value point + range + confidence tier (§3–4).
  3. Signal engine. ~28 deterministic rules evaluate every holding, emitting typed signals with strength scores; de-duplicated and precedence-ranked (§7). Concentration ceilings are tightened in hostile regimes (§8).
  4. Portfolio analytics. Concentration (single-name, GICS sector, industry cluster, currency), beta-adjusted drawdown stress tests, and contribution-aware goal solve (§8–7, §11).
  5. LLM narration. The resolved context (slimmed holdings, concentration block, macro, grouped signals, goal, profile, engine flags) is passed to the model, which returns structured JSON: verdict, ranked priority actions, diversifiers, simulation, scenario notes (§15).
  6. Post-processing & render. Engine post-checks (look-through fund overlap; backfill of the contribution-dependency note) run on the model output; the designed multi-page artifact is assembled and served as printable HTML/PDF.
In plain terms It works like a medical check-up. First a nurse gathers your vitals (your holdings, prices, scores). Then lab machines take objective measurements (the rule engine). Then a doctor reads the results and writes the report in plain English (the AI) — but the doctor follows strict protocols and can’t make up a lab value. Finally the results are printed nicely (the designed PDF).
Generation-time vs render-time Quantitative verdicts and narrative are baked at generation and persisted. Re-opening a saved report re-runs only the presentation layer; reflecting new prices or a rule change requires regeneration. Reproducibility: identical inputs → identical engine output (the LLM layer is the only stochastic component, and it is constrained to narration).
02

Data sources & inputs

DomainSource & treatment
PricesUS equities via Alpaca (IEX feed) with a yfinance fallback; daily OHLC persisted to a local cache for trailing-return / volatility / moving-average computation.
FundamentalsUS deep-score inputs sourced from SEC EDGAR (10-year filings) with yfinance fallback for info/foreign filers; normalized earnings used to dampen cyclic peak/trough distortion.
MacroBoC & Fed policy rates, CA/US 10Y, CAD/USD, WTI, CPI, VIX; plus an LLM web-search track for sector tailwind/headwind classification and Canadian headlines.
Trajectory metricsma_200, 52-week high, 3-year price anchors, trailing return_3m/6m, and a realized-volatility ratio (recent 21-day ÷ trailing 252-day).
KYC / IPSRisk tolerance, objective, age & horizon, retirement year, DB-pension & net-worth context, emergency-fund & near-term-needs liquidity, max-drawdown tolerance, max single-position limit, exclusions, convictions, annual contribution. Exclusions are matched as whole words against each name’s ticker, name, sector and industry on every buy surface — priority actions, diversifiers, the screened fund menu (a fund on its own name and category; its weight in an excluded sector is disclosed), the harvest replacement — and the names hidden are counted, once per name. A stock with no industry on file cannot be matched, so a buy of it is shown for review rather than passed; likewise a buy for an income or preservation objective whose beta or dividend is unknown. Whether a name pays is ONE decision (dividend_facts.pays_dividend): a payer when its declared forward rate or the dividend it paid over the last year is positive (the data source omits the forward rate for some real payers, the big Canadian banks among them), a non-payer only on a known zero — the source states it pays nothing — and unknown otherwise; a known non-payer under an income or preservation objective is held, an unknown one is shown for review. The trailing figure never reaches a valuation. A declared term no vendor field carries cannot be enforced, and a profile, reserve or exclusion list that cannot be read is stated as unreadable, never treated as empty.
History (for validation)Every scheduled scan appends a dated snapshot per ticker (Deep Score, label, fair value, close price) keyed on (date, ticker). This accruing history is what the forward track record (§14) reads — it is never overwritten.
03

Fundamental quality — the Deep Score

A 0–100 composite of profitability, balance-sheet, growth-durability and capital-efficiency factors, descended from a 16-point value-investing checklist. It is deliberately price-blind — it grades the business, not the security — so valuation and momentum can sharpen it without contaminating it.

BandInterpretationEngine consequence
≥ 85Exceptional compounderEligible for ADD at a discount; HOLD when richly valued
70–84High qualityCore long-hold; valuation governs entry, not exit
55–69AcceptableHOLD/neutral; valuation-trim only below 55
40–54MiddlingEligible for valuation-driven TRIM when rich
< 40AvoidSELL / TRIM regardless of account; never ADD
In plain terms One number, 0–100, for “how good is this company?” — like a credit score for a business. 85+ is blue-chip; under 40 means the business is too weak to own. It ignores the share price on purpose: a great company is still great on a day the stock falls.
04

Winner Odds — the durable-compounder ranker

A cross-sectional rank of the entire universe on the traits that recurred in history’s long-run compounders. Where the Deep Score grades quality today, Winner Odds asks which names have the makings of a business that keeps compounding and does not fail — and answers with a rank and a tier, never a probability. It is not a multi-bagger finder: on the point-in-time population test, top-tier names rose fourfold in five years about as often as any other name.

The factor set

Eight curated factors in two families, ranked against every other name using the same peer-relative robust-z statistics core as the Deep Score:

Value and momentum are computed as a side overlay only — never blended into the quality-and-growth rank, so a name cannot climb on cheapness or price action alone.

Percentile → tier, with hard gates

TierUniverse percentile
Strong candidate≥ 75th (the top quartile; the 90th-percentile cut was removed 2026-09-28)
Watch≥ 50th
Unlikelybelow the median

Two hard gates override the tier regardless of the factor score: financial distress (a weak Altman-Z) caps a name at Unlikely, and a cyclical business at a likely earnings peak caps it at Watch.

Rank-only — the honesty gateA simulated point-in-time test of every US 10-K filer FY2009–2022 (scripts/backtest_winner_population.py, judged by the one certification rule) certified the ordering (model register: winner 1.12.0 / 1.16.0), and still certifies it on the 2026-10-06 re-run under a repaired history (rank correlation 0.234, t 4.52; winner 1.16.1). A calibrated probability failed its held-out test, so the model is flagged CALIBRATED=False and never emits a win-%. A fabricated 68% would be worse than an honest rank.
In plain termsA scout’s shortlist: it lines up companies by how much they look like tomorrow’s giants and sorts them into tiers — but refuses to quote odds it can’t stand behind. winner_engine.py; the rank is tested on the point-in-time population, and the earlier in-sample run on a small hand-picked basket (backtest_winner.py) is superseded.
05

Emerging Compounders — the Inflection engine

A forward-looking companion to the Deep Score. It reads the rate of change — is the business getting better, faster — to catch businesses that are turning a corner before the trailing averages the Deep Score relies on can show it.

The inflection signals (engine 3.0.0, 2026-09-28)

Eleven signals, each measured as a trend (recent vs. earlier), not a level. Six carry weight: each is the name’s percentile among its sector peers that night, and the score is the weight-averaged percentile, re-based to the published bands. The weights are each signal’s measured rank correlation with the three-year outcome on every US 10-K filer FY2009–2022, scaled to sum to 100. The other five are shown as facts with no weight.

SignalWeightWhat it catches
Share dilution28Share-count discipline — a rising share count ranks low
Margin expansion23Gross / net margins widening as it scales
Operating leverage14Profit climbing faster than sales
Improving returns13ROIC trending up, not merely already high
Earnings surprise12Quarterly earnings against the same quarter a year earlier, scaled by how much that change usually varies (from the company’s own filings)
Cash-flow inflection10Free cash flow turning positive or its margin rising
Growth acceleration0 (shown, no weight)Revenue growing faster than a year or two ago — no lift on the population test, and the worst outcomes at its top rung
Early price breakout0 (shown, no weight)The market starting to notice — no point-in-time history to test it
Insider buying0 (shown, no weight)On the population test, insiders net buying preceded worse outcomes than net selling
Forward growth0 (shown, no weight)Next-year analyst-consensus growth — no point-in-time history to test it
Estimate revisions0 (shown, no weight)Which way analysts are moving their forecasts — no point-in-time history to test it

Guards

Not certified on the re-run — and what that does and does not meanOn a simulated point-in-time test of every US 10-K filer FY2009–2022, run through the same certification rule Winner Odds passes, the 3.0.0 score certified as a rank on 28 September 2026 (rank correlation 0.169). It is not certified on the 2026-10-06 re-run under a corrected history (deflated Sharpe 0.48 vs 0.95 required); its ranks still separate (rank correlation 0.16, t 7.43, five independent windows; model register: inflection). The weights were measured on those same years, so the figures are in-sample for the weights. It separates failures better than it finds big winners, and it is not a forecast for any one company. An inflection is a possibility, not a prediction.
In plain termsThe Deep Score is a rear-view mirror of proven quality; this is the windshield. A mature giant with high-but-flat numbers scores near zero here even with a great Deep Score — and that disagreement is the whole point. inflection.py; tested on the point-in-time population by scripts/inflection_program.py (variant V7).
06

The fair-value ensemble

Intrinsic value is estimated by a multi-model ensemble (two DCF variants, EV/EBITDA, Graham-style, dividend models, etc.), blended with dispersion-aware confidence. The output is a point estimate, a low–high range, a coefficient-of-variation, and a confidence tier — never a single fake-precise figure.

  1. Applicability filter. Keep models with a positive fair value applicable to the sector (e.g. exclude FCF/EBITDA constructs for financials via sector policy).
  2. Price-anchored sanity gate. Drop any model outside [0.33× , 3×] of the current price — these reflect broken inputs (e.g. a normal multiple on peak-cycle EPS).
  3. Median outlier trim. Drop values outside [0.40× , 2.50×] of the median.
  4. Family reduction. Average within each model family → one representative per family (prevents a single methodology from dominating).
  5. Blend & dispersion. Point = mean of family representatives; range = their min/max; dispersion = coefficient of variation (how widely the models disagree, σ/μ).
  6. Confidence tiering. CoV < 0.15 → HIGH, < 0.30 → MEDIUM, < 0.50 → LOW, > 0.50 → NOISE (suppressed — no trustworthy estimate; caller skips the name rather than print a fantasy number). Requires ≥ 2 corroborating families.
Decision rule — “expensive” means something Classification uses the range edges, not the point: a price below range_low is a genuine discount, above range_high genuinely rich, and within the band is fairly valued. Units are reconciled explicitly — the range is converted to CAD for the rules (vs price_cad) and passed in native currency to the LLM to prevent cross-currency mislabelling.
In plain terms Instead of trusting one valuation formula, we run several and combine them — like getting several appraisals on a house and reporting a price range with a confidence note rather than one suspiciously exact figure. If the appraisals wildly disagree, we say “we don’t know” instead of guessing.

Acknowledged bias: the ensemble is conservative on steady mega-caps; in a genuine melt-up it will correctly flag names well above range — that is signal, not error.

07

The signal engine — taxonomy & triggers

Rules evaluate per holding and emit typed signals with 0–100 strength. Precedence: SELL / ROTATE (exits) → TRIM → HOLD → ADD; TAX fires independently. De-duplication keeps the strongest signal per (ticker, account, type); a TRIM rounding to < 1 share is suppressed as a no-op.

TypeRuleTrigger (deterministic)
SELLavoid_fundamentalDeep Score < 40
SELLlow_score_high_gainscore < 35 & gain > 25% (price ahead of quality)
SELLdead_moneygain < −20% & score < 40
SELLdangerous_leverageD/E > 3.0 & score < 45
SELLshrinking_revenue5-yr revenue CAGR < −3% (structural decline)
SELLsector_headwind_weaksector macro headwind & score < 42
SELLrecession_risk_highbetacontraction regime & β > 1.2 & whole-position weight > 3% & cyclical & score < 55
ROTATEgrowth_momentum_rotategrowth-sleeve name & momentum “broken” (below 200-DMA) — opt-in only; never a core holding
CRASH WATCHcrash_risk_protectscore ≥ 55, prior winner, agg weight > 5%, drawdown ≤ −20% from 52-wk high AND a confirmation (below 200-DMA OR return_3m ≤ −15% OR vol-ratio ≥ 1.5) → ~25% protective trim
TRIMconcentration_overweightaggregate single-name weight > ceiling (max_single_position_pct or 25%) → trim toward ~70% of ceiling (25% → 18%)
TRIM REGIMEsector_overconcentrationGICS sector > ceiling → trim contributors toward ~80% of slice. Ceiling = 45% normally, tightened to 40% in late-cycle and 38% in contraction (§8). A sector limit the client declares replaces it, tighter or looser, and the regime does not tighten a declared limit; ADDs stop 5 points below it. Between the house 45% and a looser declared limit the rule stands down, and concentration_departures lists the sector (and any single name above 25% within a looser declared single-name limit) with a statement of the weight and both limits, printed in the report — the departure is recorded, not silent (CFA III(C)).
TRIMmoderate_overvaluationscore 40–54 & price above range_high (rich)
TRIMmid_quality_overweightscore 38–55 & whole-position weight > 8% → the whole position to 5%, the same share off every account's slice
TRIM REGIMEusd_overexposureportfolio USD > ceiling (45%, tightened to 40%/38% in late-cycle/contraction) & USD name (exposure alone; no wait on the exchange rate’s direction) — registered only (suppressed on taxable winners)
TRIMlate_cycle_trimlate-cycle regime & β > 1.3 & whole-position weight > 4% & gain > 8% → ~33%
TRIMdeteriorating_outlook_trimoutlook_pressure ≤ −0.35, heading late-cycle/contraction, med/high confidence, β > 1.2, whole-position weight > 4%, gain > 5% → ~25%
TRIMdowntrend_value_trapmulti-year downtrend (near 3-yr low) & score < 55
HOLDquality_richly_valuedscore ≥ 55 & price above range_high — the cardinal-rule verdict
ADDquality_at_discountscore ≥ 70 & price below range_low (not in a downtrend)
ADDfair_value_entryscore ≥ 65 & price within the range
ADDunderweight_winner / low_weight_high_conviction / sector_tailwind / recovery_add (cad_weakness_usd retired 2026-10-23: it timed the exchange rate)various under-sized high-quality adds, “under-sized” meaning the whole position across accounts and listings (one company is one position) — all gated by an overweight-sector guard (sector < 40%; a holding with no sector on file stands down, its weight unknown, never 0%) and by the name's ADD level: no ADD once the whole position reaches the single-name limit × 40/45 (≈22.2% at 25%). recovery_add fires only in an expansion or recovery regime — never mid-cycle — and not while the outlook heads toward late-cycle or contraction
TAXtax_loss_harvesttaxable account, loss < −8% & < −C$1,000 → harvest; observe the superficial-loss window — no identical-security purchase by the investor or an affiliated person in the 30 days before or after (ITA s.54 / s.40(2)(g)). Shown as HARVEST — a sale — on every surface; until 22 October 2026 five surfaces mapped every TAX signal to MIGRATE. NEW The window holds the company, not the ticker: an ADD on any listing in any account stands down for 30 days (one class of a corporation’s shares is identical property, CRA T4037; that a second listing of the same share is that class is our reading, and it is conservative), and a holding is never told to ADD beside its own HARVEST
TAXmigrate_to_rrspUSD payer, yield > 1.5%, withholding applies → relocate to RRSP (treaty Art. XXI); flags the deemed-disposition cost of an in-kind move
In plain terms A fixed checklist runs against every holding and produces a colour-coded suggestion: red SELL (only when a business is genuinely deteriorating), amber TRIM (lighten, don’t exit), blue HOLD (keep, don’t add), green ADD (build a good, under-owned position), and a tax housekeeping flag. It runs the same way every time — no mood, no hunches.

NEW What a holding is, and which of its numbers are current (22 October 2026)

08

Risk framework — concentration, regime & drawdown

NEW The allocation policy, and the trade a breach implies

Where a client has declared an investment policy (target weights for equity, fixed income and cash, plus a drift band), that policy is the first lens and a breach is the first action in the plan — ahead of any single-name idea, enforced by the engine after the narrative is written rather than requested of the model.

The policy is compared with the client’s own risk profile. The risk questionnaire scores risk tolerance (the crash answer, experience and purpose) and risk capacity (horizon and income) separately, and the profile is the lower of the two (Companion Policy 31-103CP s.13.2; Joint CSA/CIRO Staff Notice 31-368 — reference norms, not a compliance claim). A saved policy holding more than 5 points more equity than that profile, or than the risk tolerance the client declared, is stated as a recorded departure on every surface that carries the policy; the policy is never changed for the client. The band edges, the caps and the 5-point threshold are house decisions recorded in the model register. A plan is a review draft until the client explicitly confirms the six minimum profile fields are current; saving a form does not confirm them. riskprofile.py · advisor_engine._ips_drift · portfolio_db.confirm_suitability_review

When a breach has already been shown, the report asks about the policy. CFA Standard III(C) says an investment policy is reviewed at least annually, and a client holding an off-policy book is discussed with: the trade is made or the policy updated. The report asks that question when the book was outside the same policy, in the same class and direction, in the report before (and every report back to the first such one), and the policy has not been saved since; or when the policy was last saved more than 365 days ago. Re-saving the policy restarts the clock. A report inside the band, or one whose lens failed, ends the chain. An unknown save date triggers nothing. The question never proposes moving the policy to match the book.

A declared cash reserve is outside the policy. Liquidity needs are the first constraint a policy is written under (CFA Standard III(C)). The client declares a reserve in dollars; the mix removes min(reserve, cash) from the cash class and from the base every percentage is a share of, so drift, the policy trade and the contribution plan are computed on deployable money only. A reserve larger than the cash on file is reported as a shortfall and is never made up from a GIC or a holding; new contributions rebuild it first. With no reserve declared the value is unknown, not zero: no number moves, and where a cash-over breach draws on savings the client entered, the report states how much of the cash that is and asks. The reserve is never inferred from an item's name or from months of expenses.

Each fund has one asset class, decided in one place. The policy mix and the fund score used separate keyword tables and disagreed on 17 of 247 funds, one of them held: a gold-bullion fund the mix booked as equity. One decider (etf_scoring.etf_asset_class) now serves both, following the CIFSC categories: a money-market or treasury-bill fund is cash, an ultra-short or preferred-share fund is fixed income, and a commodity fund is its own class. A commodity or alternative fund is reported on its own named line outside the equity / fixed income / cash policy — not as equity, and not as unclassified. A CIFSC Fixed Income Balanced fund (more than 5% and under 40% in equity) is a balanced mix, not a bond fund: “balanced” in the category outranks the bond words beside it. The all-in-one check starts from this decider, so a fund it classes as fixed income is never treated as an all-in-one portfolio because its name says “conservative” — a risk level, not an asset class.

A practice considered and declined. Vanguard’s threshold-rebalancing rule — trigger at 200bp of drift and rebalance to 175bp rather than to target — was evaluated and not adopted. It is derived on target-date funds rebalanced at scale, where the question is when to trim a portfolio that is already near its targets. That precondition does not hold here: the declared bands are around 5pp and measured breaches run 20–25pp, four to five times outside them, so a better trigger would change nothing on any live book. What was missing was not a smarter threshold but an actionable trade. Every leg therefore targets the policy the client declared, not a band edge.

Concentration (the first lens)

NEW Regime-aware concentration ceilings

Concentration hurts more when markets are fragile, because in a downturn correlated names fall together. So the sector and currency ceilings are now a function of the market regime rather than fixed:

RegimeSector / USD ceilingRationale
Expansion / Mid-cycle / Recovery45% (unchanged)Benign — the normal ceiling applies.
Late-cycle40% (−5)Getting toppy — start easing concentration a notch sooner.
Contraction38% (−7)Stress — correlated bets are the danger; nudge harder.

The tightening is deliberately modest (≤7 points) and the rationale string names the regime and the active ceiling, so it is transparent. When the macro feed is unavailable, the ceiling falls back to the base 45% — missing data can never tighten anything.

Why this does NOT violate the cardinal rule This applies only to sector and currency rebalancing — legitimate risk management — never to the cardinal rule that a quality single name is never sold on price or macro alone. It changes a rebalancing threshold, not the no-panic-sell discipline; every signal is still a suggestion the investor chooses to act on. On the procyclicality risk — tightening a ceiling during a contraction could imply trimming an already-depressed sector — the mitigants are deliberate: the move is small (≤7 pts), it is a suggestion the investor may decline, and it is funded registered-account-first to avoid crystallising a taxable loss. It is a risk-budget guardrail, not a market-timing trade. We also rejected a full dynamic correlation matrix on purpose (§16).

Drawdown & horizon

In plain terms Don’t let any one stock, industry, or currency get too big — and when the weather turns stormy, trim the “too big” line a little sooner. It’s like tightening your seatbelt when the road gets icy. This is about baskets of eggs, never about dumping a great company because the market dipped.
09

The cardinal rule & the trend-rollover overlay

The governing policy — chosen for an after-tax, buy-and-hold personal book — is that valuation alone does not trigger a SELL of a quality compounder: a rich price routes to HOLD (stop adding), preserving compounding and avoiding a realised capital gain. SELL is reserved for genuine deterioration (§7). Extreme valuation is handled not by a valuation-SELL but by the concentration ceiling (no name runs unbounded as a share of the book, §8) and the goal-return lens (which can redeploy on forward-return grounds, §11). We accept the trade-off openly: a pure valuation discipline would occasionally sell a very expensive great business; we weigh that against tax friction and the cost of interrupting compounding.

The single sanctioned price-driven protective action is the crash-risk overlay: the engine does not trim a winner for being up or richly valued, but when a quality holding has rolled over — drawdown ≤ −20% from its 52-week high plus a confirmed trend break (sub-200-DMA, a sharp 3-month decline, or a realized-volatility expansion) — it raises a “Crash Watch” and proposes a ~25% protective trim or a stop, the client’s discretion. Sizing is tax-tiered (realise in registered first; quantify the gain in non-registered). A normal pullback with the trend intact is tolerated and produces no signal.

Honest limitation — and why it’s acceptable A trend-confirmation overlay is, by construction, late: it cedes the tolerated ~20–25% drawdown before acting, protecting the remainder. This is the deliberate trade-off of “let winners run” versus trimming early at the top. But it is not the portfolio’s only protection — fundamental-deterioration SELLs (§7, §8) act ahead of price when the business, not just the chart, is breaking.
In plain terms We never sell a great company just because its price went up. The only price-based caution is when a former winner is clearly rolling over — down 20%+ from its high and breaking its trend — at which point we suggest protecting about a quarter and letting the rest ride. A normal dip does nothing.
10

Canadian tax architecture

MechanismTreatment encoded
US-dividend withholding15% treaty withholding applies in taxable, TFSA & FHSA; eliminated only in RRSP/RRIF/Spousal RRSP/LIRA/LIF (Art. XXI). In a taxable account it is recoverable via the foreign tax credit; in a TFSA or FHSA it is lost entirely (the treaty covers retirement plans, not the TFSA/FHSA).
Asset locationUS-dividend payers preferred in RRSP; the engine prefers trimming in registered (tax-free) over realising a taxable gain when the choice exists.
Superficial lossLoss-harvest signals embed the superficial-loss window — no purchase of the identical security by the investor or an affiliated person (spouse, your RRSP/TFSA, a controlled corporation) in the 30 days before or after the sale (ITA s.54 / s.40(2)(g)) — to avoid loss denial. Every listing of the company is held, not only the ticker sold.
In-kind RRSP contributionFlagged as a deemed disposition at FMV — accrued gain is realised (taxable), an accrued loss is denied — and it consumes contribution room; prefer funding with new contributions / low-gain lots.
FX as capital gainCRA treats a gain on converting foreign currency (e.g. USD cash → CAD) as a capital gain — a separate event from the gain on the security, subject to a $200 annual de-minimis for individuals (ITA s.39(1.1)). Currency-matched deployment (USD cash → USD-listed) avoids triggering it (and an FX spread).
T1135 foreign-property reportingNon-registered “specified foreign property” (shares of a company resident outside Canada, whatever the listing or currency) whose total cost exceeds C$100,000 at any point in the year triggers a T1135 filing obligation; registered accounts are excluded. A joint account counts at the share of it the user entered, and in full with none entered (said beside the status). Surfaced in the separate Tax & Structure Audit.
US estate returnThe executor of a Canadian resident who is not a US citizen must file Form 706-NA when US-situated assets exceed US$60,000 at death; US-company stock is US-situated wherever it is held (IRS). The treaty’s prorated credit and small-estate relief (Art. XXIX B paras 2 and 8) are claimed on that return, so it is owed even where the tax is not. The report counts US-company stocks and funds in every account, registered included, at the user’s share of a joint account (in full with none entered, 26 U.S.C. §2040), and prints a note — on the Strategy page, in the printed report and in the narrative — when the line is crossed or the holdings it cannot count (a CDR, US partnership or trust units, a company whose country is not on file, an in-trust account’s or a beneficiary plan’s holdings) could cross it. A corporate account’s holdings are left out: the corporation owns them, and stock of a non-US corporation is property outside the US (IRS). A disclosure, not an estimate of the tax.
FHSA horizonAn FHSA is judged against its own horizon, not retirement: the earlier of the planned first-home purchase year and the year it must close — December 31 of the earliest of the 15th anniversary of opening the first FHSA, the year the holder turns 71 and the year after the first qualifying withdrawal (ITA s.146.6(1)). A close year missing an input that could make it earlier is “at the latest” and names it; a purchase planned after the account must close is said, with the RRSP/RRIF transfer as the tax-deferred exit; a purchase year before the opening year sets no close year (the withdrawal is from the account, so it cannot come first) and is named.
Capital-gains cost surfacedEvery SELL/TRIM in a taxable account carries the realised-gain estimate (50% inclusion) in its tax note, so the after-tax cost of acting is explicit.

NEW Tax-neutral rebalancing — fund changes with new money first

The framework’s standing preference is to reach a target allocation without realising a taxable gain wherever possible. Two mechanisms enforce this:

In plain terms Rebalancing usually means selling some of what you have too much of and buying more of what you’re light on — and selling can trigger a tax bill. So before suggesting a sale, the tool checks whether your new contributions or spare cash could simply buy the under-weighted positions up to target. Reaching balance by topping up, rather than selling, keeps the taxman out of it.

A separate Tax & Structure Audit report handles full contribution-room / placement modelling; the Strategy report keeps tax to a single room-nudge and per-action consequence.

11

Macro regime, forward outlook & goal solve

Regime & forward outlook

Current regime is classified from VIX, the 10Y–2Y curve, the high-yield spread and the S&P 500 against its 200-day average, into contraction, late-cycle, expansion, mid-cycle or recovery. A recovery needs a downturn behind it: the S&P 500 must have closed below its 200-day average at some point in the past 12 months; otherwise a market that is neither stressed nor calm is mid-cycle, with no regime actions. NBER dates only expansions and recessions and speaks of “the recovery” as what follows a trough; the 12-month window is a house convention. Until 22 October 2026 every such market read “Recovery / Stabilising” and fired the recovery ADD.

A forward outlook ensemble — yield-curve slope (10Y–2Y), HY credit-spread trajectory, index vs 200-DMA, VIX trend, and CPI direction — produces an outlook_pressure on a −1 to +1 scale, a heading and a confidence. The pressure is a weighted score of indicator trends, not a probability: nothing in it is fitted to recession outcomes (the New York Fed’s yield-curve model, by contrast, is a probit fitted to NBER-dated recessions). Until 22 October 2026 it was printed as a “transition probability”. Deteriorating readings bias defensive timing toward act-now / within-30-days; the regime itself (§8) tightens concentration ceilings. It is not a price or index-level forecast.

Goal-based framing

In plain terms We read the market “weather” and which way it’s trending — never a price prediction — and we always measure your plan against your goal: the yearly return you need, counting your contributions, to get there on time.
12

Portfolio construction & diversifier logic

13

NEW  Conviction override & the documented-thesis audit trail

The best frameworks make room for genuine human knowledge without letting it quietly corrupt a deterministic engine. The conviction override is that bridge.

Scope — deliberately documentation, not behaviour The override records and surfaces human conviction; it does not silently rewire the signal engine. The engine stays deterministic and reproducible; the human decision sits beside it, on the record, with its reasoning attached. This is how “soft” knowledge enters without introducing model bias.
In plain terms Suppose the engine says “trim this” but you have real conviction — you know something, or you’re a long-term believer. You’re allowed to overrule it. But if you’re overruling a caution, you must first type why (and what would change your mind). That note is saved with a date forever, so future-you can honestly check whether the call was wise. Discipline and conviction, both on the record.
14

NEW  Validation & the forward grade of its own calls

A good framework keeps score of itself — honestly — so its parameters can be improved by human judgement over time. It does not secretly rewrite its own weights.

What is measured

PRINCIPLE Measurement informs people — it never auto-tunes the engine

This track record is read by a human to decide whether to recalibrate — exactly as the sector multiples and normalized-earnings model were deliberately re-tuned in June 2026. No code path adjusts the Deep Score weights or fair-value parameters automatically from outcomes. We reject self-tuning on principle (§16): on a single portfolio of a few dozen names over a couple of years it would overfit noise, chase recent performance — the very behaviour value investing exists to resist — and quietly convert a transparent, deterministic calculator into a self-modifying advice algorithm, which is precisely the NI 31-103 line the product guards.

In plain terms The engine is keeping a report card: of the stocks it rated “strong buy,” how did they actually do six and twelve months later — and did they beat the ones it rated “avoid”? None of them is old enough to grade yet, so the card is still blank. When it fills in, you (a human) read it and decide whether to adjust the rules. The engine never silently rewrites itself to chase whatever worked lately — that’s how systems fool themselves, and we won’t do it.
15

LLM governance, controls & reproducibility

In plain terms The AI is kept on a tight leash: it explains and prioritises, it doesn’t calculate. If it ever disagrees with the rulebook, the report says so out loud. And thousands of automated tests guard the maths.
16

Design rationale — why it’s built this way

Common questions a reviewer asks, and the deliberate reasoning behind each answer.

Why a semiconductor-cluster heuristic instead of a live correlation matrix?
For a personal book of ~10–30 names, a rolling correlation matrix is fragile: correlations are noisiest exactly when you would act on them (in a crash everything correlates toward 1), so it would generate the most sell pressure at the worst time. The honest cluster heuristic (treating, e.g., semiconductors as one cyclical complex) captures the concentration that actually matters, and the new regime-aware ceilings (§8) supply the “tighten when fragile” behaviour without the instability or the false precision.
Is the tax handling reactive or projective?
Both, by design. Per-action tax consequences are reactive (they price the cost of a trade you’re considering). But the plan is projective: contributions are modelled as the primary de-risking lever, and the Rebalance tool’s Tax-Neutral Check (§10) steers you to reach targets with new money before triggering a taxable disposition. Full contribution-room/placement projection lives in the separate Tax & Structure Audit, so the Strategy report stays focused.
How does human intuition enter without introducing model bias?
Through the conviction override (§13): a structured, documented, append-only override that sits beside the deterministic engine rather than inside it. The investor may overrule a rating, but overruling a caution compels a written thesis, and every change is logged with a date. The engine stays deterministic; the human judgement is explicit and on the record.
The 20%-drawdown trigger is “late by design” — isn’t that dangerous?
The Crash Watch is intentionally late because it protects a winner you want to keep after a tolerated pullback — trimming early at every top would forfeit the compounding that is the whole point. Crucially it is not the only defence: fundamental-deterioration SELLs (dangerous leverage, structural revenue decline, an AVOID-rated score the business itself confirms — §7/§8) fire on the business breaking, ahead of price. So catastrophic-failure protection comes from the fundamentals path; Crash Watch only guards a still-good name whose chart has clearly rolled over.
Why not let the engine self-optimise its weights from outcomes?
Because a self-tuning loop on one small portfolio over a short history overfits noise and chases recent performance — the opposite of disciplined value investing — and it would turn a transparent, auditable calculator into an opaque, self-modifying advice algorithm (an NI 31-103 concern). We build the measurement (§14) and let a human recalibrate deliberately, which is both safer and more honest.
17

Disclosures & methodological limitations

In one line A disciplined quality-and-value philosophy, encoded as testable deterministic rules — now regime-aware, tax-neutral by preference, open to documented human conviction, and honestly self-scored — anchored to the client’s IPS, goal and Canadian tax position, and translated into account-level, currency-native actions by a tightly-governed LLM exposition layer.