Paper trading. No real money is invested and nobody earned these results. Every figure here is hypothetical. The full disclosures →
HYPOTHETICAL PERFORMANCE These are paper-trading portfolios. No client money is invested, no orders are routed to any venue, and no result shown here was achieved with real capital. Hypothetical results have inherent limitations and do not reflect the effect of real order flow on price.
AI Portfolios
The public record of AI-managed portfolios.

P01 · Paper portfolio

Long-Term Compounders

by AI Portfolios

$99,899
−$101 (-0.10%)
Since 2026-08-13 · started at $100,000
All time
-0.10%
Holdings
5
Risk level
moderate
Against SPY
$97,180$98,470$99,761$101,0512026-08-132026-09-14
2026-08-132026-09-14

This portfolio lost 0.10% since it started; SPY lost 2.20%. The dots are its 5 trades.

100 is the $100,000 this book started with, so where its line ends is its total return — the same figure as the one at the top of this page. The dashed line is that same money in SPY, bought at its first closing price shown here. Percentages, never share prices.

Index values are derived percentage returns over IEX last-trade closes, which are licensed for publication; no raw vendor price is rendered.

LATEST TRADE
BUY MSFT
14.09 @ $496.57
$6,996
priced 2026-08-13 20:06 UTC
(the reasoning, the facts it saw and the gates it passed are in Advanced)
Current holdings
COST · 6.24
$5,731
-4.34% −$260
JNJ · 26.71
$7,115
+2.15% +$150
MSFT · 14.09
$7,125
+1.84% +$129
UNP · 20.15
$5,743
-4.47% −$268
V · 16.42
$6,162
+2.47% +$148
Cash
$68,021
Recent activity
2026-08-13 — BUY MSFT @ $496.57
2026-08-13 — BUY JNJ @ $260.76
2026-08-13 — BUY COST @ $960.39
2026-08-13 — BUY UNP @ $298.37
2026-08-13 — BUY V @ $366.28
About

Quality at a defensible price. Returns come from the underlying businesses compounding, not from re-rating. The AI's job is to rank quality and identify thesis breaks, not to time the market.

Follow Long-Term Compounders

This is the simple view. Nothing has been removed — the decision records, the refused proposals, the AI's own words, the cost model, the published limits and the hash chain are all in Advanced, which is the switch in the header. How to verify any of it →

Showing every layer. Pick Simple or Advanced in the header to choose one — nothing is removed either way, and the full record is always in this page.

Home / portfolios / P01

Long-Term Compounders

P01mandate activemoderate riskrulebook v1.3.0rank and explain
Catching upCATCHING_UP

A published decision instant passed unanswered and the next run will answer it, stamped with both instants so the lateness is visible: due 2026-09-20T16:00:00+00:00 (5.9d ago) and newest decision run of any kind is 2026-09-13T22:47:15.104596+00:00. QUEUED FOR CATCH-UP — the next run picks it up; it expires 2026-09-27T16:00:00+00:00.

since 2026-09-20 16:00Znext instant 2026-09-27 16:00Zevidence weekly_review

Compound capital over a 5-10+ year horizon by owning a concentrated set of high-quality businesses that earn durable returns on invested capital and reinvest at attractive rates. Minimise turnover, taxes and trading cost.

Long-Term Compounders's decisions, live →The public decision feed posts every decision when it's made — before settlement, refusals included. On Telegram, free.
Cadence — when it last decided, and when it next will
Next decision due
2026-09-27 16:00Z
Decision slots
3 · 1 non-deciding
SlotLast dueAnsweredStatus
weekly review
0 12 * * SUN · America/New_York
2026-09-20 16:00neverCATCH_UP_DUE
due 2026-09-20T16:00:00+00:00 (5.9d ago) and newest decision run of any kind is 2026-09-13T22:47:15.104596+00:00. QUEUED FOR CATCH-UP — the next run picks it up; it expires 2026-09-27T16:00:00+00:00.
monthly rebal
0 12 1 * * · America/New_York
2026-09-01 16:002026-09-01 22:51ok
due 2026-09-01T16:00:00+00:00, ran 2026-09-01T22:51:48.277976+00:00 (LATE by 7h — a catch-up, recorded as one)
quarterly deep
0 12 20 2,5,8,11 * · America/New_York
2026-08-20 16:002026-08-20 22:42ok
due 2026-08-20T16:00:00+00:00, ran 2026-08-20T22:42:12.538344+00:00 (LATE by 7h — a catch-up, recorded as one)
daily risk scan
30 16 * * MON-FRI · America/New_York
—n/adoes not decide
This slot marks and reports; it never calls the model, so it leaves no decision record to check it against.

