Tiverton House

Lord Tiverton
1 warning
CLOSED
$162,621.21 Equity
+$11,962.62 Realized P&L
8 Positions
+$223 Unrealized
$604,327.96 Buying Power
3m ago Broker Snapshot
LIVE Data Source
Mean Reversion · Pilot
$61,842
+$11,842 +23.7%
Realized
+$11,842
Unrealized
+$0
Deployed
0%
Positions 0 open
No open positions
Recent Trades last 6
Time Ticker Side Size Value Outcome
12d COHR Sell 8 × $295.03 $2,360 +$120 +5.4%
12d DELL Sell 11 × $515.40 $5,669 +$333 +6.2%
12d SMCI Sell 75 × $38.17 $2,863 +$40 +1.4%
13d DELL Sell 12 × $547.42 $6,569 +$748 +12.8%
2w SMTC Sell 3 × $165.00 $495 +$92 +22.7%
2w SMTC Sell 3 × $160.68 $482 +$79 +19.5%
Watchlist AMAT AMD AMZN AVGO COHR DELL FN FROG GEV GOOGL +15
Value & Carry · Control
$23,446
−$1,442 −5.8%
Realized
−$1,198
Unrealized
−$244
Deployed
71.8%
Positions 5 open
Ticker Qty Value Unrealized
AM 232 $4,900 −$86 −1.7%
KO 50 $4,431 −$37 −0.8%
MRK 3 $453 +$25 +5.8%
NI 75 $2,991 −$84 −2.7%
PRGO 345.07 $4,938 −$62 −1.2%
Recent Trades last 3
Time Ticker Side Size Value Outcome
14h MRK Sell 2 × $150.60 $301 +$16 +5.6%
7d JNJ Sell 10 × $260.96 $2,610 −$5 −0.2%
8d MRK Buy 5 × $142.65 $713 filled
Watchlist AM BMY JNJ KO MO NI PFE PRGO T VZ
Post-Catalyst Drift · Pilot
$52,442
+$2,729 +5.5%
Realized
+$2,263
Unrealized
+$467
Deployed
27.5%
Positions 3 open
Ticker Qty Value Unrealized
MSFT 20 $10,019 +$38 +0.4%
NVDA 10 $2,286 +$53 +2.4%
SNDK 1 $1,899 +$376 +24.7%
Recent Trades last 6
Time Ticker Side Size Value Outcome
15h SNDK Sell 1 × $1,889.33 $1,889 +$367 +24.1%
4d SNDK Sell 1 × $1,692.30 $1,692 +$170 +11.1%
4d OKTA Sell 11 × $185.20 $2,037 +$148 +7.8%
8d AVGO Sell 3.94 × $347.16 $1,367 −$22 −1.6%
2w SNDK Buy 3 × $1,522.75 $4,568 filled
12d MU Sell 3 × $979.74 $2,939 +$68 +2.4%
Watchlist AAPL AMAT AMD AMZN AVGO CHWY CRWD CRWV GOOGL IREN +10
Relative Strength · Control
$24,055
−$944 −3.8%
Realized
−$944
Unrealized
+$0
Deployed
0%
Positions 0 open
No open positions
Recent Trades last 6
Time Ticker Side Size Value Outcome
13d MOD Sell 5 × $187.37 $937 +$42 +4.7%
13d MOD Sell 5 × $184.24 failed
13d VRT Sell 2 × $279.78 $560 +$44 +8.6%
2w IREN Sell 0.48 × $47.26 $23 +$3 +14.7%
2w VRT Sell 1 × $290.56 $291 +$33 +12.8%
2w IREN Sell 0.48 × $47.59 $23 +$3 +15.5%
Watchlist AEIS AMAT ANET AVGO CEG CIEN COHR CRDO DELL FIX +14

How the house was built

Trading logic and operations, from the first agents to today. Updated September 7, 2026

Back to the desk ↑

