ops-polymer-01 · polymer line · round 1

The Polymer Line

This city had no plastic. The village's radiation liner was booked as 101 tonnes of imported polyethylene (a figure its holder has since corrected to 96.3), the appliance housings are printed from filament pyrolysed out of imported packaging, and every card that needed a polymer wrote "import". Five ledgers ask whether carbon dioxide and hydrogen can become polyethylene here, and what it costs. The answer is yes, and the cost is not electricity. It is water: the well caps the line at 50 kg a sol, and the choice of route was made by which chemistry does not throw hydrogen away.

Route
MTOmethanol → SAPO-34 → ethylene 39.8 % (DMTO literature; 42 declared)
Water per kg PE
1.29–1.30L · co-products burnt, purge chilled · 1.31–1.55 at 330 K · 3.03 if vented
Nameplate
100kg PE/sol · kg PE/sol · a statement: water allocated, grid check green, purge cooler declared · sited at (50,130)
Pre-registered gates
98 / 103green · 5 red, each kept by name
01

What it is

One line, outside, that turns the atmosphere and well water into pellets - and makes more oxygen than the sulfur plant.

The plant stands under an unpressurised dust shed north-east of the oxygen station, next to the well and the CO₂ intake tower it feeds from. Along the shed, west to east: a solid-oxide electrolysis stack that splits CO₂ into CO and oxygen, a water electrolyser, a methanol converter cast in ductile iron at 20 bar, a fluidised bed of SAPO-34 catalyst at 450 °C lined with cast stone, a cold box of three imported steel columns at −100 °C, a gas-phase polymerisation reactor, a CO₂-purged degasser, an extruder, and two sulfur-concrete silos. Behind the shed, 108 m² of radiators. In front, the only pressurised volume on the site: a printed-regolith control room, its air intake thirty metres from anything carrying CO or methanol.

Every number on the plant traces to one of five ledgers in the dossier mars-polymer/ledger/, and the expectations for every ledger were written down and committed before the first script ran (mars-polymer 12d349b). A hundred expectations over two rounds were scored afterwards: 76 hit, 24 missed. The misses are the interesting part; they are in section 04.

Two things the ledgers found were not about chemistry. The premise that the appliance line imports 1.06 t of plastic is not what the home ledger says: its 1,064 kg of imports contain no plastic at all, and the 278 kg of plastic parts are booked to recycled filament - whose feedstock is imported packaging. And the three cards that hold the well's water disagree by a factor of five on what the propellant plant draws, which is the single number that decides whether this line makes 50 or 100 kg a sol.

The polymer line under its dust shed, seen from the open south face
In-engine render, day, labels hidden. The shed's south face is open: methanol converter, MTO bed, cold box and polymerisation reactor cut away toward the viewer; radiators behind; control room, silos and the trailer ramp in front, on the graded platform.
Inside the open shed: syngas skid, methanol converter, MTO bed and cold box
In-engine render, inside the shed line: SOXE hot box and electrolyser on the left, the 20 bar ductile-iron methanol converter, the cast-stone-lined MTO bed, the cold box, the polymerisation reactor. This is the round-1 render, kept: the MTO bed shows as a black column because its lining was drawn as a full cylinder - see the picture below and What broke.
The by-product oxidiser cut away, its flame visible, with the MTO bed glowing behind it
Round 3, unit preview render. The by-product oxidiser of route (iv), cut away toward the viewer, with its condenser and recycle blower to the right; behind it the MTO bed, now visible through a lining cut with the same window as its shell.
The whole platform from above in round 3, with two extra radiator panels along the left edge
Round 3, unit preview render (no city around it). 74.4 m² of extra radiator in four panels - two extending the row behind the shed, two along the left edge, because the platform has no other free edge. The footprint is unchanged.
The 100 kg/sol line: the platform widened to the east with two columns of radiator panels beside the silos
Round 5, unit preview render. The platform widened 16 m to the east for ten more radiator panels (374 m² in all); two SOXE / electrolyser skids at the back left; every lined vessel drawn at the radius its lining needs. The module is now centred on its bounding box.
The enlarged oxidiser cut open, with its blower, condenser, knock-out drum and the purge chiller
Round 5. The by-product oxidiser at r 1.79 m - cavity plus 0.62 m of firebrick plus 0.30 m of rock wool - with the recycle blower, the condenser, the knock-out drum and, in blue, the purge-stream chiller that keeps the water inside the 150 L/sol allocation.
02

How it works

Five ledgers, in the order in which a wrong answer would change the geometry - and a sixth, opened afterwards, that audits the headline the first five produced.

1 · route

Methanol-to-olefins, not Fischer-Tropsch, not oxidative coupling. All three routes share the same net reaction, CO₂ + H₂O → −CH₂− + 1.5 O₂ at 649 kJ/mol; they differ only in selectivity and recycle. Iron Fischer-Tropsch puts 9 % of the CO fed into ethylene (ASF α 0.5, C₂ olefinicity 0.6, 40 % of the CO lost to CO₂ by water-gas shift) and the other 91 % into a C₁–C₅₊ slate that needs a cracker's cold train and has no sink in the city. Oxidative coupling burns the MAV's methane at an 18 % per-pass C₂ yield and cycles its hydrogen through the electrolyser twice. MTO puts 42 % of the carbon into ethylene and 38 % into propylene with a two-step chain of mature reactors. With co-products credited at zero, a kilogram of ethylene costs 63 kWh by MTO, 292 by FT and 316 by OCM - the last two land on the foundry's historical 298 kWh/kg make-or-import line (245 at the grid's current peak; account 7) and the first does not. FT's catalyst, iron-sodium-sulfur on silica, is the only one that is entirely local; it is kept as the fallback if the MTO imports stop.

2 · mass & energy

