Long-Term Compounders
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.
Track record
Fewer than two NAV observations. No statistics are meaningful yet.
Recent decisions
Every run, including the ones that traded nothing: the committed fact-pack hash (written to the audit chain before the model was called), the model'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.
The portfolio is at inception with a NAV of 100,000 USD (fact: pf.nav) held entirely in cash at 100 percent (fact: pf.cash_pct). There are zero current positions (fact: pf.position_count). The fact pack provides no eligible symbols to evaluate for investment (ELIGIBLE SYMBOLS: 0). Without any securities available for analysis, I cannot assess quality metrics, returns on invested capital, reinvestment opportunities, or valuations that align with the Long-Term Compounders mandate. The mandate requires identifying high-quality businesses that earn durable returns on invested capital and reinvest at attractive rates over a 5-10+ year horizon, but no such opportunities are presented in the current fact pack. Remaining in cash is the only rational position until eligible securities are provided for evaluation.
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.
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.
- 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 either 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.
| Limit | Value | Enforced by |
|---|---|---|
| Maximum gross exposure | 100.0% | gate 2 — size_order |
| Maximum single sector | 30.0% | gate 2 — size_order |
| Limit | Value | Enforced by |
|---|---|---|
| Shorting | prohibited | gate 1 — proposal validation |
| Derivatives | prohibited | gate 1 — proposal validation |
| Margin | prohibited | gate 1 — proposal validation |
| Limit | Value | Enforced by |
|---|---|---|
| Minimum new position | 2.0% | gate 2 — size_order |
| Maximum order as % of ADV | 1.0% | gate 2 — size_order |
| Limit | Value | Enforced by |
|---|---|---|
| Single-day loss alert | 7.0% | gate 3 — alert |
| Limit | Value | Enforced by |
|---|---|---|
| Stale-data halt | 48 hours | gate 3 — HALT_STALE_DATA |
| Limit | Value | Enforced by |
|---|---|---|
| At −15.0% drawdown | alert, publish_commentary | gate 3 — drawdown ladder |
| At −25.0% drawdown | alert, publish_commentary, pause_new_positions_days:20 | gate 3 — drawdown ladder |
| At −35.0% drawdown | alert, mandatory_deep_review, pause_all_buys_until_review_published | gate 3 — drawdown ladder |
| At −60.0% drawdown | graveyard_review | gate 3 — drawdown ladder |
| Limit | Value | Enforced by |
|---|---|---|
| Max trades per quarter | 8 | entry block — PAUSE_TURNOVER_CAP_REACHED (never blocks an exit) |
| Max annual turnover pct | 40 | entry block — PAUSE_TURNOVER_CAP_REACHED (never blocks an exit) |
| Min holding period days | 30 | entry block — PAUSE_TURNOVER_CAP_REACHED (never blocks an exit) |
| Limit | Value | Enforced by |
|---|---|---|
| Halt trading if price gap unexplained pct | 25 | gate 3 — circuit breaker |
| Halt trading if benchmark data missing | true | gate 3 — circuit breaker |
| Halt trading if factpack hash mismatch | true | gate 3 — circuit breaker |
Execution
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
| Job | Cron | Timezone | Makes a decision |
|---|---|---|---|
| weekly review | 0 12 * * SUN | America/New_York | yes |
| monthly rebal | 0 12 1 * * | America/New_York | yes |
| quarterly deep | 0 12 20 2,5,8,11 * | America/New_York | yes |
| daily risk scan | 30 16 * * MON-FRI | America/New_York | no |
Published on a fixed, regular schedule. Never event-triggered — no "market is crashing, sell now" alerts, deliberately.
Machine-readable mandate: config/portfolios/P01_long_term_compounders.yaml · human rulebook: docs/portfolios/P01_long_term_compounders.md · effective from 2026-08-06 · payload b618c290568f…