---
tags: [video, hyperframes, thermodynamics, real-gas, critical-point, science-qa]
confidence: high
sources: [js/co2_data.js, tools/make_data.py, data_checks/nist/, tools/check.mjs, tools/mutation_test.mjs, "Span and Wagner, J. Phys. Chem. Ref. Data 25, 1509 (1996)", "NIST Chemistry WebBook, SRD 69, Thermophysical Properties of Fluid Systems"]
last_updated: 2026-10-29
---

# HF-PCHEM-002 Science QA

Video: *Can Pressure Alone Turn a Gas into a Liquid?* (CO2 compressed at 20 °C and at 40 °C).
Made from the prompt template in `showcase/prompts/` (Part A: how to work; Part B filled in for this video).
Every physical value on screen comes from `js/co2_data.js`, generated by `tools/make_data.py`; the browser only interpolates its tables. `tools/check.mjs` compares those data with NIST WebBook tables saved in `data_checks/nist/`, runs the real drawing code against a stub DOM and reads the screen back every 0.5 s (71 checks, all passing). `tools/mutation_test.mjs` breaks the code in 17 ways and confirms that the gate catches every one.

## 1. Model and data source

| Item | Choice | Why |
|---|---|---|
| Substance | CO2, 1 mol in each cylinder | Classic case (Andrews, 1869); its critical temperature, 31.0 °C, lies between two easy water-bath temperatures. |
| Equation of state | Span-Wagner reference EOS for CO2 (J. Phys. Chem. Ref. Data 25, 1509, 1996), evaluated with CoolProp 8.0.0 (HEOS backend, git ae81610e7d) | The NIST WebBook uses the same equation, so the two agree to rounding. No ideal-gas or van der Waals shortcut anywhere. |
| Process | Both cylinders follow the same slow volume schedule, 500 -> 55 cm³ mol⁻¹, then back to 120 cm³ mol⁻¹ in scene 5, each at constant temperature | Isothermal and quasi-static: every state shown is an equilibrium state on the isotherm. |
| Temperatures | A 20 °C (T/T_c = 0.964), B 40 °C (T/T_c = 1.030) | One below and one above the critical temperature. |
| Units | p in bar, molar volume in cm³ mol⁻¹, temperatures in °C on screen | Bar keeps the numbers readable (57.3 instead of 5.73 MPa). |

## 2. Data against the NIST WebBook (saved tables, `data_checks/nist/`)

| Quantity | Data used (CoolProp) | NIST WebBook | On screen |
|---|---|---|---|
| Critical temperature of CO2 | 304.1282 K | 304.128 K | 31.0 °C |
| Critical pressure | 73.7730 bar | 7.37730 MPa | 73.8 bar |
| Critical molar volume | 94.118 cm³ mol⁻¹ | 0.0941185 L mol⁻¹ | critical point marker |
| Vapor pressure at 20 °C | 57.2905 bar | 5.72905 MPa | 57.3 bar |
| Saturated vapor / liquid at 20 °C | 226.619 / 56.9053 cm³ mol⁻¹ | 0.226619 / 0.0569053 L mol⁻¹ | droplet onset / all liquid |
| 20 °C isotherm, 14 NIST points between 55 and 500 cm³ mol⁻¹ | interpolated table | 3.0-7.0 MPa, every 0.25 MPa | largest difference 0.0003 bar |
| 40 °C isotherm, 26 NIST points in range | interpolated table | 3.0-17.0 MPa, every 0.5 MPa | largest difference 0.0009 bar |
| Critical temperatures: propane, methane, nitrogen | 369.890, 190.564, 126.192 K | same (last row of each NIST saturation table) | 96.7, −82.6, −147.0 °C |
| Normal boiling points: methane, nitrogen | 111.667, 77.355 K | 111.67, 77.355 K | −161, −196 °C |

At 40 °C NIST lists no liquid and no pressure with two volumes. It repeats the 7.5 MPa row with the same volume, once labelled "vapor" and once "supercritical": that is its naming boundary at the critical pressure, not a phase change.

## 3. Displayed numbers

| Quantity | Value | On screen |
|---|---|---|
| Start, both at 500 cm³ mol⁻¹ | A 37.2 bar, B 41.6 bar (ideal gas would give 48.7 and 52.1 bar) | gauges |
| A, droplets appear | at V = V_vap = 226.6 cm³ mol⁻¹, p = 57.3 bar | gauge, caption, diagram |
| A, while condensing | p = 57.3 bar exactly, from 226.6 down to 56.9 cm³ mol⁻¹ | flat step, chip "gas + liquid" |
| A, all liquid, end at 55 cm³ mol⁻¹ | 66.3 bar: +9 bar for a 3.3% volume change | caption "pressure climbs, the piston hardly moves" |
| B, end at 55 cm³ mol⁻¹ | 163.9 bar, density 800 kg m⁻³ (the saturated liquid at 20 °C has 773 kg m⁻³) | gauge; "dense but has no surface" |
| B passes p_c | 73.8 bar at about 17.9 s | note "Only the name changes" from 18.0 s |
| Scene 5, both at 120 cm³ mol⁻¹ | A 57.3 bar with 62.8% of the CO2 liquid; B 85.6 bar | gauges, liquid surface |
| Isotherms in scene 4 | 10, 20, 25, 31.0 (T_c) and 40 °C; coexistence curve from the triple point (5.18 bar) to the critical point | diagram |

## 4. Scientific accuracy requirements (B6) and how they are checked

| Requirement | Check in `tools/check.mjs` | Mutant that must fail it |
|---|---|---|
| Displayed values agree with the reference data, the data agree with NIST | 12 comparisons with the saved NIST tables; display strings formatted from the NIST values inside the check | vapor pressure in the data file +1 bar; T_c shown as 31.1 °C |
| A: constant pressure while liquid and vapor coexist; droplets exactly at the saturated-vapor volume | pressure = vapor pressure at 900 volumes inside the two-phase region; gauge reads 57.3 bar whenever the chip says "gas + liquid"; the piston pauses exactly at V_vap and V_liq | plateau tilted; droplets appear early |
| A: lever rule; no liquid before saturation, no vapor after V_liq | liquid fraction recomputed here; the drawn liquid layer is exactly as tall as the liquid's volume (0.01 px); liquid molecules = round(N x) | lever rule inverted; liquid layer drawn at the vapor density |
| B: no liquid surface ever; the supercritical label is only a name | B never has a liquid fraction or a drawn liquid layer; chip changes at p_c and the note appears within 0.5 s after the crossing | B condenses too; label switch at 100 bar; note removed |
| Temperatures never change on screen | each readout shows its own bath temperature from the markup; the drawing code never rewrites it | B shows the temperature of A |
| Critical point at 31.0 °C and 73.8 bar; only isotherms below it have a flat step | marker drawn at (V_c, p_c); one flat step at the vapor pressure on each drawn isotherm below T_c, none on the 31.0 and 40 °C isotherms | marker 10 bar too high; critical isotherm given a flat step |
| Molecules labelled illustrative | "Molecules: illustrative, not to scale" in the top bar, scenes 1-5 | label removed |

Plus: English only, no clocks or unseeded randomness, no physical numbers typed into the markup (mutant: "57.3 bar" typed into a caption), piston height proportional to the volume (mutant: square-root law), every molecule inside the walls and below the piston.

## 5. What is a picture, and other simplifications

- **Molecules are illustrative.** 90 dots per cylinder fly in straight lines and bounce off the walls; positions and speeds are not simulated. What does follow the physics: the number of dots in A's liquid is round(90 x) with x from the lever rule, and the liquid layer is exactly as tall as the liquid's real volume. The dot density of liquid and vapor therefore differs by the real density ratio (3.98 at 20 °C, checked). Both cylinders use the same dot speeds; the real mean speeds at 20 and 40 °C differ by only 3.4%.
- **Liquid surface.** Drawn slightly concave, as for a liquid that wets glass; the shape is stylized. Gravity keeps the liquid at the bottom; the hydrostatic pressure of a few centimetres of liquid is negligible next to 57 bar.
- **Heat flows to the bath (not drawn).** Isothermal compression needs heat to leave the gas, and condensation releases 6.69 kJ per mole of CO2 at 20 °C; the baths take it. The setup line says the baths hold the temperatures constant; no heat arrows are shown.
- **Equilibrium condensation.** Droplets appear exactly at saturation. Real vapor can be slightly supersaturated before nucleation; the quasi-static model ignores that.
- **"Supercritical fluid".** Above T_c the label changes from "gas" to "supercritical fluid" when the pressure passes p_c. That is a naming convention, not a transition, and the video says so at the moment it happens.
- **"Attraction versus motion".** Scene 5 gives the standard qualitative reason: a liquid forms when molecular attractions can hold molecules together against their thermal motion. The mean kinetic energy differs by only 7% between 20 and 40 °C, so the critical temperature is a collective threshold, not a large jump in speed; the video does not claim more than the qualitative statement ("thermal motion wins").
- **Very high pressure.** "Above T_c no pressure can split CO2 into a liquid and a vapor" is exact for the liquid-vapor transition. At pressures far beyond this diagram CO2 can freeze; that is solidification, outside the scope (no melting pressure is quoted here because none was checked).
- **Everyday examples.** LPG cylinders and CO2 fire extinguishers hold liquid at room temperature because both gases have critical temperatures above it; LNG and liquid nitrogen must be cooled to their boiling points (−161 °C and −196 °C at 1 atm). LNG is mostly methane; the value is that of pure methane.

## 6. Verification record (2026-10-29)

**Content gate** `node tools/check.mjs` -> **71/71 passed** (log `renders/check_content.txt`). **Mutation test** `node tools/mutation_test.mjs` -> **17/17 broken versions caught**, unmodified copy passes (log `renders/mutation_test.txt`).

During development the gate found a real bug: just before A was all liquid, the vapor layer was thinner than one molecule and one vapor dot was drawn above the piston (fixed in `js/dots.js`). Two early mutants were not caught for reasons in the tests themselves (a crash that printed no result; a mutation that a later duplicate JSON key overrode); both were fixed and the gate now also tests the shape of every drawn isotherm.

**HyperFrames check** `npx hyperframes check` -> **passed** (log `renders/check_hyperframes.txt`): 0 lint, runtime and layout errors; 204/204 text elements pass WCAG AA contrast. The 45 layout notes are text deliberately dimmed under the scene 3 pause card. Two craft warnings remain by design: *film_silent* (silent film) and *text_below_floor* (the tool's 28 px phone floor; the target is a projector, diagram labels are 22-24 px).

## 7. Render commands and results

```bash
npm install                                              # hyperframes 0.8.208 (pinned)
..\..\..\..\.venv-research\Scripts\python.exe tools/make_data.py   # data from CoolProp 8.0.0
node tools/check.mjs > renders/check_content.txt         # content gate: 71/71
node tools/mutation_test.mjs > renders/mutation_test.txt # 17/17 broken versions caught
npx hyperframes check > renders/check_hyperframes.txt    # lint, runtime, layout, contrast: passed
npx hyperframes render --quality delivery --fps 30 -o renders/co2_liquefaction_EN.mp4
node tools/verify_render.mjs                             # writes renders/verify_render.json, key frames
```

`renders/verify_render.json` (render on 2026-10-29: 1 min 24 s on this machine, hardware GPU capture):

| Property | Value |
|---|---|
| File | `renders/co2_liquefaction_EN.mp4`, 18.8 MB |
| Video | H.264, yuv420p, 1920 x 1080, 30 fps |
| Duration / frames | 90.000 s / 2700 frames |
| Audio | none (silent by design) |
| Full decode (`ffmpeg -v error -f null`) | no errors |
| Verdict | PASS |

Key frames were extracted **from the MP4 itself** into `screenshots/` (2.5, 8, 14, 20, 27.5, 33, 48, 70 and 88 s) and inspected. Checked in them: all text is English and legible; at 20 s A shows a liquid layer with a surface and reads 57.3 bar on a flat step while B reads 85.2 bar with no layer, and the note "Only the name changes" is on screen; at 27.5 s A is all liquid at 66.3 bar and B a dense fluid at 163.9 bar with no surface; the pause card covers the dimmed cards at 33 s; at 48 s the coexistence region, the five isotherms, the legend and the critical point (31.0 °C, 73.8 bar) are clear and the "gas" label lies outside the shaded region; at 70 s A shows liquid and vapor with a highlighted surface at 57.3 bar and B one fluid at 85.6 bar; at 88 s the table, the takeaway and the closing line are complete.