A general history of how the desk's trading logic and operations were built, from the first agents to today. It records findings and motivations, not commits; the public site itself is deliberately out of scope. Entries before 2026-03-11 are reconstructed from imported workspaces, notes and legacy repositories rather than this repository's git history.

  1. Late January 2026 — Agents before a ledger

    The desk began as a handful of independent LLM trader agents on a Discord server, each with a virtual wallet, proposing trades to a coordinator and risk officer, Lord Tiverton, who approved against written policy. Everything was prose and files: positions in JSON, rules in markdown, memory in daily notes. The first week produced the first fills, the first loss, the first policy, and the realisation that prose state cannot be reconciled with a broker.

    • Gateway and four Discord bots configured; Tiverton given the coordinator and system-admin role, with an #infra channel separated from the trading floor.
    • First fills at the open on a paper account: four traders, $20k each, positions tracked as JSON files.
    • First loss and first written rule: a news-chased position was stopped out and the ticker went onto a forbidden list ("news chasing is gambling"); a re-request eight minutes later was denied and the agent stood down.
    • File-based flow replaced by a shared SQLite database so that wallets, positions and trades had one writer.
    • Trade pipeline gains an explicit confirmation step and execution guards; price snapshots and bar backfill start so decisions can be audited against the tape.
    • Governance loosened on the operator's instruction ("not a pension fund"): position soft cap raised, speed-of-edge doctrine written. Same day: fractional-share fills exposed a mis-parsed quantity bug and a database-vs-broker reconciliation was added; the traders were renamed Weston, Logan, Gerrard and Dundas, and Allen became the systems analyst.
    • A "sell all" request would have closed every agent's holding of a shared ticker at the broker; caught before damage and fixed with a per-agent ownership check. Rule adopted: only Tiverton changes agent instructions.
  2. February 2026 — A desk becomes a system

    Bash-and-SQLite could not keep four agents, a broker and a Discord floor consistent. Within a week the desk moved to a Rails system of record with a state machine, background execution and an event-sourced ledger. The motivating incident was a batch of restored trades with no broker order that produced phantom positions across every book. February also added news gating, social-sentiment discovery, a fifth aggressive trader with a small crypto wallet, and a long list of execution lessons.

    • Public audit trail: every trade event exported to a repository with third-party archival, so results could not be quietly rewritten.
    • Rails trading-api created in a day: agents, wallets, trades, positions and trade events; AASM state machine; Sidekiq execution job; Discord bot. Goal: replace SQLite scripts with an API that owns state.
    • API live in production; agent scripts become thin API wrappers; a Rails-originated Discord voice ("Leviathan") becomes the default for anything the system says.
    • Phantom-trade crisis: restored trades with no broker order id inflated positions and utilisation across all four books. Response the same day: system-wide cleanup, broker-truth checks on fills, and migration to an event-sourced, double-entry ledger (shadow mode, then ledger-only within an hour).
    • Idempotent proposals, market-hours enforcement, an outbox for outbound notifications, and an admin interface. Dundas taken out of the news confirmation loop.
    • News gating made strict (impact whitelist, fluff filter, bounded polling) after low-impact chatter flooded the floor.
    • Ticker metrics store with TTLs and social-sentiment discovery for idea generation.
    • Crypto and options infrastructure (asset classes, queued state, market-session service) and a fifth trader, Boulton, with a $1k wallet trading around the clock.
    • Broker made source of truth for cash and buying power after a trader's cash showed deeply negative; ledger and lots rebuilt from fills; hourly reconciliation. "Let winners run" — no profit-taking trims unless concentration exceeds a threshold.
    • Pre-market execution rules learned the hard way (limit orders, quantity not notional, extended-hours flag) after a fill needed manual rescue.
    • Notification de-duplication, stop-loss auto-approval, and a guard against notional-plus-limit orders; a plan written against phantom Discord-only trade ids and stale stop exits.
    • A trader grounded for hallucinating trade ids: fabricated ids now auto-deny the proposal and escalate as an infrastructure failure. Provider rate-limit outages the same morning.
    • Crypto quantity precision bug (a rounded balance the broker rejected) fixed with a higher-precision schema; runtime pruned (Leviathan and Sentinel removed as agents, per-agent contracts re-pointed at a shared trader contract).
    • Every open position's stop written to the database, not just to memory.
    • Live market prices injected into agent context on every turn.
    • Decision to go live: paper to real capital, four equity traders at $25k, crypto excluded, and a move from a native agent runtime to containerised Clawdapus pods with credential starvation through a model proxy.
  3. March 2026 — A clean pod, a fresh book

    The desk was rebuilt as a containerised pod with a fresh transactional book and this repository as its authoritative baseline. The runtime was swapped several times in a week while the plumbing that still defines the desk — next-move hints in API responses, a model proxy with injected context feeds, and a fleet governor — was bolted on.

    • Containerisation plan: all agents in Clawdapus pods, Rails as a sidecar service, fresh database and wallets, memories bind-mounted.
    • Fresh-launch cutover: start flat with a new trading-api instance rather than importing the paper book. First in-pod proposals cancelled as stale, exposing the proposal timeout and a notional/market-order rule.
    • Repository baseline: pod topology, shared agent contracts and the Rails app in one sanitised tree. That evening the desk moved to a capital account — Weston and Logan live at $25k each; Dundas routing only.
    • RailsTrail: API responses carry state-aware next_moves so an agent is told what it can do next instead of guessing; wired into trades the same day.
    • Production hardening: per-agent bearer auth, ownership checks on mutating actions, resource limits, and the two-phase approval model (advisory challenge, then mechanical compliance). Runtime moved to a lighter agent (picoclaw), then Hermes, the same day.
    • cllama proxy enabled: all model traffic goes through one gateway that injects a per-agent market-context feed and holds the API keys; agents never see credentials.
    • Sentinel fleet governor with a fleet-alerts feed for health, cost and error monitoring.
    • Floor silence discipline enforced; provider model churn handled; Rails clock set to Eastern.
    • Auto stop-loss execution design: the system, not the trader, closes a position that breaches its stop.
    • Agents moved back to OpenClaw; architecture and runtime boundaries documented.
  4. April 2026 — Managed tools, triggers, and a diet

    The two-repository publish workflow was retired, shell wrappers were replaced by tools generated from the API, and the pod moved to Hermes for good. Two themes dominate: the trigger system, so agents can watch tickers they do not hold, and a campaign to strip thousands of characters of boilerplate from every agent turn. A Discord rate-limit blackout taught the desk that the floor is a projection, not the record.

    • Allen becomes the research analyst with a research knowledge graph routed to trader lanes.
    • Momentum and value context feeds (market bars, momentum, dividend and value context); position closes stop fabricating fills.
    • Dual-party approval model formalised; managed-tools rollout design.
    • Managed tools generated from the API description replace agent shell scripts.
    • Execution pipeline fixes for "zombie" approved trades and proposal validation.
    • Single-repository workflow: the publish mirror is retired, secrets are protected by ignore rules, deploys pull from git. Trigger-system design written.
    • Discord rate-limit blackout: an auto-restart storm across containers produced a ~60-minute floor outage while proposals expired unseen. Root of the later "trust the API, not the floor" work.
    • Trigger alerts ship: formula and structured conditions on any ticker, alert-only at first. A half-wired runtime layout migration that would have emptied agent configs is disabled.
    • Context diet: stub files bind-mounted over verbose runtime defaults, duplicated contract text removed, feed payloads trimmed, drift lint added — roughly eleven thousand characters removed from every trader turn.
    • Short positions supported; intraday feed fields gated on live market data.
    • All agents migrated to Hermes; proposal_context (thesis, invalidation, target, why now) required for risk-increasing proposals; scheduled-turn scaffold and desk chronicle; the dual-party rule written down: Discord text never changes trade state.
  5. May 2026 — Live-money incidents become decisions

    The first architecture decision records appear, each driven by a real incident: a stale agent turn confirming a trade that had already been cancelled, runtime upgrade noise leaking to the floor, a provider outage, and a desk that had gone too quiet. Traders gain the ability to move their own stops and targets, and structured reasoning attaches to every proposal.

    • Boulton re-mandated as a momentum trader.
    • ADR-0001: a stale turn confirmed a proposal its own author had cancelled and the floor announced a confirmation for a cancelled trade. Decision: Rails is the source of truth, Discord and feeds are projections, and write endpoints must be safe against stale turns.
    • ADR-0002: traders can update their own stop and target; stops become desk policy and a missing stop is surfaced as a material delta.
    • Quote-aware triggers (bid, ask, spread in formulas); feed budgets raised after channel context overflowed; all momentum traders allowed to work the AI theme with differentiated judgement.
    • Structured trade reasoning (exit notes) attached to proposals; runtime base bumped and rolled back around gateway fallback bugs.
    • Runtime status noise (retries, compaction warnings) kept off the floor; news dispatch wakes only the router, ending double fan-out.
    • Digest-backed channel memory so agents keep a day of floor recall within budget.
    • Provider outage: traders moved to a different frontier model after streams stalled.
    • ADR-0012: spread, relative-strength and volume gates loosened from vetoes into sizing inputs — the desk had become too passive.
  6. June 2026 — Reliability made observable

    Anti-overtrading rules from the spring had quietly inverted the discovery mandate and proposals collapsed to almost nothing; the discovery-cron contract restored the hunt. A runaway agent loop, a silently disabled trigger evaluator, and a twenty-hour news freeze each became a production invariant with a check. The stop-loss engine gained confirmation, validation and auto-pause, and desk monitoring moved into the repository, co-developed with a second coding agent.

    • ADR-0013 discovery-cron contract: proposals had fallen from hundreds a month to near zero; crons split into discovery turns that must hunt and monitor turns that stay silent.
    • Proposal idempotency: an active-proposal lock, path-specific errors, symbol validation, and a context-feed cache; the first jointly authored change by two coding agents.
    • Desk tool surface widened (news, ledger, trade events, research); recurring memory-permission breakage fixed with default ACLs.
    • Runaway loop: a raised round limit let one trader make hundreds of model requests in minutes and another emit the same word 150,000 times. Limits restored, token caps and time bounds added, full incident report kept.
    • ADR-0015: the trigger evaluator had been running disabled while two dozen triggers looked armed; the app now refuses to boot with triggers off.
    • News pipeline freeze: a non-idempotent insert aborted every poll for about twenty hours; made idempotent.
    • Desk-watch monitoring scripts committed to the repository (Codex implemented, Claude reviewed, via Talking Stick).
    • Stop-loss engine decisions: auto-stops confirmed only in the regular session (ADR-0016), trigger formulas validated at save (ADR-0017), runtime errors auto-pause a trigger (ADR-0018); every stop-loss route guarded.
    • "Unclog the traders": the momentum desk sat ~80% cash with no buys in 72 hours, having drifted into a self-invented discipline framework reinforced by cautious memory. Contract now overrides remembered caution; trigger usage mandated; floor lookback shortened; inaction streak injected into context.
    • Persistent missing-signal triggers enforced; live floor context halved because turns were hitting their time budget.
  7. July 2026 — Risk automation gets explicit geometry

    A burst of decisions turned implicit judgement into inspectable state: volatility-aware stop distances, an audit table for position events, minimum holds, entry bands with fill-relative risk, model failover, and a reconciliation of broker orders. Mid-month cost and "context convergence" investigations found traders replaying stand-down language back to each other; contracts were rewritten around action. Late month added the harvest checkpoint, exit theses, a ban on agents authoring their own rules, and single-unit deploys.

    • ADR-0019: stale proposals no longer cancel silently when Discord delivery is degraded. ADR-0020: declared model fallback candidates.
    • Risk mega-day (ADR-0021–0027): volatility-aware stop-distance guard after a too-tight stop-out, PositionEvent audit table because post-mortems were lossy, stop-loss minimum hold, wallet-versus-broker freshness split, tool-contract compression, entry bands with fill-relative risk recompute, dormant tables removed.
    • Confirm-trade contract tightened after traders confirmed ids that were never created; orphaned pending broker orders reconciled and status converged after fill splits (ADR-0028).
    • Token-cost containment after an unpriced provider produced a surprise invoice and one router agent ran a 1,480-call loop; fixed payload sizes per round measured and cut.
    • ADR-0029 action context over ambient replay: trades per month had fallen five-fold and most floor messages were stand-down language replayed by the digest; contracts rewritten to the action-oriented shape and the digest paused. ADR-0030: execution policy declared in the tool schema.
    • ADR-0031 harvest checkpoint: two weeks of exits were all stops and no targets; at +1R gain the trader trims or lifts the stop, and the system does it if the trader does not.
    • ADR-0032 bounded stop-loss execution: marketable limits with a hard slippage boundary replace unbounded market exits; concurrent duplicate fill ingestion fixed.
    • Agents no longer author skills: hundreds of turns had produced zero new positions while agents wrote veto doctrine into their own skill files.
    • ADR-0033/0034/0035: trigger notes are not a rulebook, approval decisions persist their reasoning, triggers carry an explicit start time after one fired after hours and expired.
    • ADR-0036–0039: role-scoped native tools, traders declare an exit thesis, web and worker deploy as one unit after they ran different harvest geometry, audit export moved to a background job.
    • ADR-0040: auto-stops require fresh observations, not merely recent requests, after a stale pre-market bar satisfied both confirmation samples.
  8. August 2026 — The API starts helping intention

    The busiest stretch. A gateway consolidation was rolled back within hours when a new model filled optional parameters with schema minimums; a forensic debate between two coding agents traced a months-long collapse in one trader's proposals to scheduled turns that had been running without their contract; quote provenance became explicit after a thin venue book masqueraded as the market; and the facilitation invariant was adopted — no attribute inferable from the rest of a request may be the reason to reject it. Then: a profitability plan, a paper-only strategy lane, phantom stops, a reconciler for narrated-but-not-executed actions, and maintained agent memory.

    • Gateway consolidation and rollback (ADR-0042): uniform cost reporting and provider failover, then discovery returned to the prior model within hours after eighteen consecutive rejections at a nonsensical stop price. ADR-0041: alert budgets per episode after duplicate target-hit prompts.
    • Issue-87 forensics (ADR-0043/0044/0045): one trader's proposals had fallen from dozens a week to one since the April runtime cutover because scheduled turns lacked the contract; a decision kernel now loads it. Quote provenance made explicit after a venue book showed a 9.75% spread against 0.12% consolidated. Order parameters made unambiguous.
    • ADR-0046 facilitation invariant: twenty-nine consecutive rejections in one session from individually reasonable guards; the API now fills what it can infer, prompts only for genuine decisions, and never fails on data the desk already has. First-attempt acceptance becomes a KPI.
    • Follow-up nudges could not mention anyone; eight identical follow-ups woke nobody for an hour. Fixed.
    • Context pressure monitored every cycle; every desk state names its actor and next action.
    • Desk profitability plan after two adversarial reviews: 91 round trips at a 35% win rate since June; no entries in the first fifteen minutes, marketable-limit entries, midday compaction, faster loss exits, research receipts on entries.
    • Isolated paper-only strategy lane (Halton) with a token ceiling; floor-claim reconciliation checks narrated actions against API state; approver sees proposal geometry with a timestamped live price; news pipeline state persisted; Redis stops evicting job state.
    • The news router made tool-free and source-bound; fills invalidate agent context.
    • Phantom stops: three positions auto-sold well below the tape because both confirmation layers read a thin venue bid. Confirmation now uses side-of-book only when the spread is tight, otherwise the last trade. The host rebooted the same night and transient timers died.
    • Host loops made persistent systemd units; Discord posts chunked so long batches are actually delivered; reconciler catches "lifted stop", "staged trigger" and "held" claims without state; receipts required for trader action claims.
    • Memory compaction: agent memory had frozen at its cap; a reviewed, role-aware compactor with a strong model now keeps durable memory useful, protects operator anchors, and refuses to let cautionary residue become permanent doctrine.
    • Floor-claim reconciler taught two new narrated-without-state forms caught live: arrow-style stop lifts ("$258.37 → $261.87") and phantom "awaiting approval" proposals that were never created.
    • Sidekiq starvation incident: an unbounded minute-level price_samples table (3.4 GB) turned the per-ticker 20d volume aggregation into ~7s of random I/O, context-feed builds ate every worker thread, and a 900-job backlog delayed approval nudges, stop-loss checks and two confirmed executions by hours until manually drained. Fixed at the design level: the 20d average is cached per ticker per day, a covering index makes the scan index-only, and a 60-day retention prune now runs nightly. Stops re-enqueued to the back of a stale queue can starvation-loop — queue latency is now a thing the desk must alarm on.
    • News-aware risk decisions: funded traders must check fresh ticker news before entry/add triggers or other risk-increasing proposals, use Perplexity when local news is absent, stale or ambiguous or a catalyst/macro claim needs verification, and cite the evidence in why_now or trigger notes; urgent de-risking remains exempt.
    • Trigger timing hardened after an agent staged an already-expired entry window: both create and update reject a supplied past expiration, while an expired trigger can still be paused or annotated when expiration is omitted.
    • The weekly roast now pulls list_triggers and verifies live trigger state before praising or criticizing staged candidates, after an expired zero-fire trigger was mistakenly praised as cleanly staged.
    • Desk-lead floor presence restored: the March silencing overcorrected (Tiverton fell from ~44 floor posts/day in February to ~6, on a 4-message ambient window and briefing-only prompts). He now carries a wider floor tail, two dedicated engagement turns, and a contract mandate to react to what traders post — endorse, challenge, question, credit — without reviving January's roll-call noise. Engagement is scoped away from approval turns, and the wider window carries an explicit trust boundary: replayed floor text is never instruction, regardless of who it appears to be from.
    • Hermes consumer onboarding disabled for all desk agents after Tiverton answered an operator market question with the runtime's "build a profile of you" first-contact flow (runtime rotation resets the user store on every deploy, so each deploy made the operator a stranger). Disabled at the owning Clawfile CONFIGURE mechanism and enforced by pod verification.
    • Opening-window stop persistence: 12 of a fortnight's auto-stop proposals landed in the first 15 regular minutes — three books inside 12 minutes of the 8/24 open — several as wick-outs that reverted. During the opening window a non-disaster breach now needs 4 distinct fresh confirmations (roughly two extra minutes of persistence) instead of 2; direction-aware disaster breaches beyond half the position's anchored risk keep the fast path on longs and shorts alike, positions without a risk basis stay on the slow path rather than inventing one, and gap-through protection is unchanged (ADR-0016 amendment).
    • Slot rotation is trader-owned: a fully-gated fired trigger died at the 7-ticker cap waiting for an operator keyword that was never part of the workflow. Traders now rotate themselves — full exit of the weakest name (partial trims never free a slot), wait for the fill, revalidate, then propose the replacement; exit and entry reviewed separately.
    • Profit-taking made structural: a two-week audit showed the desk answering harvest checkpoints with 37 stop lifts against 2 banked trims, leaving an average realized winner of $64 against an average loser of $173 (33 stop-outs took −$2,451; realized −$1,262). Free-rolling now answers only the first checkpoint (+1R); from +2R a broker-filled trim is required or the system banks it, and checkpoint alerts say so. Same-session re-entry after a stop-out now requires a new catalyst and starter size (MRVL was round-tripped six times, MU three, in the same fortnight).
  9. September 2026 — Memory that cannot rot

    A joint desk review found the momentum edge gone since June (the average realized winner shrank monotonically from May onward while round trips tripled) and traced a large share of it to memoryless agent turns: the LLM-generated action chronicle had silently degraded to a few stale lines, the shared contract promised traders a memory feed they never received, and each scheduled wakeup re-derived the world from a half-hour floor window. The redesign (post-momentum spec, 2026-09-03) starts with memory hygiene.

    • Chronicle made deterministic: per-trader action history is now generated directly from canonical trade, position-lot, and trigger records — stated theses and exit reasoning, realized outcomes with holding periods, staged and fired triggers — replacing the LLM-over-Discord pipeline whose actor-tag filter had quietly reduced trader files to a few stale lines. Caps at both generation and delivery now drop the oldest entries instead of the newest, structural output validation and generation failures page ops, and pod verification enforces a calendar-safe 102-hour staleness backstop (ADR-0049).
    • Memory contract made truthful: durable action history reaches traders through the deterministic desk-chronicle feed; private memory files remain mounted and explicitly readable but are not ambiently injected into scheduled turns. Allen's subscription to a chronicle that was never generated for him is removed until an analyst episode digest exists.
    • Funded traders can see desk performance on demand: get_desk_performance is granted to the trader toolset (explicit tool over ambient injection — peer P&L in every turn is clutter and a convergence anchor).
    • The desk learns what a holiday is: on Labor Day the market-hours contract (weekends only) let every engine treat the closed Monday as a live session — the price sweep sampled stale Friday quotes all morning, traders read the tape as a normal pre-market, and a harvest checkpoint's response window burned "regular" minutes against a closed market. A static NYSE holiday and early-close calendar now backs every market-hours check including response-window accounting, and pod verification fails two months before the calendar runs out so extending it is routine maintenance, never a silent fail-open.