# Public Portfolio Challenge

> 4 AI agents. One runbook. Real $25K, live and verifiable. Currently +22.85%.

- **Type:** MCP server
- **Install:** `agentstack add mcp-austin-starks-public-portfolio-challenge`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [austin-starks](https://agentstack.voostack.com/s/austin-starks)
- **Installs:** 0
- **Category:** [Finance & Payments](https://agentstack.voostack.com/c/finance-and-payments)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [austin-starks](https://github.com/austin-starks)
- **Source:** https://github.com/austin-starks/Public-Portfolio-Challenge

## Install

```sh
agentstack add mcp-austin-starks-public-portfolio-challenge
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Public Portfolio Challenge

**4 AI agents. One open runbook. Real $25K, live and verifiable.**

[](https://nexustrade.io/shared-portfolio/69a7dc7cf99e43688fcec567)
[](https://nexustrade.io/developers)
[](episode-10/BAKEOFF_RUNBOOK.md)
[](#get-started)

[](https://nexustrade.io/shared-portfolio/69a7dc7cf99e43688fcec567)

*Live portfolio card — generated from current positions. [Open the full dashboard →](https://nexustrade.io/shared-portfolio/69a7dc7cf99e43688fcec567)*

| Account value | Total return | Return vs. SPY | Max drawdown | Days live |
| ---: | ---: | ---: | ---: | ---: |
| $30,712.48 | +22.85% | +10.78 pp (SPY +12.07%) | −12.33% | 144 |

As of July 31, 2026. Same-window comparison begins with the first stored live observation. [Portfolio data](https://nexustrade.io/api/share-portfolio/portfolio/69a7dc7cf99e43688fcec567/history) · [Performance data](https://nexustrade.io/api/share-portfolio/69a7dc7cf99e43688fcec567/performance) · [SPY data](https://nexustrade.io/api/stock/SPY/history/price?brokerage=Public) · refreshed weekly by GitHub Actions.

**Quick start:** [Copy the live incumbent](https://nexustrade.io/shared-portfolio/69a7dc7cf99e43688fcec567?deploy=1) · [Connect MCP](#step-3--connect-your-ai-tool) → `python3 start.py` → **paste `prompt.txt` into a fresh agent chat**

---

## Contents

- [What is this?](#what-is-this)
- [Agent bakeoff](#agent-bakeoff)
- [What this repo gives you](#what-this-repo-gives-you)
- [How the runbook works](#how-the-runbook-works)
- [What's inside](#whats-inside)
- [Community leaderboard](#community-leaderboard)
- [Get started](#get-started)
- [Risk disclaimer](#risk-disclaimer)
- [More links](#more-links)

---

## What is this?

In February 2026 I deposited **$25,000** into a live [Public](https://public.com) brokerage account on NexusTrade and made the entire book public — every position, every fill, every model test, every bug, every failure.

Not paper. Not a backtest screenshot. **Real money, documented in real time.**

The live story is a blog series. **Episode 10 is the write-up of this repo in action:** Claude Fable 5 ran [`episode-10/BAKEOFF_RUNBOOK.md`](episode-10/BAKEOFF_RUNBOOK.md) end to end — engine sanity checks, 16 strategy variants, walk-forward certification, a single-touch lockbox — and deployed a live momentum-options book that beat the market out of sample. Fable 5 was subsequently banned; the runbook, snapshots, and full campaign logs in `episode-10/` are still here so you can run the same discipline with any model.

| | |
| --- | --- |
| **[Full series →](https://nexustrade.io/blog/series/public-portfolio-challenge)** | Ten episodes and counting: model bakeoffs, deploy day, production bugs, week-one gains, panic sells, engine rewrites, and the open runbook. |
| **[Episode 1 →](https://nexustrade.io/blog/im-giving-an-ai-access-to-my-public-trading-account-heres-how-you-can-watch-it-destroy-25000-20260228)** | Where it started — why $25k, why Public, why total transparency. |
| **[Episode 10 →](https://nexustrade.io/blog/claude-fable5-built-my-live-options-strategy-then-got-banned-20260614)** | The full story of Fable 5 running this runbook — every gate, engine bug, and dead end logged in [`FABLE_CAMPAIGN.MD`](episode-10/FABLE_CAMPAIGN.MD). |
| **[Episode 10 on Medium →](https://medium.com/p/b5b2db76dc6c)** | Same article, syndicated on Medium — included here so readers who follow the challenge off-platform can find it without hunting. |

**This repo is the open playbook.** Episode 10 documents one agent's run through it. The runbook is yours to replay with whatever model you have. [The agents don't just trade the account—they commit to this repo.](https://github.com/austin-starks/Public-Portfolio-Challenge/commits/main/)

---

## Agent bakeoff

Four agents received the same Episode 10 discipline. The useful result is not a single giant backtest—it is whether a fixed deploy-shape candidate cleared the frozen out-of-sample gates.

| Agent | Best comparable OOS mean return | Passed every gate? | Outcome | Notable failure |
| --- | ---: | --- | --- | --- |
| [Claude Code](episode-10/CLAUDE_CODE_CAMPAIGN_LOG_20260613T165226Z.md#deliverable--verdict-no-deployable-finalist-honest-no-deploy) | **+53.7%** | No | No deploy | Cleared breadth, absolute return/Sortino, drawdown, and posture; failed Gate 4 against the incumbent. |
| [Codex](episode-10/CODEX_CAMPAIGN_LOG_20260613T165248Z.md#final-wf-verdict) | **+32.3%** | No | No deploy | The strongest fixed deploy-shape candidate still failed the incumbent bar and two fold Sortino floors. |
| [Cursor](episode-10/CURSOR_CAMPAIGN_LOG_20260613T165224Z.md#session-3--assembled-book-gate-evaluation-2026-06-13t1732z) | **+33.9%** | No | Incomplete; no deploy | Solved breadth at low allocation, then failed Gate 4; later studies were still running when the log ended. |
| [Claude Fable 5](episode-10/FABLE_CAMPAIGN.MD#head-to-head-for-deploy-both-measured-directly-on-the-deployable-object) | **+88.3%** | No—owner override | Deployed | Strong return and drawdown, but missed strict breadth, fold-Sortino, stability, and posture gates; later engine fixes weakened the selection-provenance claim. |

**Honest headline:** none of the four runs produced a clean pass under every frozen gate. Fable's strategy was deployed after a documented owner override, not because the runbook quietly moved the bars. Follow the links for fold-level evidence and every failure.

---

## What this repo gives you

### No install

Connect the NexusTrade MCP server to Cursor, Claude, or any OAuth-capable client. No NexusTrade install, no API keys to rotate — OAuth signs you in once in the browser. (Grab `start.py` + `example_profile.json` from the repo, or just copy them from GitHub.)

### One prompt

[`episode-10/BAKEOFF_RUNBOOK.md`](episode-10/BAKEOFF_RUNBOOK.md) is a self-contained agent brief — paste it into a fresh session and let the agent execute. It prescribes *what* must be true, never *how* to achieve it. New here? Take the [fast path](#get-started) instead — run `python3 start.py` and paste one prompt.

### Real rigor

Walk-forward validation, a held-out lockbox, deploy gates, and capital-posture rules. A high in-sample backtest number is never the headline.

---

## How the runbook works

The campaign is built around one idea: **out-of-sample performance is the only result that counts.**

```mermaid
flowchart LR
  A["🔍 Searchbacktests & optimization"] --> B["✓ Certifywalk-forward folds"]
  B --> C["🔒 Lockboxsingle-touch confirm"]
  C --> D["🚀 Deploylive portfolio"]
```

| Layer | Job |
| --- | --- |
| **Search** | Invent and tune candidate strategies fast — variants, sweeps, backtests. |
| **Certify** | Walk-forward: each fold optimizes in-sample, scores on held-out OOS the optimizer never saw. |
| **Lockbox** | A final untouched window. One touch. No peeking. |
| **Deploy** | Clone to a live portfolio, parity-check, attach monitoring. |

Fixed by the runbook: a frozen watchlist (**20 names** in the Episode 10 bakeoff; **21** in Episode 11 after adding `SPCX`), $25,000 capital, the fold calendar, the gates, the lockbox rules, and the deploy procedure. **Yours to design:** signals, structures, deltas, exits, sizing — anything that clears the gates is valid.

The watchlist (frozen — 20 in Ep 10, 21 in Ep 11)

`ANET` · `DUOL` · `HOOD` · `LLY` · `GS` · `META` · `TSM` · `AVGO` · `XOM` · `COP` · `OSCR` · `AMAT` · `ADI` · `DDOG` · `OKTA` · `NET` · `APP` · `GLD` · `MU` · `SNDK` · `SPCX`*

*`SPCX` was added in Episode 11; the Episode 10 bakeoff runs the first 20.

---

## What's inside

The discipline lives in two forms. The **skills library** ([`skills/`](skills/)) is the runbooks decomposed into composable agent skills on the [open `SKILL.md` standard](https://agentskills.io) — the **same folder runs in Claude Code, Codex CLI, Cursor, Gemini CLI, Copilot and ~15 other tools** (`skills/install.sh` handles each tool's path + adapter). Connect the NexusTrade MCP and the agent auto-invokes the skill that fits the task, no paste required. The **episode folders** preserve the complete public timeline: historical indexes for Episodes 1–9, then the original runbooks and campaign logs for the reproducible campaigns.

```
skills/                      ← the skills library (install into ANY agent — see skills/README.md)
├── README.md                        ← index + how the skills compose
├── run-episode/                     ← entry point: /run-episode 10 (sequences the stages)
├── portfolio-certification/         ← umbrella orchestrator (the staged PASS/FAIL run)
├── walk-forward-oos/                ← the OOS certification engine
├── breadth-audit/                   ← true participation at fixed $25k
├── sweep-reoptimization/            ← re-sweep on structural change + provenance
├── options-structure-rules/         ← spread-shape rule + hard constraints
├── alt-data-indicators/             ← custom indicators (Reddit, congressional, …)
├── bug-protocol/                    ← "loudly declare" + hand-off doc template
├── deploy-gate/                     ← the gated deploy + reconcile flow
├── engine-sanity/                   ← Stage-S0 pre-flight contract checks
├── strategy-bakeoff/                ← the SEARCH→CERTIFY multi-family funnel
└── lockbox-holdout/                 ← single-touch holdout + A/B/C baselines
```

Each episode is a self-contained folder: the **runbook** to paste, plus the **campaign logs** from each operator/agent run.

Episodes 1–9 predate the current repository format. Their folders preserve the runbook provenance that still exists, the outcome, an honest historical grade, and the canonical article instead of pretending missing artifacts can be reconstructed.

| Episode | Outcome | Grade | Record |
| ---: | --- | --- | --- |
| 1 | Opened the real-money challenge and established the public record. | Historical; not scored under current gates | [`episode-01/`](episode-01/) |
| 2 | Converted expert feedback into a more disciplined agent workflow. | Historical; not scored under current gates | [`episode-02/`](episode-02/) |
| 3 | Compared 11 AI models on strategy construction. | Research bakeoff; pre-current gates | [`episode-03/`](episode-03/) |
| 4 | Tested automated hill-climbing and found optimization did not automatically beat the first attempt. | Research result; pre-current gates | [`episode-04/`](episode-04/) |
| 5 | Reached the first live options deployment milestone. | Deployed under episode-era controls | [`episode-05/`](episode-05/) |
| 6 | Documented day-one live behavior. | Live observation; not a certification | [`episode-06/`](episode-06/) |
| 7 | Hit a close-order failure and rebuilt the risk engine around it. | Failure documented and remediated | [`episode-07/`](episode-07/) |
| 8 | Published the week-one gain with the live book visible. | Live snapshot; not forward evidence | [`episode-08/`](episode-08/) |
| 9 | Documented the gain, the panic sell, and the human override risk. | Failure documented | [`episode-09/`](episode-09/) |

```
episode-10/
├── BAKEOFF_RUNBOOK.md             ← paste this into a fresh MCP session
├── RUNBOOK_OG.md                  ← the original (Episode 1) runbook, kept for reference
├── snapshots/                     ← baseline + incumbent seed portfolios the runbook loads
├── addendum/                       ← entry/exit redesign, deploy evidence, diagram, and bug note
├── FABLE_CAMPAIGN.MD              ← operator run log (Fable 5)
├── CLAUDE_CODE_CAMPAIGN_LOG_*.md  ← agent run log (Claude)
├── CODEX_CAMPAIGN_LOG_*.md        ← agent run log (Codex)
└── CURSOR_CAMPAIGN_LOG_*.md       ← agent run log (Cursor)
```

| File | What it is |
| --- | --- |
| [`skills/`](skills/) | **The skills library.** 12 composable agent skills on the open [`SKILL.md`](https://agentskills.io) standard (Claude Code, Codex, Cursor, Gemini, Copilot, …) — the whole certification discipline, auto-invoked instead of pasted. Entry point: `/run-episode 10`. [`skills/README.md`](skills/README.md) is the index. |
| [`start.py`](start.py) + [`example_profile.json`](example_profile.json) | **Start here (fast path).** `python3 start.py` walks you through your watchlist + risk tolerance, writes `profile.json` and a `prompt.txt` to paste — the agent builds *you* a personalized strategy. No runbook needed. |
| [`episode-10/BAKEOFF_RUNBOOK.md`](episode-10/BAKEOFF_RUNBOOK.md) | The agent brief you run — walk-forward validation, lockbox, deploy gates. Paste and execute top to bottom. |
| [`episode-10/RUNBOOK_OG.md`](episode-10/RUNBOOK_OG.md) | The original Episode-1 runbook, kept for reference (the brief has since expanded). |
| [`episode-10/snapshots/`](episode-10/snapshots) | Baseline A/B and incumbent seed portfolios the runbook loads via `create_portfolio`. |
| [`episode-10/addendum/`](episode-10/addendum) | Episode 10 entry/exit redesign addendum: runbook, campaign evidence, OOS comparison diagram, and bug note. |
| Campaign logs | Per-run logs from each operator/agent: [`FABLE_CAMPAIGN.MD`](episode-10/FABLE_CAMPAIGN.MD), [`CLAUDE_CODE_…`](episode-10/CLAUDE_CODE_CAMPAIGN_LOG_20260613T165226Z.md), [`CODEX_…`](episode-10/CODEX_CAMPAIGN_LOG_20260613T165248Z.md), [`CURSOR_…`](episode-10/CURSOR_CAMPAIGN_LOG_20260613T165224Z.md). |

**Episode 11** continues the story on the now-live book — each attempt is its own runbook:

```
episode-11/
├── attempt1/  RUNBOOK.md + CAMPAIGN_LOG.md                 ← certify the live book, re-optimize on FAIL
├── attempt2/  RUNBOOK.md + CAMPAIGN_LOG.md + TOTALBUDGET_BUG.md  ← repair cross-watchlist participation
├── attempt3/  RUNBOOK.md                                   ← alt-data (Reddit/WSB) on the certified book
└── …                                                       ← later focused strategy campaigns
```

Each new episode/attempt gets its own folder when the runbook or campaign parameters change materially.

---

## Community leaderboard

**Think your agent can beat the incumbent without moving the gates? Prove it.** Fork the repo, run the campaign on NexusTrade, and open a PR under [`community-runs/`](community-runs/).

| Rank | Run | Agent | OOS return | OOS Sortino | Worst max drawdown | Gates | Evidence |
| ---: | --- | --- | ---: | ---: | ---: | --- | --- |
| — | No verified community runs yet | — | — | — | — | — | [Submit the first run](community-runs/README.md) |

Only runs that pass every current gate are ranked by mean OOS return. Failed runs stay visible—the point is reproducibility, not survivor bias. Start with the [submission guide](community-runs/README.md) and [result template](community-runs/example/result.json).

---

## Get started

### Step 1 — Developers page

Open **[nexustrade.io/developers](https://nexustrade.io/developers)**.

[](https://nexustrade.io/developers)

### Step 2 — Create a free account

You'll need a NexusTrade account to authorize MCP and access portfolios, backtests, and live trading tools.

[](https://nexustrade.io/register)

### Step 3 — Connect your AI tool

**Recommended: OAuth.** No keys to copy, rotate, or leak. Sign in once in the browser when your client first calls a NexusTrade tool.

```
https://nexustrade.io/api/mcp
```

#### Cursor *(recommended)*

1. On the [Developers page](https://nexustrade.io/developers), expand **API Keys**.
2. Under **Connect an AI tool to NexusTrade**, click **Add to Cursor**.
3. OAuth runs automatically on first tool use.

[](https://nexustrade.io/developers)

[](https://nexustrade.io/developers)

Manual Cursor config

```json
{
  "mcpServers": {
    "nexustrade": {
      "url": "https://nexustrade.io/api/mcp"
    }
  }
}
```

Claude Desktop / Claude Code

Click **Copy install command** on the Developers page, or:

```bash
claude mcp add nexustrade --transport http https://nexustrade.io/api/mcp
```

VS Code, ChatGPT, Windsurf, Zed, and other MCP clients

Use **Add to VS Code** on the Developers page, or paste the MCP URL into your client's connector settings. OAuth 2.1 discovery works the same eve

…

## Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [austin-starks](https://github.com/austin-starks)
- **Source:** [austin-starks/Public-Portfolio-Challenge](https://github.com/austin-starks/Public-Portfolio-Challenge)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/mcp-austin-starks-public-portfolio-challenge
- Seller: https://agentstack.voostack.com/s/austin-starks
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
