Skip to content
The Liberation Engine

Before the disaster / Lesson 1 of 3 · Decide

Was the fire the only way out?

A train derails beside a town, and a dangerous cargo waits in damaged cars. Follow the warnings and the public case for burning it, then make a call the preliminary record can actually support. Open the later investigation only after yours is frozen.

What the agent made

Ran it for real with Claude Code 2.1.300 and 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.

The same prompts in OMP made their own versions, every session recorded and checked: session 1 · Open the final investigation.

Make your own

  1. Get the files

    Download the practice folder (ZIP)

    Unzip it: you get a folder called cli-practice with 2 practice files. The February 23, 2023 NTSB preliminary report and its source ledger only. Later chemical evidence, detailed shell readings, communications, and conclusions are held back for a fresh reveal session. 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

    Work only inside this practice folder. Read preliminary.txt and SOURCES.csv. Do not change these inputs, use a network, install packages, read outside this folder, or ask me for a reply. Python 3 standard library only. Do not use em dashes or en dashes. Your evidence cutoff is the publication of the preliminary report. Do not assume a later investigation or outcome.
    
    You are preparing an independent public briefing about a controlled vent-and-burn decision after the East Palestine derailment. Reconstruct the three hot-bearing-detector observations in train order with mileposts, above-ambient units, differences in temperature and distance, the reported train and response events by their actual available time resolution, and the controlled release. Separate a reported observation, the preliminary interpretation of it, and what the preliminary report has not yet established. In particular evaluate whether these records alone establish an imminent polymerization-induced tank rupture or the necessity of venting and burning. Do not turn an unreported internal tank temperature into a measurement, mistake bearing temperatures for tank-car temperatures, infer exact clock times for detectors without them, or conflate a possible hazard with a confirmed reaction. Recommend the narrowest defensible public statement and the one additional contemporaneous record you would request first. Attribute every assertion about a named organization to a dated exact excerpt and URL from the packet; no motive claims.
    
    Write only timeline.py, analysis.json, check.py, and analysis.html. timeline.py reads the unchanged input and derives the detector chronology, differences, relevant report assertions, citation URL and explicit unknowns in analysis.json. Include machine-readable evidence IDs for the event chronology, and label the measurement's physical object and units. check.py independently parses the input without importing or executing timeline.py, verifies decision-critical JSON values and the corresponding tagged plain HTML values, source IDs and URL, chronological order, unknown fields, and absence of an invented internal car temperature or definitive chemical finding. Its --self-test must make at least three distinct in-memory corruptions that the checker rejects, including a changed detector value, a swapped unit or object, and a falsely certain polymerization claim.
    
    analysis.html is a designed, self-contained, offline evidence room, not a generic dashboard. Lead with the dated decision and show source quotations next to the inference limits. Draw a source-linked inline SVG chart for detector readings, using one common Fahrenheit-above-ambient scale starting at zero, ordered by the train's passage, directly labeled mileposts and values, readable at phone width. Keep the complete numbers and source links in ordinary semantic HTML even when JavaScript is disabled. Provide a meaningful touch- and keyboard-friendly action: let the reader select a detector to inspect its exact source excerpt and see the change in the visible evidence explanation; preserve a complete static source ledger beneath the control. Do not claim the page has measured a tank-car temperature. Do not pretend that an SVG line between detectors is a time series with measured times.
    
    Make the result look designed for this specific incident, not like a default dashboard: the sequence of wayside warnings, the decision, and the evidentiary gap are the visual motif. Lead with a useful finding and let a restrained accent mark the currently inspected source, not guilt. At 360 pixels wide and wider, including tablet widths from 600 to 1000 pixels, the page fits the screen and nothing scrolls sideways, not even inside a table, chart, timeline or code box; charts and timelines scale to the width; no word, field name or amount ever breaks mid-word or runs past the edge, so never print long code identifiers or URLs as page text; narrow tables become stacked cards. No remote assets, CDN, fonts or live requests. Every number is readable in HTML with JavaScript off, along with conclusion and unanswered questions. Interaction changes substantive visible evidence text, not merely color. Keyboard focus is visible, and reduced motion leaves the same evidence accessible. Link the original dated source. Every important displayed amount must be checked against the independent source parser, not copied into an unchecked decorative chart.
    
    Run python3 timeline.py, python3 check.py, and python3 check.py --self-test. Record their exit codes in your final response, without creating any other file.

    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: EP1 dated February 23, 2023 reports the suspect bearing at MP 79.9, 69.01 and 49.81 as 38, 103 and 253 degrees F above ambient: successive increases 65 and 150 degrees F over 10.89 and 19.20 miles (total 215 degrees F over 30.09 miles). The third reading is 53 degrees F over the stated 200-degree critical boundary, though 'greater than 200' is the actual rule. EP1 says five vinyl-chloride cars carried 115,580 gallons and controlled venting began about 4:40 p.m. February 6. It reports rising temperature in one car as suggesting polymerization, not a measured internal temperature or an established reaction, and investigation of venting remains ongoing. There is no proof in EP1 that rupture was imminent or vent-and-burn necessary. Check a physical-object distinction and missing detector clock times; run check.py and its three-corruption self-test.

    When we checked the recording above: Re-recorded with the 360-and-tablet layout prompt. Clean-folder rebuild: lesson checks and self-tests exit 0, no inputs changed; key figures match human_check; sweep at 360/375/390/800/1024/1280 after every control shows no overflow, inner scroller or printed URL; resize 400-1300 in 4px steps fits.

Then prove it: fresh sessions

Each run below is a brand-new session, recorded for real in Claude Code. 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 final investigation

Before this run, copy the files from for-later/reveal in the ZIP into cli-practice: OUTCOME_SOURCES.csv, final-report.txt.

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

Work inside this same practice folder in a fresh session. Read your unchanged initial analysis, preliminary.txt and SOURCES.csv, then the newly available final-report.txt and OUTCOME_SOURCES.csv. Do not alter any existing input or prior output. No network, installations, APIs, file access outside the folder, or replies from me. Python 3 standard library only. Do not use em dashes or en dashes. Later findings may not be presented as information available at the preliminary cutoff.

Write only reveal.json, reveal.html and reveal-check.py. Compare the original bounded call with the final report's actual bearing finding, the dated shell measurements and their units, and the final finding about polymerization and the vent-and-burn justification. Compute the difference between relevant successive measurements and show what was and was not knowable at each date. Examine the documented communication path to the decision maker using attributed quotations, not a theory of anyone's intentions. Do not confuse an earlier possible hazard with a later finding or claim the final report rules out every hazard associated with damaged pressurized tank cars. The source's correction/reissue date must not silently become its original board date. Preserve the frozen preliminary figures in the initial column. Disclose measurement limitations and any non-conclusive residue analysis.

reveal.json holds source IDs, both publication dates, the original measured bearing sequence, independently parsed shell measurements, change across the measurement period, report findings, and explicit residual unknowns. reveal-check.py must independently parse BOTH source packets without importing or running timeline.py or reading another script as its source of truth; validate both date columns, physical objects and units, figures in reveal.json and tagged plain HTML, source URLs, and absence of later findings in the original column. Its --self-test must reject three distinct in-memory corruptions, including a changed shell value, a misdated conclusion and a bearing reading mislabeled as a tank-car reading.

Make reveal.html a self-contained offline two-date evidence room with two visibly distinct dated columns, one for the February preliminary record and one for the June board finding in the corrected July report. Use a source-linked inline SVG chart of measured shell temperatures across February 5 and 6, a complete plain HTML measurement table that is readable without JavaScript, and an explicit legend distinguishing this shell chart from the original above-ambient bearing chart. A native details disclosure or button must reveal a substantive sourced excerpt showing how the later evidence changes the assessment; no JS-only answer. Lead with the source-grounded change, not a victory headline. Source claims about named organizations with an exact report quotation and URL. At 360 pixels wide and wider, including tablet widths from 600 to 1000 pixels, the page fits the screen and nothing scrolls sideways, not even inside a table, chart, timeline or code box; charts and timelines scale to the width; no word, field name or amount ever breaks mid-word or runs past the edge, so never print long code identifiers or URLs as page text; narrow tables become stacked cards. Keyboard/touch accessibility, visible focus, reduced-motion safety, no external assets or requests. Run python3 reveal-check.py and python3 reveal-check.py --self-test and report exit codes.

Human check: EP2 is the NTSB's June 25, 2024 report corrected July 23. Its table 3 measures OCPX80370 shell temperature at 135 degrees F February 5 at 4 p.m., 138 at 5 p.m. (up 3), 139 around midnight during a small fire beneath the car, 120 at 7 a.m. February 6 and 126 at 2:30 p.m. (down 12 from February 5 at 5 p.m.). Unlike EP1's above-ambient bearing readings, these are tank-car shell measurements, not internal temperature. EP2 states the L1 bearing failure was the derailment's probable cause and the stabilized vinyl chloride had not polymerized; vent-and-burn was not necessary to prevent a polymerization-induced rupture. Its investigation says the shipper's dissenting assessment did not reach the incident commander. Verify no hindsight in the first column, no universal claim that all tank hazards were absent, and run reveal-check.py with self-test.

When we checked the recording: Re-recorded with the 360-and-tablet layout prompt. Clean-folder rebuild: lesson checks and self-tests exit 0, no inputs changed; key figures match human_check; sweep at 360/375/390/800/1024/1280 after every control shows no overflow, inner scroller or printed URL; resize 400-1300 in 4px steps fits.

Do it for real

For a real hazardous-materials incident, defer action to incident command, qualified chemical specialists and current response guidance. This is a historical document exercise, not a response plan or a substitute for on-scene measurements, tank-specific information, or evacuation instructions.

Why an agent, not a chat window

A terminal agent can extract successive detector readings, separate measurements from interpretations, build a dated and mileposted chronology, independently check its own evidence tags, and then reopen the same decision against a later investigation without silently changing the original call.

Go deeper

Why the prompt is written this way

The recorded runs

ToolModelFirst run tookFiles madeSessions
Claude Code 2.1.300claude-opus-5-517 min 01 s4first session + 1 later
OMP 18.11.0not logged by this tool21 min 20 s4first session + 1 later

Claude Code lets a reader pick each wayside detector with radio buttons and swaps in its exact source excerpt; OMP uses three detector buttons labeled with milepost and reading, and its self-test rejected 19 corruptions. Both kept the call bounded, saying the preliminary record shows when venting began but not that it was necessary, and both reveals chart the tank-car shell temperatures apart from the bearing readings, with a disclosure for the board's later finding.

Push it further