Per tonne of PE at 100 % selectivity: 3.14 t CO₂, 1.28 t of well water, 143 kg of hydrogen, and 3.43 t of oxygen out. The whole MTO train, with propylene uncredited, draws 7.3 t of CO₂ and 3.0 t of water per tonne of PE and returns 8.0 t of oxygen. Electricity: the practical electrolysis floor is 23.1 kWh per kg of −CH₂− with PEM stacks and 18.3 with high-temperature SOEC on the fusion heat loop, against a thermodynamic floor of 12.9 (the heating value of polyethylene); the pre-registration had written 13–15 and forgot that the water recovered from methanol synthesis and MTO must be electrolysed again. With process adders the line costs 22–27 kWh per kg of olefin, 52–64 per kg of PE if the propylene pays nothing. Heat rejected at 50 kg/sol: 56 kW into 108 m² of radiator, since 600 Pa of CO₂ has no convection to offer.

3 · demand & nameplate

Fifty kilograms a sol, set by the well. The nameplate rule was registered before the numbers: the largest of 50, 100 or 200 kg/sol whose water fits the well's unallocated share and whose mean power stays under 10 % of the city peak (a convention the integrator withdrew on 2026-09-21; account 7). On the well card's own allocation (193 L/sol to the propellant plant) 157 L/sol is unallocated (reading A, withdrawn by its source on 2026-09-21: see account 9); 50 kg/sol of PE needs 151 with the propylene vented, 100 needs 303. The power convention happens to give the same answer, with 1 % to spare on SOEC and no candidate at all on PEM - and a ±30 % perturbation on energy removes the 50, which is exactly what the registered ablation gate was written to detect. The demand table: the village liner at 101 t (village area basis) or 177.7 t (Run D's as-built basis) - both since corrected by the village to 96.3 t on the faces actually lined, see account 9 - conditional on a lever nobody has established; 278 kg of appliance plastic; 735–1,380 t if PE ever replaced Run C's water in the berm; 2–6 t of cable insulation nobody has registered. Steady demand is under 30 kg/sol, so this is a campaign line. At 50 kg/sol the 101 t liner (formerly; now 96.3 t and 1926 sol) takes 2,020 sol - 2.7 rendezvous windows - after commissioning.

4 · by-products & safety

No ethylene inside any pressurised volume; the plant lives outside. Ethylene's minimum ignition energy is 0.07 mJ, hydrogen's class; 1.74 kg fills one 78 m³ village corridor to its lower flammability limit; a deflagration in the city's 30.1 %-oxygen-equivalent cabin gas loads the 70 kPa hull eleven times over. Outside, in 600 Pa of CO₂, the oxygen is 62 times below ethylene's limiting concentration and the quenching distance is 21 cm: a leak cannot burn. PE powder is an St1 dust, so pelletising stays outside too, and the degasser purges with CO₂ at 0.15 kWh/kg rather than buffer gas at 5.27. By-products at 50 kg PE/sol: 45 kg of propylene with three sinks printed and none chosen, 2.7 kg of methane to the propellant tanks, coke burnt and returned as CO₂, 153 kg of water back to the electrolyser, and 400 kg of oxygen - twice the sulfur plant - to the cryogenic farm.

5 · make or import

24 items, 233 t, of which 10 t come from Earth (at 50 kg/sol; round 5 designs at 100: 29 items, 315 t, 20.5 t imported) (round 3, with the route (iv) hardware: 29 items, 250 t, 10.31 t imported). A single declared limit - ductile iron pressure parts to 24 bar and 343 °C, not below −20 °C - judges every vessel. The methanol converter passes at 20 bar because account 1 gives 22 % per-pass conversion there (the rule asked for 15 %); the MTO bed passes because a cast-stone lining keeps its iron shell under 300 °C, the glass plant's furnace-wall method; the polymerisation reactor passes at 20 bar and 90 °C. What is imported is the foundry's own "0 % local" list - compressors, bearings, seals, electronics, filters - plus three classes of this line's own: catalysts, cryogenic steel, electrolysis stacks. Under the foundry's rule, PE at 52 kWh/kg is a make with 5.7× to spare. Most of the local mass is not machinery: 96 t of printed silos, 77 t of sulfur-concrete footings, and a platform graded out of a site that falls 1.48 m across the footprint - 330 m³ cut and refilled on site, where an all-fill pad would have been 2.9 kt, 3,426 sol of the mine's spare haulage.

6 · propylene & selectivity

The nameplate of 50 holds only if the MTO ethylene selectivity is at least 0.405 - and round 1 had assumed 0.42. That 0.42 was a declared literature value that no gate had ever perturbed, sitting under a water margin of 4 %. Sweeping it over its own declared band, 0.35 to 0.50, moves the make-up water from 3.63 to 2.54 L per kg PE and the continuous cap from 43 to 62 kg/sol; the threshold for 50 sits inside the band. The "make it" verdict survives the whole band at 4.7× or better; the nameplate does not. The same ledger works the propylene sinks through instead of listing them. Making PP in the same reactor leaves the PE nameplate where it is and adds 45 kg/sol of PP, at 1.59 L per kg of polyolefin - and since PP and PE carry the same 14.4 wt % hydrogen, a liner allowed to be either would take 1,061 sol instead of 2,020. The foundry's carburising can absorb 1.8 % of the stream: not a sink. Recycle cracking brings the water to 1.93-1.54 L/kg. And a fourth sink, not pre-registered and found from a gate that went red: burn the co-products with the line's own surplus oxygen, condense the water, return the CO₂. Make-up falls to the stoichiometric 1.28 L/kg and stops depending on selectivity at all. Water would then allow 100 kg/sol; the registered rule still says 50, because 100 kg/sol draws 213 kW against a bookkeeping convention of 107.5 kW (since withdrawn) on a grid with 176 MW. The constraint has moved from physics to a convention, and lifting a convention is not this ledger's call. The integrator lifted it the same day - though not for the reason offered here.

7 · route (iv), registered

Burn everything but the ethylene in the line's own oxygen; the water stops depending on a catalyst nobody here can measure. The integrator adopted the route that round 2 had stumbled on after the data, on condition that it be registered before being rerun. Registered, it is a 37 kW oxy-fuel oxidiser (50 kW at the low end of the selectivity band), a condenser at the radiators' 330 K, a blower and 72 m² more radiator. The three molar-mass ratios of the net reaction CO₂ + H₂O → −CH₂− + 1.5 O₂ reproduce the make-up water, oxygen and CO₂ digit for digit. 87 % of the combustion water condenses; the rest rides back to the SOXE with the CO₂ and is not a loss. What does leave is the water in the inert purge, 1.3–13.4 L/sol - against a pre-registered "under one litre" - so the make-up is 1.31–1.55 L per kg PE rather than 1.28, and 100 kg/sol would need 131–155 of the well's 157 unallocated litres (reading A, withdrawn by its source on 2026-09-21: see account 9). The power convention that capped the nameplate was lifted because it stood on a city peak the grid had already retired, and had been the foundry's make-or-ship threshold all along; recomputed at the grid's current peak that threshold is 245 kWh/kg and the line's 52.0 is 4.7× under it. The nameplate stays 50: the well is still read three ways by holders who have not answered, and the grid's reply is that size is not what binds - a feeder, a trunk and the protected share on the island are.

8 · island declaration

21 kW to stay hot, and no energy at all to go cold gently - if cooling at one kelvin a minute is allowed. The grid replaced "10 % of peak" with a rule about islands: no limit on nameplate, but every block declares on its own card what it must keep when the city runs on storage. Four items here are damaged by thermal cycling - the SOXE hot box, the SOEC stack, the MTO bed and its regenerator; the methanol converter, the reactor and the cold box may go cold, because what is lost there is inventory, not equipment. The wall method is the glass plant's, admitted only after it reproduced the 11.75 kW on that plant's card. Hot-hold comes to 20.9 kW, a fifth of the line's mean and 39 % of the 53 kW the island has to spare - so the grid is right that this line gets an energy reservation and not a standing share. And the reservation is small: counting only the iron shells, a lower bound on heat capacity, the vessels cool no faster than 0.75 K/min when all power is cut, so a controlled cooldown needs no heating if 1 K/min is allowed and 23 kWh at 0.5 K/min. Which of those applies is not closable here: no card in the city states the allowed cooling rate of a solid-oxide stack or a cast-stone lining.

9 · the rule, re-read

By its own rule the line could be 100 kg/sol. That is a ceiling by water, not a nameplate. In one day both inputs under the nameplate changed: the 157 L/sol of reading A was withdrawn by its source (the life-support ledger had assumed 43 kg of methane a sol where the propellant plant's card says 13.5, and counted four waters per methane where the Sabatier returns two), leaving 310 L/sol unallocated; and the power clause was replaced by the grid's rule. Asked to re-read its own rule rather than take a number from the ruling, the dossier ran the same function that reproduces its earlier outputs: on route (iv), 100 kg/sol needs 131–155 L/sol, 42–50 % of the unallocated water, and 200 fails at the top of the purge band; with the co-products vented 100 would take 303 L/sol, 98 % of everything the city has not yet given to anyone. The rule treats "unallocated" as "available to this line", and that premise is the integrator's to reject and the user's to decide - so the card still says 50. The plant as drawn could not take 100 anyway: its radiators would be 178 m² short on a platform with no free edge. The village has corrected its liner to 96.3 t on the faces actually lined (1926 sol at 50 kg/sol), still a conditional demand.

10 · literature

The catalyst figure this dossier had declared for four rounds is outside what the commercial plants report. With the user's permission the seven declared values were looked up. Commercial DMTO units convert 78.7–79 % of methanol carbon to light olefins, and the DICP flowsheet puts 0.506 of that carbon in ethylene: 0.398–0.400 ethylene carbon selectivity, against the 0.42 declared in round 1 - outside the band, and narrower than the 0.35–0.50 this dossier had allowed itself. The lining, not the stack, sets the controlled cooldown: castable refractories are cooled at 25–56 °C/h in the makers' guidance, 0.42–0.93 K/min, while stacks are cycled at 1.7–30 K/min in the open literature and no maker's limit was found. Cast-iron heat capacity is 460–490 J/kg·K in the handbooks; the declared 450 is outside. The Antoine constants written from memory in round 3 turn out to be NIST's Stull 1947 set digit for digit - the gate that rejected them was rejecting the fit's 1.5 % at the boiling point, not the memory. The NBS measured polyethylene's heat of combustion at 46.36–46.42 MJ/kg; the declared 46.3 is 0.13 % low. Pages that refused the fetch are not cited.

11 · the line at 100

Designed at 100 kg/sol on the literature selectivity, with the user's 150 L/sol - and the nameplate still has conditions. On 2026-09-22 the user granted the water. Every rate comes from the same function that produced account 7; equipment scales by declared rules (import capacity ×2, local castings ×2^0.6); the shells are sized from the cavity outward through the lining account 8 declared. The net reaction needs 128 L/sol at any selectivity, but the top of the purge band at the radiator temperature reaches 155 - above the allocation - so 100 kg/sol holds only with the purge stream chilled to 278 K (129–130 L/sol) or with ECLSS delivering CO₂ at ≤ 1 % inerts. At the literature selectivity the oxidiser is 80.5 kW and the line draws 222 kW, above the 213 the grid checked its trunk against; the radiators come to 373 m². Hot-hold rises to 39.8 kW; the cooldown reservation, now bounded by the lining's sourced rate, is 0–132 kWh. The plant is 29 items and 315 t, 20.5 t of it imported. The 74 m platform does not fit the ruled site: at (40,130) it crosses the water pipe rack and the well, and the ground under it varies by 1.73 m, more than the plinth; at (50,130) both are clean, and the alternative site is withdrawn. The integrator adopted (50,130) the same day (mars 77ab041) - with the manifest's sink still at 1.1 m, under which the platform top sits 0.20 m below the highest ground; the delivered 0.78 m is restated, and that gate stayed red until the manifest carried it - which it does since the same evening (ae51433). The grid re-ran its trunk check at 266 kW the same evening: green, 28 kW left on the east trunk; the nameplate's last condition was the purge - closed by account 12, which declares the purge cooler: 0.93 kW of duty, 0.31 kW of electricity, 210 kg, condensing 25.6 of the 26.8 L/sol the purge would otherwise carry off. The nameplate of 100 kg/sol is a statement. ECLSS then answered on purity: its frozen-out CO₂ carries at most 0.2 % inerts (its one assumption, the frost-bed porosity, named and ranged), which would cut the cooler's duty to 4 % of design and let the water fit without it - printed beside the cooler as a relief, by the ruling, not designed on. ECLSS then gave the delivery pressure too - 2.2 bar at 205 K from a closed sublimer, no compressor, consistent with NIST's sublimation curve - so its CO₂ is the feed: the line's own atmosphere compression, 2.0 kW, is gone and the mean draw is 220 kW, now a row in the grid's own table (G-W 264 of 266, G-E 3,170 of 3,200). The well's holder finalised the water: 30.3 + 39 + 150 for this line leaves 161 unallocated and the well's life untouched. ISRU declined the oxygen r1 had offered it - its electrolysis is sized by hydrogen - so that offer is withdrawn.

03

The ledger

Every headline number on this page, the state it is in, and the script that produced it. Scripts live in the dossier mars-polymer/ledger/ and write mars-polymer/out/; the pre-registration is the dossier's first commit; the five ledgers are commit 358d389.

ClaimValueStateProduced by
Route chosenMTO, variant 2a (SOXE CO + 2 H₂)account · rule registered before datamars-polymer/ledger/01_routes.py
Electrolysis floor, practical / thermodynamic23.1 PEM · 18.3 SOEC / 12.9 kWh/kg −CH₂−account · miss vs 13–15 pre-registered01_routes.py
Per kg ethylene, co-products at zero / paying their ownMTO 63 / 31 · FT 292 / 59 · OCM 316 / 55 kWhaccount · selectivities declared01_routes.py
Methanol equilibrium conversion at 250 °C53 % at 50 bar · 22 % at 20 baraccount · K(500 K) in the JANAF band01_routes.py · thermo.py
FT ethylene as a share of CO fed9 %account · ASF α 0.5 declared01_routes.py
OCM per-pass C₂ yield18 %declared band · gate ≤ 30 %01_routes.py
MTO catalyst import at 100 kg PE/sol107 kg / windowdeclared productivities and lifetimes01_routes.py
Per tonne PE, 100 % selectivityCO₂ 3.14 · H₂O 1.28 · H₂ 0.143 · O₂ 3.43 taccount · identities02_mass_energy.py
Whole train per tonne PE, propylene uncreditedCO₂ 7.32 · H₂O 3.03 · O₂ 8.01 taccount · C/H/O balance 1e-902_mass_energy.py
Electricity per kg PE, olefin / PE-only basis27.2 / 63.8 PEM · 22.4 / 52.5 SOEC kWhaccount · process adders declared02_mass_energy.py
Margin to the foundry's historical 298 kWh/kg5.7× · 4.7× to the current 245 (account 7)cited threshold · res-foundry-01 account 14, keyed to a retired city peak02_mass_energy.py
Well water unallocated, three readingsfinalised: 30.3 / 39 / 150 (this line) / 161 unallocated of 380 · formerly 157 / 310 / 310cited · the well's holder 09-22 (083e80d); no dedicated well02_mass_energy.py · DISPATCH water_readings
ISRU water make-up by its own card39 kg/solaccount · 2.9 kg/h × 45 % recovery02_mass_energy.py
Oxygen co-product at 50 kg PE/sol400 kg/solaccount · two paths agree 0.1 %02_mass_energy.py
Heat rejection / radiator at 50 kg PE/sol56 kW / 108 m²account · miss vs 20–40 kW02_mass_energy.py
Appliance plastic in the 91-unit fleet278 kg, none importedaccount · reproduces home 2,803 / 1,064.403_demand_nameplate.py
Village liner demand96.3 t (holder's basis A; B 106.5 / C 150.6 / D 171.9) + 0.693 t door cores · formerly 101 t / 177.7 t, corrected by the holderconditional · four bases printed03_demand_nameplate.py
Berm shielding at equal hydrogen to Run C water735 / 1,380 tconditional · no geometry run03_demand_nameplate.py
Nameplate50 kg PE/solaccount · G3.3 red by its own registration03_demand_nameplate.py
Liner delivery at 50 kg/sol2,020 sol / 3,554 solaccount · t₀ = import window + 100–200 sol03_demand_nameplate.py
Hydrogen per tonne, PE vs water14.4 vs 11.2 wt % (+28 %)identity · pre-registration had the sign wrong03_demand_nameplate.py
Ethylene LFL / UFL / MIE in cabin gas2.7 % / 41 % / 0.07 mJdeclared constants · UFL interpolated04_safety_byproducts.py
Ethylene to fill one corridor to its LFL1.74 kg in 78 m³account · density reproduces mars-home 0.94104_safety_byproducts.py
Deflagration against the hull784 kPa abs · 11.2×account · fire-ledger flame-T proxy04_safety_byproducts.py
Outside: LOC margin · quench distance62× · 21 cmaccount · reproduces fire 34 cm for CH₄04_safety_byproducts.py
Purge gas, buffer N₂ over CO₂35×cited · res-eclss-01 5.27 / 0.1504_safety_byproducts.py
Propylene per kg ethylene0.9 kgaccount · sinks printed, not chosen04_safety_byproducts.py
Plant mass / imported250 t / 10.31 t (4.1 %) · formerly 233 t / 10.05 t, 24 items, before route (iv)account · bulk items measured from the module · 29 items05_make_or_import.py · geom_export.mjs
Footings / silos77 t sulfur concrete / 96 t printed regolithmeasured · concrete density declared, print density from the printer cardgeom_export.mjs · 05_make_or_import.py
Site terrain variation · platform earthwork1.48 m · 330 m³ balanced / 2.9 kt all-fillmeasured in-engine · 1 m bilinear gridledger/data/terrain_sites.json · 05_make_or_import.py
Methanol vessel20 bar ductile iron, localaccount · 22 % ≥ 15 % rule05_make_or_import.py · 01_routes.py
Catalyst make-up at 50 kg PE/sol54 kg / windowdeclared05_make_or_import.py
Ethylene selectivity needed for 50 kg PE/sol (reading A) / 100 (reading B)≥ 0.4054 / ≥ 0.4094 · r1 assumed 0.42account · bisection, back-substitution 1e-6 · inside the declared band 0.35-0.5006_propylene_selectivity.py · mto_train.py
Across the declared selectivity band: water · continuous cap · electricity3.63-2.54 L/kg · 43-62 kg/sol · 63-44 kWh/kgaccount · 31-point sweep, C/H/O 1e-9 at every point06_propylene_selectivity.py
Propylene sinks: PP · carburising · recycle cracking+45 kg/sol PP, PE unchanged · takes 1.8 % · 1.93-1.54 L/kgaccount · cracking yield 0.4-0.8 declared06_propylene_selectivity.py
Burn co-products, recover the water (not pre-registered)1.86 / 1.28 L/kg · 100 kg/sol by water, 50 by the registered rule (213 vs 107.5 kW, a convention withdrawn 2026-09-21)account, added after data · independent of selectivity to 1e-906_propylene_selectivity.py
Route (iv) oxidiser heat at 50 kg/sol36.7 kW · 49.6 at selectivity 0.35run · pre-registered 28–40 and 36–50: hit07_route_iv.py · oxidiser.py
Extra radiator for route (iv)+72 m² → 180 m²run · one convention (0.52 kW/m²), no heat credit taken07_route_iv.py
Combustion water condensed at 330 K, 1.5 bar87 % · the rest returns to the SOXE as vapourrun · vapour pressure from the dossier's own table07_route_iv.py
Water lost in the inert purge (upper bound)1.3–13.4 L/sol → make-up 1.31–1.55 L/kgrun · pre-registered < 1 L/sol: MISS · purge inert fraction declared, unmeasured07_route_iv.py
Flue-gas recycle to hold 1100 °Cat most 43 kg per kg fuelasymmetric: 298 K heat capacities can only exclude larger flows07_route_iv.py
Electricity, route (iv)52.0 kWh/kg · 105 kW meanrun · less atmosphere to compress, a blower added07_route_iv.py
Make-or-ship threshold at the grid's current peaks245 / 389 kWh/kg · margin 4.7× (3.9× at selectivity 0.35)run · formula admitted by reproducing 298 · pre-registered ≥ 4.5×: MISS at the band's low end07_route_iv.py
Route (iv) hardware as drawnradiators 74.4 m² drawn ≥ 72.0 required · 97 needed at selectivity 0.35, not drawn · 16,364 trianglesmeasured from the module by mesh name · footprint unchanged: hit · triangles +500–1800: MISS (+3080)ledger/geom_export.mjs · 05_make_or_import.py
Route (iv) physics, mutation-tested7 / 7 mutants killedrunledger/mutate_oxidiser.py
Appliance replacement demand (the holder's figure)0.067–0.155 kg/solcited · mars-home 26f10fa, ledger 9dev/REPLY_hab-home-01_to_ops-polymer-01.md
Hot-hold power when islanded20.9 kW = SOXE 7.3 + SOEC 7.7 + MTO 4.1 + regenerator 1.8run · wall method admitted by reproducing the glass furnace's 11.75 kW · pre-registered 12–40: hit08_island_declaration.py · walls.py
Hot-hold against rock-wool thickness58 kW at 0.10 m → 16 at 0.40 mrun · pre-registered "falls by less than half": MISS08_island_declaration.py
Passive cooling rate with all power cutat most 0.24–0.75 K/minasymmetric: iron shells only, a lower bound on heat capacity08_island_declaration.py
Heating energy for a controlled cooldown0 kWh at ≥ 1 K/min · 23 kWh at 0.5 K/mindeclared gap · no card states the allowed cooling rate08_island_declaration.py
Wall and cooldown module, mutation-tested7 / 7 mutants killedrunledger/mutate_walls.py
Ceiling by water under the dossier's own rule100 kg/sol on either basis · 131–155 L/sol of 310 on route (iv)run · not a nameplate: the allocation is the user's09_rule_reread.py
What 100 kg/sol would needradiators 178 m² short · 211 kW meanlisted, not designed09_rule_reread.py
Electricity if ECLSS supplies frozen-out CO₂51.46 kWh/kgconditional · delivery pressure and purity are ECLSS's to state09_rule_reread.py
MTO ethylene carbon selectivity, literature0.398–0.400 · declared 0.42 outsidecited · Engineering 2021 (10.1016/j.eng.2020.12.001) × Chin. J. Chem. Eng. 2023 (10.1016/j.cjche.2023.09.007)10_literature.py · ledger/data/literature.json
Lining cooling rate, literature0.42–0.93 K/min · stacks cycled at 1.7–30, no limit publishedcited · Resco TI 101, Bloor Engineering; JES 2014 / 2018 / 202610_literature.py
Antoine constants from memory vs NISTidentical to Stull 1947 · range-matched set 17.20 kPa at 330 K vs table 17.13cited · NIST WebBook10_literature.py
HDPE heat of combustion, literature46.36–46.42 MJ/kg · declared 46.3 outside by 0.13 %cited · Splitstone & Johnson, J. Res. NBS 78A (1974)10_literature.py
Water at 100 kg/sol vs the 150 L/sol allocation128 net · 131–155 at 330 K · 129–130 with the purge chilledrun · the nameplate is conditional on the chilled purge or ECLSS purity11_design_100.py · route_iv.py
Oxidiser · radiators · electricity at 100 kg/sol80.5 kW · 373 m² required, 374.4 drawn · 222 kW meanrun · literature selectivity; pre-registered 355–365 m² and 208–214 kW: MISS11_design_100.py
Vessel shells from cavity + liningMTO r 1.32 · regenerator 0.89 · oxidiser 1.79 mrun · first version scaled the shell and left the oxidiser a 0.22 m cavity: gate red11_design_100.py · walls.py
Equipment at 100 kg/sol29 items · 315 t · 20.5 t imported (6.5 %)account · footings measured from the module · scaling mutation-tested 3 / 311_design_100.py · scaling.py
Hot-hold at 100 kg/sol · cooldown reservation39.8 kW · 0–132 kWh at the lining's raterun · cp at the literature 46011_design_100.py
Placement: ruled (40,130) vs proposed (50,130)relief 1.73 m > plinth, audit not clean · relief 1.48 m, sink 0.78, audit clean · A withdrawn · (50,130) ruled 77ab041 · sink 0.78 applied ae51433 · grid G18.6 green at 266 kW (6043776)measured in-engine · 36 positions through audit_layout.mjs · two gates red by the ruled site, keptledger/data/terrain_sites_r5.json · out/audit_r5.json
Purge cooler (the last condition on the nameplate)0.93 kW duty · 0.31 kW electric · 210 + 30 kg · 25.6 L/sol condensedrun · pre-registered 0.8–1.3 kW: hit · mutation-tested 4 / 4 after two gates were strengthened12_purge_cooler.py · purge_cooler.py
Shared balance module, mutation-tested7 / 7 mutants killed · account 2 output byte-identical after the moverunledger/mutate_mto_train.py · mto_train.py
Gates · scorecard98 / 103 green · 120 hit / 44 missrun · exit code gates the commitledger/run_all.py · out/summary.json
Placement candidates (both pass the layout audit)(40, 130) registered · (−54, 70)audit · integrator's callscripts/audit_layout.mjs
04

What broke

Thirty-one things the ledgers and the geometry overturned, most of them written by the same hand a few hours earlier.

The electrolysis floor was written as 13–15 kWh/kg. It is 23.

The pre-registered band was the thermodynamic floor - the heating value of polyethylene, 12.9 kWh/kg. It forgot that in a steady-state loop every mole of water that methanol synthesis and MTO give back is electrolysed again, so the electrolyser pays for two H₂ per carbon while the well pays for one. Same hydrogen, two ledgers: 23.1 kWh and 1.28 litres. Every downstream figure moved; the expectation stayed where it was written.

The MTO product slate could not close its oxygen balance.

Two percent methane, six percent paraffins booked as ethane and two percent coke booked as pure carbon carry 2.06 hydrogens per carbon - but CH₃OH → "CH₂" + H₂O pins the hydrocarbon-plus-coke average at exactly 2.00, and 0.03 oxygens per carbon went missing. Gate G2.1c went red on the first run. The model changed, the band did not: the heavies-plus-coke H/C is now the closure variable and comes out at 1.07, between aromatics and coke, which is physical. The first version stays in the json under a retired key.

Gate G1.1 could never have gone red.

It asked each route's step enthalpies to sum to the net reaction - but every step is built from the same formation-enthalpy table, so the sum equals the net by algebra. A gate that cannot fail proves nothing. It was replaced by three external known answers: the Sabatier heat must reproduce the ISRU card's −165 kJ/mol, methanol synthesis −90.6, FT −165 ± 12. The Hess sum is still printed, labelled consistency, not evidence.

The pre-registered sentence "PE carries 22 % less hydrogen per tonne than water" is retired: the sign was wrong.

Polyethylene is 14.4 wt % hydrogen, water 11.2: PE carries 28 % more. The registered gate G3.5 asserted the wished sentence and was NOT EVALUABLE as written, which is not the same as passed; it was removed from the count by name, noted, and replaced by an identity gate that can go red.

The nameplate was expected at 100 kg/sol. It is 50 - and its own ablation gate went red on purpose.

Gate G3.3 was registered to fail if a ±30 % change in energy per kg changed the nameplate, with the instruction "if it changes, the rule depended on energy, not water, and says so". It changed: the 50 kg/sol cell passes the power convention with 1 % to spare and +30 % removes it. So the nameplate rests on the well - 151 of 157 unallocated litres a sol (a reading since withdrawn by its source, 2026-09-21) - and only coincidentally on the foundry's 10 %-of-peak convention, which on PEM stacks would allow nothing. The gate stays red, excluded by name, and the conclusion changed.

The dispatch premise "1.06 t of appliance plastics, all imported" is not in the home ledger.

Its 1,064 kg of imports are compressors, motor windings, bearings, seals, electronics, heating elements, magnetrons and stainless drums - no plastic. The 278 kg of plastic parts are booked to pyrolysis filament. The real dependency is upstream: the filament is 29.5 kg/sol of imported packaging times a 55 % recovery. Stop the packaging and the filament stops.

Polymerisation enthalpy: −112 from the heating value, −93.6 from calorimetry.

The −CH₂− formation enthalpy back-calculated from HDPE's 46.3 MJ/kg is −29.9 kJ/mol, inside its gate band; it gives −112 kJ/mol for the polymerisation, 20 % off the textbook −93.6. A small difference of two large numbers: one percent on the heating value moves it 15 kJ/mol. Both are printed; heat rejection uses the larger.

All three route energy bands missed, because the pre-registration never said what a co-product is worth.

With co-products at zero, FT ethylene costs 292 kWh/kg; with each co-product paying its own electrolysis, 59. A factor of five between two bookkeeping conventions that the expectation had not fixed. Every energy figure in the dossier now carries its basis.

Heat and CO₂ were pre-registered on the wrong basis.

20–40 kW and 314 kg/sol of CO₂ were 100 %-selectivity numbers; the whole train with propylene uncredited is 50 kW and 732 kg at 100 kg PE/sol. Booked as misses; the basis is now in the key names.

The geometry pass retired the plant mass: the first version's 20 t floor was 6 mm of concrete.

Account 5 had declared the dust shed with its floor at 20 t and the two pellet silos at 6 t, for a plant of 65.7 t. Drawn at their real size, 20 t over 46 × 30 m is 6 mm of sulfur concrete, and two 4 × 9 m silos with the printer's own 0.2 m wall weigh 96 t. The card had also transcribed the silos as 12 t. Bulk items are now measured from the module by a script the ledger calls, so the number and the drawing cannot drift apart: footings 77 t, silos 96 t, plant 233 t. The 10 t import did not move.

The site is not flat, and my first terrain gate had the wrong band - twice.

The registered position falls 1.48 m across the platform; the first platform was 1.35 m high and terrain came through the floor. The engine now exports its own terrain grid, with no hand-copied heights, the platform is 1.65 m on a 1.10 m sink, and the ledger books the earthwork. The gate comparing bilinear heights with the nearest vertex was set at 0.05 m before I knew the vertices are 3.70 m apart; it failed at 3 of 5 probes (0.082 m) because nearest-vertex error alone is that large on this slope. The band was wrong, not the sampler. Its replacement, a vertex-exact test, was first written at 1e-6 m - tighter than float32 world coordinates can resolve - and corrected to 1e-4 m, alongside a four-vertex bracket.

Round 1's headline stood on a number nobody had perturbed.

"Nameplate 50 kg a sol, held by the well" had a 4 % water margin and rested on a declared MTO ethylene selectivity of 0.42. The only ablation round 1 ran was on energy. Swept over its own declared band the threshold for 50 kg/sol is 0.405 - inside the band, 0.015 below the assumed value. The nameplate is now written as a conditional, and the missing measurement is named: this catalyst's ethylene selectivity at this line's conditions.

A direction gate I registered was wrong, and being wrong it found the best sink.

Gate G6.9b said that with recycle cracking converting nothing, the line could not need less water than round 1. It needs less: 2.66 against 3.03 L/kg, because the half of the cracker's by-products that is burnt gives its hydrogen back as water. The gate is booked as a miss and replaced by a known answer worked by hand. Followed to its end, the same mechanism is a sink neither round had listed - burn everything but the ethylene with the line's own oxygen and condense the water - which takes the make-up to the stoichiometric 1.28 L/kg at no extra electricity.

Mental arithmetic in a pre-registration: four misses in one row, three of them one slip.

I wrote that at the top of the cracking band 100 kg/sol would need about 159 L of water and miss the 157 available (as reading A then had it; since withdrawn). It needs 154 and fits. The same slip put the cap range above its band and let the top of the band reach 100 kg/sol, which I had said it would not; the fourth miss, an ethylene share of 0.804 against a band edge of 0.80, was only a rounded band edge. Also caught on the way: a molar-mass table that held propylene rounded to four decimals, 1e-6 off three CH₂ - found by an identity gate that, with a consistent table, could never have gone red.

The turntable gif was not delivered in round 1, and the capture tool is still broken.

The city's capture script writes a structurally valid gif of 120 frames that are all one flat colour - its headless browser never gets an animation frame. Round 1 shipped nothing rather than that file. Round 1.1 went round the tool: the engine was stepped by hand in a visible browser pane, 120 frames rendered and uploaded one by one, and the gif assembled with ffmpeg. It was accepted on numbers, not on looking at a frame: every frame has content, consecutive frames differ in about 44,000 of 518,400 pixels, and the last-to-first step is the same size as any other, so the loop closes.

I wrote the purge water as under a litre a sol. It is between 1 and 13.

The pre-registration for route (iv) put the water lost with the inert purge below 1 L/sol. The ledger gives 1.3 to 13.4. The mental arithmetic had used the vapour pressure of water at 10 °C; the condenser sits at the radiators' 330 K, where a saturated gas is 13 % water. The miss matters: at 100 kg/sol the margin to the well's unallocated share shrinks to as little as 2 L/sol, and the ruling's phrase that the route depends on "the condenser's recovery" has to become "the purge". Chilling that one small stream to 5 °C brings the make-up back to 1.30 L/kg - found after the data, labelled so, and not in the equipment list.

The constants I remembered for water's vapour pressure failed the gate I had set for them.

The pre-registration said the Antoine constants would not be used unless they reproduced three known points. At 100 °C they give 99.75 kPa, 1.55 %% from the boiling point against a registered ±1 %%. So they feed no figure. The vapour pressure now comes from the dossier's own thermochemical table - which lands the same 1.5 %% low at 100 °C, the two independent forms agreeing to 0.03 %%. The band was too tight for a fit across 75 K; the red gate is kept by name and the looser replacement says it was written after the data.

A gate I registered would have passed the very bug it was there to catch.

"Doubling the pressure about halves the uncondensed vapour, ±5 %%." At the design condenser the exact factor is (P − ps)/(2P − ps) = 0.469, so the gate is red on correct code. Worse: a mutant that divides by P instead of P − ps gives exactly one half and sails through it. The registered gate is kept red; the exact identity replaces it, and the mutation test now kills that mutant.

The reason I gave for lifting the power convention was not the reason.

Round 2 argued that the 107.5 kW convention (since withdrawn) was bookkeeping on a grid with 176 MW. The integrator lifted it for a different reason: 107.5 is 10 %% of a city peak the grid had retired eight days before I cited it, and at 10 %% of the current peak the line's own 50 kg/sol would have failed the rule. I had quoted a dead number by its commit hash and never re-read the card.

My ledger was reading another dossier's live file.

Account 3 reproduces the appliance fleet from the home ledger "at commit 036a7e8" - but opened the file on disk. On the day the appliance line answered my dispatch and corrected its fleet mass from 2.80 to 5.66 t, my known-answer gate went red, as it should. The account now reads a pinned copy of the cited commit; the holder's new figures enter as citations, not by moving an old account.

Round 1's heat account had no combustion term.

The regenerator has burnt coke since round 1, and its heat was never sent to the radiators. It is 1.0 kW - I expected 1.5 to 4 - and it now rides in the radiator extension.

The cut-away reactor had been a black column since round 1, and the published picture showed it.

The MTO vessel is drawn cut open toward the viewer so the glowing bed can be seen. Its cast-stone lining was a full cylinder inside the cut shell, so from the open side the bed was hidden behind it; the round-1 picture on this page shows exactly that and nobody, including the author, looked. It was found only when the new oxidiser, built the same way, came out black too. Both linings are now cut with the same window as their shells; the round-1 picture is kept above.

The number under my headline was somebody else's arithmetic slip, and I had printed it for eight days.

Round 1 set the nameplate on 157 L/sol of unallocated well water (since withdrawn) and printed the three conflicting readings "not chosen". When the life-support ledger's holder was finally told by name, it answered within the hour: the 193 L/sol behind the 157 was its own error - an assumed methane rate three times the propellant plant's card, and four waters per methane where the Sabatier returns two. Printing a disagreement without choosing was honest; sending the question to holders who had no session to read it was not a way of getting it answered.

I carried the glass furnace's intuition onto vessels where it does not hold.

On the glass plant's small furnace, thicker insulation is eaten by the growing outside area, and I pre-registered that tripling the rock wool would cut the hot-hold power by less than half. Here the lining sits inside a drawn shell, the outside area does not grow, and the hold power falls from 58 to 16 kW. Looking at it also showed the vessels are drawn slimmer than their own linings: the MTO shell leaves 0.18 m where 0.30 m is declared, and the oxidiser cannot house its firebrick at all.

A rule that gives the right number can still rest on a premise nobody granted.

My nameplate rule takes the largest candidate whose water fits in the well's unallocated share. On the corrected figure it says 100. The integrator's objection is to the rule, not the arithmetic: unallocated water is not water available to one line, and with the co-products vented 100 kg/sol would have taken 98 % of it. The account therefore reports a ceiling and leaves the word nameplate alone.

The selectivity I declared in round 1 was never what the plants get.

Round 1 wrote 0.42 for the ethylene carbon selectivity of SAPO-34 as a literature value from memory, and round 2 gave it a band of 0.35–0.50 and found the nameplate hung on it. With the user's permission the number was finally looked up: commercial DMTO units come to 0.398–0.400. Round 2's threshold of 0.405 for the vented basis would never have been met. Route (iv) had already freed the water from the catalyst; what the literature figure still moves is the oxidiser, 80.5 kW instead of 73, and the electricity, 222 kW instead of 211.

Scaling the shell by √2 starved the oxidiser of its own lining.

The first version of account 11 doubled the duty by scaling every vessel radius by √2. For the 1100 °C oxidiser the gate on lining fit went red: with 0.62 m of firebrick and 0.30 m of wool inside an r 1.13 m shell, the cavity was 0.22 m. Sized from the cavity outward the shell is r 1.79 m - and that closes the round-4 finding that the vessels were drawn slimmer than their linings.

A mutation test that killed nothing, because the gate had asked the scaler to grade itself.

The scaling gate compared the scaler's output to sums the scaler had computed. Three deliberately broken copies passed it. The expectation is now computed in the account from account 5 directly, and all three die. A second fault hid behind it: the shared module inserted its own directory at the front of the import path and pushed the mutant's directory out; every mutant of the oxidiser physics would have gone quiet the same way.

The platform grew north into two pipe racks.

The pre-registration had the platform extend 14 m in −Z for the new radiators. The city audit put it across the water pipe rack at the ruled site and the oxygen main at the alternative. Widened 16 m to +X instead, the unit is clean at (50,130) - but not at the ruled (40,130), where it still reaches the well and the pipe rack, and where the ground under the wider footprint now varies by 1.73 m, more than the 1.65 m plinth. The alternative site cannot take 74 m at all. Both gates stay red by name; the position is the integrator's.

The module was 9 m off its own origin, and the audit tool draws from the origin.

audit_layout.mjs takes each unit as pos ± half its bbox, which is exact only for a module centred on its origin. This one had its platform centred at local (+1, −2.5) since round 1 and, widened, at (+9, −2.5): the audit rectangle sat 9 m west of the real platform. The module now recentres itself on its bounding box before it returns, as the models contract asks; the terrain export and the placement sweep were redone on the centred footprint.

The water allocation is 150 L/sol and the purge alone can breach it.

At 100 kg/sol the net reaction needs 128 L/sol whatever the catalyst does. The inert purge at the radiator temperature adds up to 27 L/sol at the low end of its declared band - above the allocation. The chiller on the purge stream, found after the data in round 3 and unregistered until now, is what makes the nameplate fit (129–130 L/sol); ECLSS's frozen-out CO₂ would do the same if its inert content, which no card states, is under 1 %.

05

Try it