Skip to content

docs: participatory competition pivot spec + plan - #328

Draft
FlyM1ss wants to merge 3 commits into
mainfrom
docs/participatory-competition-spec
Draft

docs: participatory competition pivot spec + plan#328
FlyM1ss wants to merge 3 commits into
mainfrom
docs/participatory-competition-spec

Conversation

@FlyM1ss

@FlyM1ss FlyM1ss commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

DO NOT MERGE until the team has signed off — this sets platform direction, not just docs.

Docs only. No code, no schema, no routes.

What this is. ATL's hook becomes a participatory leaderboard: users write one trading instruction, run it against the same harness the house entries use, and see where they land.

Two boards, deliberately separate:

  • Replay — perpetual qualifier over a fixed month (2026-04-15 → 2026-05-15). Same data for everyone, so results are comparable. This is the argument.
  • Forward Season — weekly Mon→Fri, simulated forward execution on real bars. Derived from a template plus date arithmetic, never hand-configured. This is the habit.

Two things worth a reviewer's attention:

  1. One harness, two drivers. HourlyBacktester and LLMAgentStrategy both build the same PortfolioManager and call make_trading_decision_with_llm, which has a single if pipeline: branch. The divergence is parametric, not architectural — so "your leaderboard entry runs the same code as your agent" is a fact we can enforce, not a promise. The spec's earlier claim that the paths didn't share a template was wrong and is corrected.
  2. Phase 0 is a gate, not a PR. A ~$4.97 two-model probe measures whether the instruction text actually moves the model's behaviour. If it doesn't, the entire premise fails and Phase 2 should not be built. Needs a go-ahead before it runs.

Scope. Plan covers Phase 0 + Phase 1 only. Phase 1 adds no tables and no routes — it seeds six house entries as config and puts the live board above the fold. Phases 2 and 3 are scoped at the end of the plan and get their own plans once the gate resolves.

Blocked on: the probe spend, and Allan's sign-off on renumbering the 01/02/03 landing storyline (Task 8).

Files: docs/superpowers/specs/2026-08-09-participatory-competition-design.md, docs/superpowers/plans/2026-08-09-participatory-competition-phase-0-1.md.

🤖 Generated with Claude Code

FlyM1ss and others added 3 commits August 9, 2026 00:34
Open Track: users enter the leaderboard by submitting a trading
instruction, run through the house LLMAgentStrategy harness at fixed
season settings (Nemotron, temp 0, $10k, DJIA-30, one-month window).

Two loops: the existing backtest engine stays the cheap iteration
sandbox; a new deploy_user_entry() beside it produces the official,
H6-guarded, comparable curve. The published Model Track curves are
frozen; the Open Track carries its own house reference instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two boards (Replay qualifier + weekly Forward Season) replace the single
fixed replay. Corrects the harness analysis: engine and leaderboard share
one PortfolioManager and one branch in make_trading_decision_with_llm, so
the divergence is parametric, not architectural.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 0 is a gate, not a PR: a $4.97 two-model probe that must show
instruction quality moves the return before Phase 2 is built. Phase 1
ships display only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agentic-trading-lab Ready Ready Preview Aug 9, 2026 10:59am

FlyM1ss added a commit that referenced this pull request Aug 15, 2026
Settles the two naming questions the grilling session left open, and
fixes two honesty bugs the name change exposed.

Naming
- The board is the **Live Trading Leaderboard** (was the working title
  "Live Season"). The tab, the board title and the About card all use it.
- The tab key and API period become `live`. `season` and `daily` stay as
  aliases in NAV_VIEW_MAP, showCompetitionPanel, migrateSavedNavState and
  loadLeaderboardData, so ?view= deep links and saved localStorage from
  either earlier name land on the successor board. An unrecognised
  competitionTab matches no boot-CSS rule and no panel, so the failure
  mode being avoided is a blank Competition page, not a wrong tab.
- The current season is Season 0, the shakedown season; Season 1 is the
  first that counts.

Season 0 is falsy
`season?.number ? ... : 'Season —'` renders Season 0 as *no season at
all* — silently, and only for the season shipping right now. Both render
sites now go through displayedSeasonNumber(), which does an explicit
Number.isFinite check. Guarded by a source-shape test, because a test
that passes 3 cannot see this bug.

Two claims the UI was making and should not have been
- The subtitle fell back to `window.start_date` for its "last completed"
  date, so the board printed "last completed 2026-04-15" — a specific,
  plausible, entirely invented advance date sitting directly under the
  banner saying no season has run. That fallback is gone; only
  daily_status carries a real advance, and preview suppresses it outright.
- The season strip said "Next advance: nightly after the 16:00 ET close"
  unconditionally, promising a job that is not deployed. In preview it
  now reads "No advance scheduled".

"Live" is itself a claim, so the About card qualifies it: simulated
trading on real market data, no broker account, no real capital, no
order leaving the system. PR #328 puts brokered execution in non-goals
and execution/paper_backend.py is still a stub, so a board named for
live trading that never says "simulated" is the UI promising something
the system does not do. A guard test pins that disclaimer.

2866 passed, 78 skipped. Verified in a browser against a scratch-DB
backend: ?period=live really does come back as period=contest, the
preview banner fires, and none of the season chrome renders on the
Competition board (checked via getComputedStyle, not element.hidden —
a class-level `display` outranks the UA [hidden] rule and the attribute
lies about it).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9cV2UzLgdTVmwcHLAtJeA
FlyM1ss added a commit that referenced this pull request Aug 15, 2026
Race.tsx sold "Race on the live leaderboard / Paper trading on live
markets. Watch your agent climb against the community" over bullets
promising live prices and rankings that update as agents trade.

Every clause was false. Board entries come from the curated
config/leaderboard.json roster, so no user agent is on any board and no
entry path exists; Competition is a fixed historical window, so its
prices are not live and its rankings do not move; brokered execution is
a PR #328 non-goal with execution/paper_backend.py still a stub.

Now names the two boards the app actually serves, and discloses that the
Live Trading Leaderboard is in preview for Season 0 -- the landing-side
half of the board's own preview banner, since nothing renders that
banner one page upstream.

The claim survived because its guard was scoped one file too narrowly:
test_band_makes_no_paper_trading_claim bans paper[\s-]?trad in
WhyCare.tsx only, so it lived on in the neighbouring section. New guards
read the shipped bundle, not the TSX, so an unbuilt edit fails rather
than passing against stale text.

Bundle rebuilt per dashboard/landing/README.md; only the JS and CSS
hashes moved (the logo is byte-identical) and the hand-written auth
layer is unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L9cV2UzLgdTVmwcHLAtJeA
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant