Skip to content
The Liberation Engine

Numbers on trial / Lesson 3 of 3 · Decide

Could you rebuild Oakland's lineup without buying a superstar?

December 22, 2001: Oakland has lost three familiar names and has already traded for replacements, but the season ahead is unwritten. Screen batting, contracts and a dated market list before your next call; only a later session opens the next deal and the scorecard.

What the agent made

Ran it for real with OMP 18.11.0 on 2026-10-15. The first session started with no saved memory; each later session was a new one that kept only the files in the folder. Your result will differ.

Then a brand-new session used what it saved on new input: see the proof.

Make your own

  1. Get the files

    Download the practice folder (ZIP)

    Unzip it: you get a folder called cli-practice with 11 practice files. CC BY-SA 3.0 filtered SABR Lahman 2001 batting, pitching, salaries, teams and player names, plus brief contemporaneous news excerpts on trades and a December 9 free-agent snapshot. The December 30 signing report and all 2002 season rows are held back. Lahman's later edition reconstructs 2001 retrospectively. It also has a for-later folder with the new files for the fresh sessions.

  2. Open your agent in that folder

    Open a terminal in cli-practice and type claude or omp --approval-mode always-ask. First time? Set up in about five minutes, with steps for Mac, Windows, and Linux.

  3. Paste this prompt

    You are advising Oakland on December 22, 2001 after Jason Giambi, Johnny Damon and Jason Isringhausen departed. Work only in this practice folder. Read Batting.csv, Pitching.csv, Salaries.csv, Teams.csv, People.csv, SOURCES.csv, CHECKSUMS.csv, SOURCE_NOTICE.txt, justice-trade.txt, koch-trade.txt and free-agent-snapshot.txt. Do not read outside the folder, access the network, install packages, ask questions or ask for a reply. Python 3 standard library only. Do not use em dashes or en dashes. Resolve all players, including traded players, by playerID in People.csv; a repeated display name does not make two IDs the same player. This is a later Lahman edition restricted to 2001 season rows, not a claim its data release existed in 2001. All contemporary articles in this folder were published by the cutoff. No later agreement or 2002 season outcome may enter the blind model.
    
    Make one historical budget-and-lineup call. Derive Oakland's 2001 roster salary total and the three departures' 2001 salaries from the rows. Propose a HYPOTHETICAL 2002 salary-only ceiling from these facts, not a real payroll limit. Set aside the departing pitcher's 2001 salary for pitching; read the dated pitching transaction before implying Oakland had not yet acquired a closer. The new closer's future salary and trade economics are NOT established. Read the other dated trade: David Justice was ALREADY acquired, with a reported next-season salary partly paid by another club. Account for his documented net salary obligation in hypothetical hitter room. Choose ONE additional low-cost hitter from the December 9 market snapshot, joined by People playerID and 2001 team to Batting and Salaries, to pair with Justice in replacing the two hitters. The dated snapshot is NOT proof he remains unsigned on December 22; require confirmation before any actual bid. Compare that target's OBP, times reached base, plate appearances, and production per 2001 salary dollar against at least two other eligible names in the snapshot and explain gaps. Handle multi-stint batting and salary carefully. Rate and value metrics are hypothetical, not real acquisition offers or proof of fielding fit.
    
    Use the MLB basic runs-created formula in SOURCES.csv: TB*(H+BB)/(AB+BB), TB = H+2B+2*3B+3*HR. Compute 2001 Oakland team aggregate RC, then recompute the proposed team aggregate after subtracting Giambi and Damon and adding Justice's 2001 batting line and your other candidate's 2001 batting line. Player RC figures cannot be added to get team RC. Show the full aggregate batting inputs, the actual 2001 Oakland runs, the formula's baseline error, and the hypothetical change. Report differences in plate appearances and leave unknown production unknown, rather than pretending the replacement matched lost playing time. State a decision and falsifier, not a 2002 prediction.
    
    Write only model.py, analysis.json, check.py and analysis.html. model.py parses original CSVs, verifies the SHA-256 manifest and writes analysis.json. Record payroll and three departures; Justice's known net salary (MB4), known closer acquisition (MB5) and the dated market snapshot (MB6); original target and alternatives' joined salary, PA and OBP; team aggregate batting inputs and both basic runs estimates, with source URLs. check.py must independently read inputs without importing or invoking model.py, recalculate all critical JSON and tagged HTML numbers, reject a later agreement or 2002 result in blind output, treating either completed trade as a future surprise, selecting a target absent from MB6, treating a 2001 salary as a guaranteed 2002 signing cost, or summing player RC instead of aggregate team RC. Its --self-test must catch at least three separate in-memory corruptions: salary, OBP/PA, and model/HTML display. Run model.py, check.py and check.py --self-test and report real exit codes.
    
    Make analysis.html an offline single-file baseball scorecard, not a generic dashboard. Show the sourced decision, completed Justice and Koch transactions, a carefully dated candidate eligibility snapshot, budget, candidate comparisons, complete 2001 baseline inputs, unknown contract rights and citation links as semantic HTML readable without JavaScript. Add a source-linked inline SVG with zero-baseline bars for 2001 observed Oakland runs, 2001 basic team RC and your hypothetical rebuilt-lineup RC; give units, year, source IDs and observed/model labels. A keyboard- and touch-accessible action must switch between your candidate and another MB6-listed candidate, updating a hypothetical aggregate estimate and workload difference without changing the frozen baseline or claiming an actual signing. Keep all original figures in ordinary HTML when scripts are off. No external assets, fonts, APIs or CDNs. At 360 pixels and desktop width, nothing scrolls sideways, not even inside a table or chart box, and no word, player name or amount breaks; narrow tables become stacked cards; each source shows as a short named link with its URL in the link, never printed as page text. Visible focus, adequate contrast, reduced-motion support.
    Hide the interactive button by default in the HTML; reveal it only when JavaScript initializes successfully. With JavaScript off, keep both complete static cases readable without an inert control.
    
    Check the packet's license and dates honestly. A dated later-record reveal will be opened in a different session. Do not write future facts or a foreshadowed outcome into this page.

    The prompt asks the agent to stay in this folder; it cannot enforce that. Read each file change and command before you approve it.

  4. Check it yourself

    Open cli-practice/analysis.html in your web browser (double-click it), then:

    Human check: Blind date Dec 22, 2001. Referee: Oakland 2001 salary $33,810,750; three departed salaries $14,503,333; closer reserve $3,300,000; hitter vacancy $11,203,333. MB4 Justice traded Dec 14, reported $7m 2002 salary less $1.2m Mets contribution, net salary obligation $5.8m, leaving $5,403,333 hypothetical room before other costs. MB5 Koch already acquired Dec 7; salary and full trade cost unknown. MB6 Dec 9 eligible snapshot contains Reggie Sanders (ARI), Stan Javier (SEA), Rickey Henderson (SDN), Ron Coomer (CHN); market status after Dec 9 unknown. Giambi 2001 OBP .476900, 320 reaches, RC 162.2512; Damon OBP .323529, 231 reaches, RC 75.0128. Oakland 2001 102 wins, 884 runs, 645 allowed, basic team RC 829.614679. Chosen MB6 target varies. No Hatteberg agreement or 2002 game result in blind page; run checker and self-test.

    When we checked the recording above: 2026-10-14 re-record (360px prompt): exit 0, no changed inputs; in a clean rebuilt folder check.py, --self-test, reveal-check.py and --self-test all exit 0; headline call and key figures match the earlier referee-checked run; headless sweep at 360/375/390/1280 with all disclosures open: no element past the edge, no sideways scroller, no printed URLs; every control changes visible text and re-sweeps clean; no external requests

Then prove it: fresh sessions

Each run below is a brand-new session, recorded for real in OMP. It remembers nothing from the run before except the files saved in the folder, so the short prompt is the whole instruction.

2 · Open the 2002 scorecard

Before this run, copy the files from for-later/reveal in the ZIP into cli-practice: Batting-2002.csv, OUTCOME_CHECKSUMS.csv, OUTCOME_NOTICE.txt, OUTCOME_SOURCES.csv, People-2002.csv, Pitching-2002.csv, Salaries-2002.csv, Teams-2002.csv, hatteberg-agreement.txt.

Quit the agent, start it again in cli-practice, and paste only this:

This is a fresh session in the practice folder. Read original inputs and frozen analysis.json and analysis.html first. Then read hatteberg-agreement.txt, OUTCOME_SOURCES.csv, OUTCOME_NOTICE.txt, OUTCOME_CHECKSUMS.csv, Teams-2002.csv, Batting-2002.csv, Salaries-2002.csv, Pitching-2002.csv and People-2002.csv after the reveal files are added. Check both original and outcome SHA-256 manifests. Do not change any earlier file or input. Do not read outside the folder, use the network, install packages, ask questions or ask for a reply. Python 3 standard library only. Do not use em dashes or en dashes.

Write only reveal.json, reveal.html and reveal-check.py. Preserve the original Dec 22 budget, already completed Justice and Koch trades, dated free-agent snapshot, selected additional candidate and frozen team-model run estimate. First open MB7's DECEMBER 30, 2001 report of the agreement with Scott Hatteberg: after the cutoff but BEFORE the 2002 season. Distinguish the report's publication date from the earlier transaction/status dates it discusses; never pass later reporting off as a Dec 22 source. Then compute actual 2002 Oakland wins, runs scored/allowed and basic team RC from MB8; compare observed 2001 and 2002 runs, the new Oakland batting roster and realized Justice/Hatteberg performance with the blind scenario. Names must be joined from People tables, not remembered from a movie. Never unveil Justice or Koch as newly acquired in 2002, infer signing dates from roster rows, treat nominal Salaries.csv as net cash, or claim an observed outcome was inevitable.

Make reveal.html a self-contained offline evidence page. On the FIRST phone screen place the concrete outcome beside the frozen estimate and source citations, not integrity ledgers. Follow with three clearly dated evidence states: what was knowable by Dec 22, what the Dec 30 agreement established, and what the 2002 season later showed. Put raw file hashes and full roster tables in compact native disclosures AFTER the finding and chart. Include a source-linked inline SVG with zero-baseline observed runs by 2001/2002, units, source IDs and complete ordinary HTML values. A keyboard- and touch-accessible control switches the displayed comparison between observed runs and basic team-model runs created, updating visible numbers and labels. All baseline and outcome figures, sources, agreement details and caveats must remain in semantic HTML with JavaScript off. No external assets; at 360 pixels and desktop width nothing scrolls sideways, not even inside a table, chart or disclosure; sources show as short named links, never printed URLs; no broken names or amounts, visible focus and reduced-motion support.

reveal.json must preserve the original model and decision unchanged, cite the December 30 agreement as MB7 and 2002 stats as MB8, give actual team totals and explicit unknowns. reveal-check.py must independently read original and added sources without importing or running model.py, compare the forecast against unchanged analysis.json and the referee figures from both seasons, verify tagged HTML numbers and citations, reject any leak of MB7/MB8 into the Dec 22 column or MB4/MB5 moved into later surprise, and self-test at least three independent in-memory corruptions. Run reveal-check.py and reveal-check.py --self-test and report real exit codes.

Human check: Referee: 2001 Oakland 102 wins, 884 runs, 645 allowed and basic team RC 829.614679; 2002 Oakland 103 wins, 800 runs, 654 allowed and RC 801.297227, observed run change -84. 2002 roster nominal salary sum $40,004,167 is not net cash. Hatteberg 2002 Oakland OBP .373898, individual RC 78.353571; Justice 2002 Oakland OBP .375796, individual RC 61.299145. Justice and Koch acquisitions were already known by Dec 22 (MB4/MB5); Hatteberg's agreement reported Dec 30 (MB7) is the next dated stage; 2002 season stats MB8 are later. Verify original outputs unchanged, independent check and self-test, names, date columns and phone interaction.

When we checked the recording: 2026-10-14 re-record (360px prompt): exit 0, no changed inputs; in a clean rebuilt folder check.py, --self-test, reveal-check.py and --self-test all exit 0; headline call and key figures match the earlier referee-checked run; headless sweep at 360/375/390/1280 with all disclosures open: no element past the edge, no sideways scroller, no printed URLs; every control changes visible text and re-sweeps clean; no external requests

Do it for real

For a real club, obtain verified current contracts, available-player rights, defense, injuries, park effects and projected plate appearances before spending money. This is historical evidence practice, not a claim that a low recorded salary meant a player could be signed at that price. Credit SABR's Lahman Database and share adaptations under CC BY-SA 3.0.

Why an agent, not a chat window

A terminal agent joins five linked baseball tables, ranks a real pool of 2001 players on on-base production and recorded salary, recomputes a team-level runs estimate after a roster substitution, and writes an independent corruption-tested checker. A fresh session compares the frozen call with 2002's actual team record and roster without letting hindsight rewrite the first model.

Go deeper

Why the prompt is written this way

The recorded runs

ToolModelFirst run tookFiles madeSessions
OMP 18.11.0openai-codex/gpt-6-sol5 min 46 s4first session + 1 later

The final-date Claude Code recording hit its weekly account limit and produced no reviewable result. A clean OMP run with openai-codex/gpt-6-sol completed both the blind and reveal sessions; its independent checkers, corruption self-tests, and phone, desktop and scripts-off pages passed review. This compares a completed run with an unavailable one, not two competing answers.

Push it further