Catch-up policy. A decision instant that passes unanswered is run on the next pass, once, and the record stamps both instants — when it was due and when it actually ran. Past the catch-up window the gap stays open and is published as missed rather than backfilled.

Track record

Total return
-0.10%
net of modelled costs
Max drawdown
-1.28%
2026-08-25 → 2026-09-09
Live since
2026-08-13
21 daily observations completed · 96 NAV marks
Cost drag
0.02%
$0 in explicit fees
Sharpe
withheld
sample too short to annualise — see the display rules on the leaderboard
Gross return
-0.08%
before costs

Fewer than 60 daily observations. Annualised return, volatility, Sharpe, Sortino and Calmar are withheld: annualising a short sample produces numbers that look precise and are not.

NAV — every point is a recorded close, none can be edited
2026-08-13dashed line = starting capital2026-09-14

Our own marks from our own fills (nothing here is vendor price data). Deliberately monochrome: colour that codes "good" and "bad" is an editorial thumb on the scale.

Against SPY — both indexed to 100 at the starting capital
$97,180$98,470$99,761$101,0512026-08-132026-09-14
2026-08-132026-09-14
Portfolio -0.10%SPY -2.20%● buy ○ sell — 5 in view

Index 100 is the starting capital ($100,000), so this line ends at the total return published above it. The comparison line is indexed to the same capital and starts at 100 at its own first close here: the record carries no priced instant at which capital was granted, so the comparison capital is uninvested until then rather than given a price nothing printed. Both cover the identical window.

Index values are derived percentage returns over IEX last-trade closes, which are licensed for publication; no raw vendor price is rendered.

Open positions — since the AI entered
symbolsince entryweightopened
MSFT+1.8%+7.1%2026-08-13
JNJ+2.1%+7.1%2026-08-13
V+2.5%+6.2%2026-08-13
UNP-4.5%+5.8%2026-08-13
COST-4.3%+5.7%2026-08-13

Return since the AI entered, measured from this book's own mark against what it actually paid — our own numbers over our own record, not vendor price data.

What's in it — weights from the last recorded NAV mark
MSFT 7.1%JNJ 7.1%V 6.2%UNP 5.8%COST 5.7%CASH 68.1%holdingsby last mark
MSFT7.1%Information Technology
JNJ7.1%Health Care
V6.2%Financials
UNP5.8%Industrials
COST5.7%Consumer Staples
CASH68.1%cash

Weights are our own work product, computed at the newest audit-chain NAV mark — never re-derived later, never estimated from cost basis. Logos identify the holdings and imply no endorsement (operator decision, session 11); sector tints are structure, not judgement.

Current holdings
SymbolQuantityAvg costStopOpened
COST5.7%6.2380960.39—2026-08-13
committed 2026-08-14
JNJ7.1%26.7094260.76—2026-08-13
committed 2026-08-14
MSFT7.1%14.0879496.57—2026-08-13
committed 2026-08-14
UNP5.8%20.1484298.37—2026-08-13
committed 2026-08-14
V6.2%16.4181366.28—2026-08-13
committed 2026-08-14

Why two dates? "Opened" is the market session the opening fill was priced on. The licensed data feed's T+1 rule means a cycle prices on the newest session already licensed for use, so the run that produced the fill can be committed to the audit chain on a later date — that commitment date is shown beneath. The commitment time is what makes history tamper-evident; the pricing session is what returns are computed from. Both are published on every fill.

Starting capital
$100,000own work — never restated
Benchmarks
SPY · RSP, QQQ
Mandate hash
14dd417ea28153f94adbf0cd79869ae5a79892a7857aebd02070037ef29acc6b

Recent decisions

Every run, including the ones that traded nothing: the committed fact-pack hash (written to the audit chain before anything was proposed), the AI's published view, each proposal with the rule engine's verdict, and the fills that resulted. Rejected proposals stay up with their reason codes — a reader who can only see the trades that happened cannot judge the discipline that refused the ones that didn't.

Every card carries the instant it was decided at, because every card is a photograph. The facts in it were frozen when the run was committed and are never revised — a view that said "the platform has closed zero trades" was true at its timestamp and reads as a claim about today unless the card says otherwise. Consecutive runs that halted on identical codes are compressed into one card with a visible count and every run id listed; nothing is dropped.

Model view at 2026-09-10 20:05Zfacts frozen when the run was committed, not updated — every figure the AI cites was true then and is never revised herefact pack ef98493cc811…
post closeclaude-opus-4-8
fact pack ef98493cc81113f1… · run run_241f76047f2a4da4
Model view at 2026-09-03 20:05Zfacts frozen when the run was committed, not updated — every figure the AI cites was true then and is never revised herefact pack b8db1921418d…
post closeclaude-opus-4-8
fact pack b8db1921418d015b… · run run_c4b6d00f6a964f2b
Model view at 2026-08-31 20:05Zfacts frozen when the run was committed, not updated — every figure the AI cites was true then and is never revised herefact pack c24277c67d78…
post closeclaude-opus-4-8
fact pack c24277c67d788799… · run run_652758aa1d93419f
Model view at 2026-08-27 20:05Zfacts frozen when the run was committed, not updated — every figure the AI cites was true then and is never revised herefact pack 00189f85af84…
post closeclaude-opus-4-8
fact pack 00189f85af843069… · run run_002d4ec540954367
Model view at 2026-08-20 20:05Zfacts frozen when the run was committed, not updated — every figure the AI cites was true then and is never revised herefact pack 631ac891afb7…
post closeclaude-opus-4-8

AI-generated. All quantitative claims traced to the published fact pack. Mandate P01 is a long-horizon quality-compounder book with heavy cash: cash_pct 68.09% (pf.cash_pct), NAV ~99,895 USD (pf.nav), 5 of 25 slots used (pf.position_count, pf.max_positions), 20 slots free (pf.position_slots_free), min new position 1,997.91 USD (pf.min_new_position_usd). Portfolio is essentially flat since inception (pf.total_return_pct -0.10%) with negligible drawdown (pf.drawdown_pct 0.30%). All positions were opened only 6 days ago (pos.*.days_held=6), so the book is newly established. The mandate philosophy is quality at a defensible price, minimise turnover; it explicitly asks me to rank quality and flag thesis breaks, not to time the market. On the five holdings, all show durable-business hallmarks: COST, JNJ, MSFT, UNP, V each have 5/5 FCF-positive years (fx.COST.fcf_positive_years_of_last_5, fx.…

ProposalConvictionLifecycleCodes
HOLD COST4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD JNJ4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD MSFT4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD UNP4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD V4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—

Reading the lifecycle. PROPOSED and GATES PASSED are published facts. QUEUED is shown as reached only where a fill proves it — the payload publishes no order record. FILLED / EXPIRED stays undecided without a matching fill, because an accepted order can price on a later session under the T+1 rule, and calling that "expired" would be inventing the outcome. "Accepted" alone used to sit in this column and read as though the trade had happened.

fact pack 631ac891afb74307… · run run_b90bb03bcd7c4a08
Model view at 2026-08-19 20:05Zfacts frozen when the run was committed, not updated — every figure the AI cites was true then and is never revised herefact pack e9c29eea7fd7…
post closeclaude-opus-4-8

AI-generated. All quantitative claims traced to the published fact pack. Mandate P01 seeks 5-10yr compounders with durable ROIC, quality-at-a-defensible-price, minimal turnover. The book holds 5 positions, all only 5 days old (pos.COST.days_held, pos.JNJ.days_held, pos.MSFT.days_held, pos.UNP.days_held, pos.V.days_held all =5), with ~67.9% cash (pf.cash_pct=67.887) and 20 free position slots (pf.position_slots_free=20). Total return is essentially flat (pf.total_return_pct=0.2009), no drawdown (pf.drawdown_pct=0). The fact pack contains price/momentum, market cap, ADV, ATR, FCF-positive-years-of-last-5, and years-of-public-history — but NO valuation multiples (P/E, EV/EBITDA), NO ROIC/margin data, NO growth data. For a quality-at-a-defensible-price mandate, the two decisive inputs — quality (ROIC/reinvestment) and price (valuation) — are BOTH absent. I therefore cannot rank "quality a…

ProposalConvictionLifecycleCodes
HOLD COST3PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD JNJ3PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD MSFT3PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD UNP3PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD V3PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—

Reading the lifecycle. PROPOSED and GATES PASSED are published facts. QUEUED is shown as reached only where a fill proves it — the payload publishes no order record. FILLED / EXPIRED stays undecided without a matching fill, because an accepted order can price on a later session under the T+1 rule, and calling that "expired" would be inventing the outcome. "Accepted" alone used to sit in this column and read as though the trade had happened.

fact pack e9c29eea7fd7ff40… · run run_4b52a82fdf5b4e19
Model view at 2026-08-14 20:05Zfacts frozen when the run was committed, not updated — every figure the AI cites was true then and is never revised herefact pack cf2f1d7ecd1a…
post closeclaude-opus-4-8

AI-generated. All quantitative claims traced to the published fact pack. Mandate P01 seeks 5-10yr compounders — quality businesses with durable FCF, bought at a defensible price, minimising turnover. The portfolio holds 5 quality names (COST, JNJ, MSFT, UNP, V), each ~6-7% weight, with 68.1% in cash (pf.cash_pct) and 20 free position slots (pf.position_slots_free). All five holdings show days_held=0 (pos.*.days_held), meaning they were just established; total portfolio return is roughly flat (pf.total_return_pct = -0.15%). Given the philosophy explicitly instructs "the AI's job is to rank quality and identify thesis breaks, not to time the market," and turnover should be minimised, the existing holdings are all high-quality, 5/5 FCF-positive names (fx.*.fcf_positive_years_of_last_5 = 5 for COST, JNJ, MSFT, UNP, V) with long public histories. None show a thesis break: JNJ ret_252d +49.3%…

ProposalConvictionLifecycleCodes
HOLD MSFT4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD JNJ4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD COST4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD UNP4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—
HOLD V4PROPOSED→GATES PASSED→NO ORDER
HOLD is a decision not to trade — no order is created
—

Reading the lifecycle. PROPOSED and GATES PASSED are published facts. QUEUED is shown as reached only where a fill proves it — the payload publishes no order record. FILLED / EXPIRED stays undecided without a matching fill, because an accepted order can price on a later session under the T+1 rule, and calling that "expired" would be inventing the outcome. "Accepted" alone used to sit in this column and read as though the trade had happened.

fact pack cf2f1d7ecd1aef09… · run run_9b03202bc0eb4b46
Model view at 2026-08-13 20:05Zfacts frozen when the run was committed, not updated — every figure the AI cites was true then and is never revised herefact pack 07168d468354…
post closeclaude-opus-4-8

AI-generated. All quantitative claims traced to the published fact pack. Mandate P01 seeks 5-10+ year compounders: durable, high-quality businesses with consistent free cash flow at a defensible price, minimising turnover. Portfolio is 100% cash (pf.cash_pct=100), 25 slots free (pf.position_slots_free), $100k NAV (pf.nav). This is an opening-allocation problem, not a trading problem, so I select a small set of highest-quality names with the strongest evidence of durable cash generation available in the pack. The fact pack is thin on the metrics that actually define quality — there is no ROIC, margin, revenue growth, leverage or valuation multiple anywhere. The only fundamental signals present are fcf_positive_years_of_last_5 and years_public_history; everything else is price/momentum/liquidity. I therefore cannot rank "quality at a defensible price" with any rigour: I can confirm consi…

ProposalConvictionLifecycleCodes
BUY MSFT4PROPOSED→GATES PASSED→QUEUED→FILLED—
BUY JNJ4PROPOSED→GATES PASSED→QUEUED→FILLED—
BUY COST3PROPOSED→GATES PASSED→QUEUED→FILLED—
BUY UNP3PROPOSED→GATES PASSED→QUEUED→FILLED—
BUY V3PROPOSED→GATES PASSED→QUEUED→FILLED—

Reading the lifecycle. PROPOSED and GATES PASSED are published facts. QUEUED is shown as reached only where a fill proves it — the payload publishes no order record. FILLED / EXPIRED stays undecided without a matching fill, because an accepted order can price on a later session under the T+1 rule, and calling that "expired" would be inventing the outcome. "Accepted" alone used to sit in this column and read as though the trade had happened.

fills: BUY 14.0879 MSFT @ 496.57 · BUY 26.7094 JNJ @ 260.76 · BUY 6.2380 COST @ 960.39 · BUY 20.1484 UNP @ 298.37 · BUY 16.4181 V @ 366.28

fact pack 07168d4683541cc2… · run run_50adb3e2b61d4c44

What the AI is allowed to do

This portfolio's AI ranks candidates and explains its reasoning. It proposes direction and conviction only. Every price, quantity, weight and risk limit is computed by deterministic code the model cannot see or influence.

It may propose

BUY · ADD · TRIM · SELL · HOLD · FLAG_THESIS_BREAK

At most 5 proposals per run, each carrying a direction, a conviction from 1 to 5, a rationale, and references to the facts it used.

It cannot
  • set a price
  • set a quantity or share count
  • set a weight or position size
  • set or move a risk limit
  • execute anything

Model tier deep · prompt version P01-v1. Any change to the decider or the prompt is recorded as a MODEL_CHANGE event in the audit chain — without it the record would be a chimera of two systems presented as one.

Enforced limits

Every limit below names the code path that enforces it. This is not decoration: a limit that is published but never fires is worse than no limit, because a reader has no way to tell the difference. A test walks every mandate, drives the engine into the state each declared control claims to protect against, and fails the build if nothing stops it.

exposure
LimitValueEnforced by
Maximum gross exposure100.0%gate 2 — size_order
Maximum single sector30.0%gate 2 — size_order
permissions
LimitValueEnforced by
Shortingprohibitedgate 1 — proposal validation
Derivativesprohibitedgate 1 — proposal validation
Marginprohibitedgate 1 — proposal validation
sizing
LimitValueEnforced by
Maximum positions25gate 3 — BREACH_MAX_POSITIONS (portfolio limit check)
Minimum new position2.0%gate 2 — size_order
Maximum order as % of ADV1.0%gate 2 — size_order
loss limits
LimitValueEnforced by
Single-day loss alert7.0%gate 3 — alert
data integrity
LimitValueEnforced by
Stale-data halt48 hoursgate 3 — HALT_STALE_DATA
drawdown ladder
LimitValueEnforced by
At −15.0% drawdownalert, publish_commentarygate 3 — drawdown ladder
At −25.0% drawdownalert, publish_commentary, pause_new_positions_days:20gate 3 — drawdown ladder
At −35.0% drawdownalert, mandatory_deep_review, pause_all_buys_until_review_publishedgate 3 — drawdown ladder
At −60.0% drawdowngraveyard_reviewgate 3 — drawdown ladder
turnover
LimitValueEnforced by
Max trades per quarter8entry block — PAUSE_TURNOVER_CAP_REACHED (never blocks an exit)
Max annual turnover pct40entry block — PAUSE_TURNOVER_CAP_REACHED (never blocks an exit)
Min holding period days30entry block — PAUSE_TURNOVER_CAP_REACHED (never blocks an exit)
circuit breakers
LimitValueEnforced by
Halt trading if price gap unexplained pct25gate 3 — circuit breaker
Halt trading if benchmark data missingtruegate 3 — circuit breaker
Halt trading if factpack hash mismatchtruegate 3 — circuit breaker

Execution

Cost profile
zero_commission_us
Fill convention
vwap_window
Decision → order latency
60s
VWAP window
15 minutes

Fills are struck on a VWAP window that begins strictly after the decision timestamp plus a latency delay. No fill can use information from the bar in which the decision was made, so look-ahead is arithmetically impossible rather than merely avoided.

Philosophy

Quality at a defensible price. Returns come from the underlying businesses compounding, not from re-rating. The AI's job is to rank quality and identify thesis breaks, not to time the market.

Review schedule

JobCronTimezoneMakes a decision
weekly review0 12 * * SUNAmerica/New_Yorkyes
monthly rebal0 12 1 * *America/New_Yorkyes
quarterly deep0 12 20 2,5,8,11 *America/New_Yorkyes
daily risk scan30 16 * * MON-FRIAmerica/New_Yorkno

Published on a fixed, regular schedule. Never event-triggered — no "market is crashing, sell now" alerts, deliberately. This table is the promise; the cadence panel at the top of the page is whether it was kept, instant by instant.

Machine-readable mandate: config/portfolios/P01_long_term_compounders.yaml · human rulebook: docs/portfolios/P01_long_term_compounders.md · effective from 2026-08-06 (wall clock) · record starts 2026-08-13 (pricing session) · payload 540d30e63326…

Every trade, as it happens
What each portfolio bought, what it sold and what it lost. Free, on Telegram.
Join →
Or follow @AIPortfolios186 on X, where the same trades are posted.
Live public decision feed.Every decision, fill and refusal, as it is published — including the ones that lose money. Delivered on Telegram, free.Get the feed →or subscribe by RSS/Atom

The same decisions are posted on X as @AIPortfolios186.

Data provided for free by IEX. By accessing or using IEX Historical Data, you agree to the IEX Historical Data Terms of Use. · Powered by CoinGecko · Logos provided by Logo.dev · Company logos identify holdings only and imply no endorsement.