Skip to the content.

Task Log

Purpose: Persistent memory across sessions. Every solved task gets an entry here so future sessions can find prior solutions instead of starting from scratch.

How to use: Search this file for keywords before starting a new task. If a similar task was solved before, start from that solution.

Entry Format

### YYYY-MM-DD — Short task title
**Type:** A (Property) | B (Process) | C (PVT) | D (Standards) | E (Feature) | F (Design) | G (Workflow)
**Keywords:** comma, separated, search, terms
**Solution:** Where the code lives (test file, notebook, source file)
**Notes:** Key decisions, gotchas, or results worth remembering

Privacy Rule

Task log entries are public/reusable memory. Do not include company/operator names, field/facility/asset names, equipment tag numbers, internal document names, private system names, access diagnostics, or task folder slugs containing those details. Use generic descriptors such as confidential offshore gas platform, private task folder (redacted), operator-specific technical requirement, or confidential compressor route.


Log

2026-10-14 — Coordinate shared-slate characterization with mixing-rule isolation

Type: A (Property) Keywords: shared reference slate, quantile projection, shared mixing handler, accepted-point replay, 4330, 4333 Solution: Stack PR #4330 on the shared classic mixing-rule accumulator foundation while preserving its characterization implementation, regression tests and mathematical documentation byte-for-byte. Regenerate engineering coverage for the combined source tree. Notes: The unchanged field-to-facility acceptance class passed three fresh-JVM runs on both the original head and the foundation overlay (six tests per variant, none failed or skipped). A read-only fixture probe confirmed the parallel HP/LP branches share phase-specific mixing handlers. Java 8 dependencies and release-8 bytecode were tested on Linux Java 17. This validates the shared dependency; it does not establish the cause of the earlier Windows Java 8 accepted-point replay failure, which remains a hosted CI gate. No solver tolerance or execution setting changed.

2026-10-14 — Isolate shared classic mixing-rule accumulators

Type: A (Property) Keywords: classic mixing rule, concurrency, cloned fluids, heat capacity, compressor pressure replay, SRK, PR, 4326, 4306 Solution: Extract the existing EosMixingRuleHandler correction and six deterministic ClassicMixingRuleAccumulatorTest cases from PR #4306 as a shared foundation. Use calculation-local accumulation in general covolume, classic attraction temperature second derivative, and composition-dependent attraction calculations; retain legacy serial result fields. Notes: All six interleaving regressions fail on the unchanged implementation and pass with the correction. The three-train compressor guide counterfactual removes 39 observed search/replay discrepancies by changing this mixing-rule class alone; single, multi-variable, staged and helper examples remain feasible with unchanged physical limits. Validation used Java 17 with Java 8 source/target; Windows Java 8 remains a CI gate. No compressor solver, tolerance, equation or public API changes. Coverage does not claim every mixing family or concurrent configuration mutation. The mixing-rules guide documents the scope.

2026-10-14 — Coordinate mapped-network and compressor speed-solve acceptance

Type: E (Feature) Keywords: PR 4328, PR 4326, mapped compressor, pressure target, convergence, stale thermal state, shared power Solution: LoopedPipeNetwork.calculateHeadLossCompressor, MappedCompressorAcceptanceTest, and the SURF integration guide. Notes: A bounded chart speed search requested 100 bara and returned an internally consistent 11.647013866 bara forward state with solved() == false, while the network labelled it a valid chart result and retained 53.131953657 kW. Require the existing equipment convergence contract, an enabled chart, finite non-negative power, and positive finite outlet pressure/temperature before accepting mapped evidence. Reuse the existing infeasible-edge path to invalidate power and clear previous thermal state. Four regressions first establish a valid state, then exercise an unsolved result, chart disablement, non-finite power, and non-finite temperature. Keep the common network boundary in PR #4328 and the compressor’s speed-search implementation in PR #4326; no system-specific solver or new constraint framework is introduced.

2026-10-14 — Preserve compressor convergence requirements during optimization

Type: E (Feature) Keywords: compressor, speed solve, invalid chart, optimizer, infeasible trials, lift curves, CI, 4326 Solution: Compressor.SpeedSolveException, ProductionOptimizer candidate rejection and hard convergence gate, and conditional chart-setup process runs in FlowRateOptimizer. Notes: Reproduced all three failing optimizer cases on PR #4326 before repair. A no-valid-map trial is rejected without reading stale objectives or downstream constraints; unrelated exceptions still propagate. Capacity analysis and optional output validation cannot bypass the pressure-target convergence requirement. Repeated table setup reuses existing charts without rerunning an invalid preceding probe. Updated compressor/optimization guides, the compressor skill and the generated coverage inventory; regression tests cover stale outputs, hard convergence, recovery and chart reuse.

2026-10-14 — Propose shared flash and process state contracts

Type: G (Workflow) Keywords: NRC-2937, TPflash, phase inventory, hydrate, inactive streams, coordinated PR review Solution: docs/rfcs/2937-tpflash-state-contracts.md and the RFC index. Notes: Record the proposed state ownership, physical acceptance, compatibility and process-consumer contracts shared by PRs #4306, #4320 and #4277. Preserve explicit physical model boundaries and separate model corrections from solver qualification. Status remains PROPOSED; this document supplies no architecture acceptance, independent approval or merge qualification.

The RFC index is the 51st first-level landing page and participates in the navigation contracts. Its title is rendered from front matter rather than duplicated as an H1; the inventory assertion and explicit RFC-index membership check cover the new page. Correct the exchanger method’s inline code span in the proposal.

2026-10-14 — Preserve production proposal guards across interrupted cycles

Type: G (Workflow) Keywords: PR 4312, resume, proposal guard, evidence ledger, frozen user input, fail closed Solution: devtools/neqsim_continuous/cycle.py, user_input.py, stages.py, and devtools/test_neqsim_production.py. Notes: A completed guard status did not preserve its filtered proposals or upstream blocks: resuming before ledger publication could mark previously withheld advice as current evidence. Resume now revalidates the inexpensive gates, constraints and guard against restored calculation outputs, reapplies frozen user restrictions, and blocks advice if the input checkpoint is unavailable. Completed model/optimizer work and persisted ledger events remain checkpointed. The ledger binds publication to the exact current-cycle guarded proposal content, rejecting post-guard mutations, added proposals and reused old-cycle evidence. Thirteen deterministic regressions failed on the previous head and pass with the repair; the full production suite passes 57 cases. Continuous/living coverage passes 42 cases, with one existing optional DOCX-report test skipped because its dependency is unavailable. Hosted CI remains a publication gate.

2026-10-14 — Isolate evidence routing tests from optional agent installations

Type: G (Workflow) Keywords: evidence-source-cues, hermetic tests, plugin discovery, production guard, CI, PR 4312 Solution: devtools/test_evidence_sources.py and .github/workflows/ai-devtools-python-tests.yml. Notes: The validator loads cue declarations from discovered agents; public CI has no optional provider catalog. Tests now supply a temporary synthetic catalog and isolate checkout, installed-agent and plugin roots while exercising real discovery and parsing. Cover missing catalogs, plugin-only aliases, duplicate/invalid cues and invalid statuses. Keep provider routing policy out of the validator. Include the production-envelope guard and persistent-ledger regression suite in Devtools CI. The coordinated master workflow now retains this shared repair.

2026-10-14 — Invalidate field evidence before optimizer or guard failure

Type: B (Bug fix) Keywords: PR 4312, persistent envelope, evidence invalidation, failed guard, power limit, resume Solution: devtools/neqsim_continuous/stages.py and devtools/test_neqsim_production.py. Notes: An existing proposal remained current after a changed shared-power limit and malformed optimizer output skipped the guarded ledger stage. Move invalidation to evidence assessment and restore, preserving the guard for new proposals. Repeated failures remain idempotent, implemented history remains stale and traceable, and resumed publication retains its fresh cycle evidence. Add failure/recovery, report, dry-run and resume regressions. Integrate current master workflow naming and shared CI repairs; use ai-devtools-python-tests.yml rather than restoring the removed workflow filename.

2026-10-14 — Repair shared CI failures and preserve workflow diagnostics

Type: G (Workflow) Keywords: PR 4315, hermetic tests, evidence-source-cues, slow shards, required checks, Surefire, CI Solution: Reuse the evidence-routing test fixture from PR #4312 commit d469208aa227449d40c3f441e8f5a345795aa29a and the eight-shard slow-suite partition from PR #4328 commit 9bcca37f1ac0b717c18a499b3a1a74bcdeec1126 in the renamed workflows. Notes: Reproduced 27 routing assertions that required absent optional enterprise agents, then isolated agent discovery with synthetic installed/plugin catalogs. Add production guard regressions to Devtools CI, retain fast/slow Surefire reports, and let both fast-suite platforms finish after a failure. Four compatibility gates preserve historical required-check names and require all eight slow shards to succeed. Correct the duplicated .yml suffix in the documentation pre-push filter. Document test isolation, report artifacts, shard membership, and compatibility behavior in BUILD and the workflow catalog. Numerical methods and acceptance thresholds are unchanged.

2026-10-14 — Recover model-specification CI from Maven resolution failures

Type: G (Workflow) Keywords: Java 8, Maven Central, dependency resolution, model specifications, PR 4320 Solution: .github/workflows/core-run-build-test-and-javadoc.yml retries the model-specification command once after a Maven plugin/dependency resolution failure and forces missing-release rechecks with -U. Notes: The Java 8 job on 15d1b8d failed before compilation while resolving maven-resources-plugin:3.3.1; absent test artifacts were secondary failures. Match Maven’s terminal resolution-error help line, preserve the failing command’s exit status, and fail immediately on compilation/test errors. The retry is bounded to two attempts with a ten-second delay. Numerical code, test selection, tolerances, and required evidence checks are unchanged. Documentation impact: CI recovery behavior is documented here and beside the workflow command; no simulation/API documentation changes are needed.

2026-10-11 — Review source routing and reusable tie-back guidance

Type: E (Feature) Keywords: source attribution, evidence routing, duplicate manifest, VFP, host model, regression Solution: PR #4292; devtools/test_generate_sources_md.py, devtools/test_evidence_sources.py, source-index generator, task validator and workflow skills. Notes: Removed duplicate source records, covered filename and manifest aliases, and added regression suites to CI. Replaced study-specific pressure/recovery rules with coupled inflow/outflow checks, explicit fluid provenance and baseline accounting. Regenerated the engineering coverage inventory after skill changes.

2026-10-10 — Class A tie-back study of a small undeveloped oil discovery to a nearby platform host

Type: G (Workflow) Keywords: class A, tie-back, VFPPROD, lift curve, depletion, OPM Flow, water injection, host model impact, availability gates, Monte Carlo, FieldDevelopmentDesignOrchestrator, StudyClass.CLASS_A Solution: private task folder (redacted); scripts: lift tables per well/line system (PipeBeggsAndBrills secant), OPM Flow runs per zone with VFP + water injection, host ProcessModel with an added wellstream in a separate jneqsim process, concept engine with gates and fiscal terms, Class A package via FieldDevelopmentDesignOrchestrator. Notes: Study-specific recovery, pressure, cost and economic results remain in the private evidence package; they are not reusable model defaults or public validation evidence. Evaluate depletion and gas lift using coupled inflow/outflow and host constraints. Investigate VFP interpolation and control switching before conditioning tables; retain and validate the original physical response. Isolate mutable deck-builder state for parallel runs. Assess existing VFP APIs before proposing a new generator, and require a reproducible case before changing cost calibration or pressure-solver limits. Host-impact and back-pressure guidance is recorded in neqsim-field-development.

2026-10-10 — OVP screening of a multi-prospect cluster between two producing hosts: host comparison, firm-well candidacy for the next APA round, conditional APbo position

Type: G (Workflow) Keywords: OVP, APbo, firm well, APA, prospect cluster, host comparison, Monte Carlo EMV, break-even Pg, programme value, host ullage, gas-condensate tie-back, strategy comparison, value of information Solution: Private task folder (redacted): script-backed class 5 screening with no field-specific data in any source (open Sodir, Centuries and PDM read-only, analogues as declared assumptions); NeqSim gas-condensate fluid and flow-assurance cases, host ullage from demonstrated capacity against plan for two hosts, concept economics with 3000-world Monte Carlo and tornado, strategy and value-of-information comparison, 28 validation checks, results.json, Word report with an APbo draft, development plan and data request as appendices; gotchas added to the enterprise host-ullage and prospect-risking skills. Notes: When no data exist for the prospects, say so first and show the result as gates (break-even chance of success, volume, timing) rather than one number. A cluster is valued as a programme: the lead alone is negative, the combination is positive. Apply the economic limit on the gas rate for a gas-condensate tie-back, not on the oil rate, or the profile loses a quarter of the gas. Gotchas: the shared terminal output is unreliable, so write scripts to files, run them detached and read UTF-8 logs; a tornado with a smaller sample has a different base than the main run, so state it in the results.

2026-10-10 — OVP of a small HPHT discovery with undrilled neighbours (Tott East, Tilje, Lynbjorn): cluster value, break-even volume gate, programme EMV, host-trunk ullage by capacity case

Type: G (Workflow) Keywords: OVP, APbo gate, small discovery, cluster tie-back, undrilled targets, programme EMV, break-even Pg, risked volume, trunk ullage, licence milestones, PDO deadline, schedule Monte Carlo, Linnorm, Asgard B Solution: Private task folder (redacted): script-backed class 5 screening (Sodir discovery, licence equity and milestones; read-only Centuries and PDM; NeqSim tuned HPHT fluid, shut-in column, leg, direct and trunk hydraulics, CPA hydrates, depletion; concept economics with 10000-draw Monte Carlo; trunk and host ullage by capacity case; schedule Monte Carlo against the PDO milestone), results.json, Word report with decision gates; new programme-EMV helpers in the enterprise prospect-risking skill and a cluster step in the area-development workflow skill. Notes: A discovery that cannot carry a tie-back alone makes per-well EMV misleading: value the combinations, keep development optional and compare the risked volume with the break-even volume. State the answer as gates for the pending G&G update (volume, Pg, trunk capacity, water) and not as one number. Timing from a shared trunk needs the ullage for several capacity and slip cases. Gotchas: detach2.ps1 takes a script file name, not a path; the shared terminal is polluted by parallel agents, so write check output to UTF-8 files; matplotlib errorbar rejects negative whiskers.

2026-10-10 — Partner-led firm exploration well, stand-alone prospect far from infrastructure: volume threshold per infrastructure share, analogue CAPEX, conditional APbo position

Type: G (Workflow) Keywords: APbo, exploration, firm well, stand-alone development, far from infrastructure, frontier wildcats, minimum economic volume, infrastructure share, area hub, EMV, 78 % refund, Monte Carlo, decision map Solution: Private task folder (redacted): script-backed screening (Sodir frontier wildcats with distance to the nearest facility, frontier discovery sizes and 16 stand-alone field analogues; read-only Centuries, PDM and document-root probes; NeqSim analogue fluids with hydrate and long export-line arrival; three stand-alone concepts with CAPEX regressed on the analogues, 2022 NCS tax, decision map over volume and infrastructure share, tornado, two 4000-draw Monte Carlo runs), results.json, Word report with APbo draft, data request, partner-package and MDQC checklists; trap added to the exploration-strategy skill. Notes: With no host the answer is a volume threshold, not a tie-back ranking: the prospect median sits far below it, so EMV is negative and the position is conditional on the partner volume, hub case and strategic value. Gotchas: percent signs in strings that go through % formatting must be doubled and plain strings must not be; the consistency check wants every linked key value stated in the figure observation.

2026-10-10 — Onboarding a not-yet-drilled discovery to a host project: four fluid outcomes, trunk delivery limit, timing of a combined decision gate, first-pass design basis, PDS and VP memo

Type: G (Workflow) Keywords: business opportunity, prepare for success, unknown fluid outcome, subsea tie-back, shared trunk, commingling delivery limit, host demonstrated capacity, combined DG3, schedule Monte Carlo, value of speed, flexibility cost-benefit, design basis, PDS, VP memo, TR3528 APbo, break-even volume, exploration EMV Solution: Private task folder (redacted): script-backed screening (open licence, discovery and well data, forecast plans and allocated production for the host, four NeqSim fluid classes tuned to GOR, density and dew point, Beggs-and-Brill leg and trunk tables, CPA hydrate, MEG, cooldown and M-506 corrosion, class 5 economics with 10000-draw Monte Carlo, schedule Monte Carlo), results.json, Word report with appendices for scenarios, data plan, design basis, PDS and VP memo; edits to the enterprise host-ullage skill (demonstrated capacity helper) and the flow-assurance skill. Notes: When the prospect has no public record, carry the fluid as discrete outcomes with break-even volumes and decision rules instead of one case. The shared trunk, not the host, limited the tie-in: add the new case to the trunk basis (inlet pressure rise and the rate at which delivery fails) before DG3. Timing is set by the date of the well result, so report the latest result date that keeps a combined gate (50 and 80 % chance) and compare the value of waiting with the cost of deferring the host project. Price flexibility against a break-even development probability. Gotchas: hydrateFormationTemperature() is void (read the fluid temperature); validate uncertainty with ascending percentiles (p10 low); key_results must be primitives; the shared terminal gets interrupted by parallel agents, so run long jobs detached with a new log name each time.

2026-10-10 — Partner-operated firm exploration well, frontier basin: unnamed prospect, candidate licences from public awards, host gas-reinjection limit

Type: G (Workflow) Keywords: APbo, firm well, partner-operated, high-risk high-reward, unnamed prospect, licence award, candidate licence, Monte Carlo, break-even Pg, host ullage, gas reinjection, water capacity floor, decision map, tornado, 78 % refund Solution: Private task folder (redacted): script-backed screening (open licence, ownership, well and discovery data, forecast host plans, NeqSim analogue fluids, hydrate and Beggs-and-Brill tables, tie-back model with 2022 cash-flow tax, decision map, tornado, 4000-draw Monte Carlo). Notes: When the prospect has no public record, identify candidate licences from the latest award batch (operator, equity, distance to hosts) and carry both equity cases instead of guessing. The firm well is a commitment, so the Equinor view is about the exposure (net of the 78 % refund) and endorsement triggers, not go/no-go. A host that reinjects its gas has almost no new-gas ullage: a gas-type success is capped and non-commercial however large (NPV falls with volume); an oil-type success tied back near the host carries the value. Floor a demonstrated water capacity at the host’s own plan peak or the tie-in is curtailed to zero. Expected value ended close to zero with a seed-sensitive sign: report break-even Pg and median-volume thresholds rather than the sign.

2026-10-09 — New subsea template with a second-field target versus spare slots and host-platform wells: cannibalisation, shared LP gas, staged option

Type: G (Workflow) Keywords: subsea template, infill, second field, cannibalisation, incremental share, spare slots, host platform wells, shared LP gas, gas intensity, flowline back-pressure, hydrate, no-touch time, staged option value, Monte Carlo, break-even Solution: Private task folder (redacted): script-backed screening (open licence polygons and remaining reserves, calibrated flowline curves, NeqSim Beggs-and-Brill and hydrate flash, annual profile model with 3000-draw Monte Carlo, tornado, break-evens, value bridge), results.json and Word report; edits to neqsim-subsea-and-wells and neqsim-capacity-increase-screening skills. Notes: Value the cheaper access routes (spare slots, host-platform wells) on the same profile model before a new template: they reach most of the barrels at far lower cost and risk, and a staged route carries an option value for the template. Incremental share per well must decay with well count or acceleration is booked as new oil; shared LP gas is best expressed as gas intensity per barrel per stream. A second fluid on a calibrated chain needs a viscosity or oil-equivalent factor recalibrated against NeqSim. The sign of a third flowline flips with trunk diameter. Gotchas: the report needs tornado as a list of dictionaries (keep per-concept tornados under another key); create_file cannot overwrite; PowerShell *> writes UTF-16.

2026-10-09 — Firm exploration well in an unproven play near a host: presence factor, break-even chance and volume, template effect

Type: G (Workflow) Keywords: APbo, APA, firm well, Rogn, play presence factor, break-even chance of success, break-even volume, host ullage, value of information, play opening, Monte Carlo, Beggs and Brill, hydrate Solution: Private task folder (redacted): script-backed screening (open well and discovery data, host ullage from a forecast, volume prior, NeqSim tie-back and hydrate screening, post-tax Monte Carlo EMV with tornado and break-even map), results.json and Word report with decision-support appendices. Notes: When the target formation is absent in public wells near the host, carry reservoir presence as a separate chance factor and treat distant finds as size and fluid analogues only. The go criteria are a pair (volume and chance); break-even chance is cost over success-case value, not cost over value plus cost. Template provisions are worth little in expectation when chance is about 16 percent. Gotchas: read wellstream composition after init(0) before building a stream; results.json tornado must be a list of dictionaries for the report; \mathcal is not supported in report equations; PowerShell *> writes UTF-16.

2026-10-09 — Long-reach keeper well from a platform: reach, slot and riser availability, break-even volume

Type: G (Workflow) Keywords: extended-reach drilling, torque and drag, soft-string, platform slot census, riser slots, sidetrack integrity, erosional velocity, break-even volume, EMV, technical probability, APbo, Monte Carlo Solution: Private task folder (redacted): script-backed screening (open licence and well data, document census, calibrated torque-and-drag reach model, NeqSim Beggs-and-Brill tubing and riser curves, Monte Carlo EMV), results.json and Word report with decision-support appendices; community skill neqsim-erd-reach-screening with tests. Notes: Reach, not deliverability, is the technical gate: friction calibrated to the longest historic well on the rig gives a technical probability that falls from near 1 to near 0 over a few kilometres, and the rate is capped by erosional velocity at the riser top. The break-even recoverable volume by reach is a better gate than a single EMV when volume and chance of success are unknown. Gotchas: a plateau rate above volume per year releases the whole reserve in one year and inflates value; fixed-point tubing pressure loops diverge for volatile oil and gas condensate (use bisection); PowerShell *> writes UTF-16.

2026-10-09 — Discovery maturation to a project basis: tie-back route selection with an area host, licence window and CO2 blend

Type: F (Design) / G (Workflow) Keywords: VPbo, PD01, discovery tie-back, template tie-in versus direct line, HPHT gas condensate, MEG, erosional velocity, host end-of-life, licence decision window, CO2 blend, Monte Carlo, Norwegian cash-flow tax Solution: Private task folder (redacted): script-backed screening (open licence and reserves data, forecast host profiles, NeqSim fluid, hydrate and Beggs-and-Brill tables, tank model calibrated to a forecast profile, after-tax Monte Carlo), results.json, Word report with project-basis appendices. Notes: Calibrating gas in place so that the model reproduces the forecast total avoids inventing a volume when the study data are missing. The route concept matters less than volume and gas price; the template path is the single concept-level uncertainty, expressed as a block probability and a tie-in cost at which the ranking flips. Host gas volume is not the constraint; slot, MEG, CO2 and end-of-life are. Gotchas: a CPA hydrate flash hangs above about 30 wt % MEG; Beggs and Brill raises an exception for non-positive pressure; output_parameters in results.json must be percentile dictionaries.

2026-10-09 — Appraisal-first versus go-now strategy for a deep HPHT gas-condensate tie-back with an adjacent prospect

Type: F (Design) / G (Workflow) Keywords: HPHT, shut-in tubing head pressure, 10 ksi, 15 ksi, HIPPS, gas-condensate tie-back, value of information, design-to-cost, dual-target well, APbo, VPbo, Monte Carlo, Norwegian cash-flow tax Solution: Private task folder (redacted): screening value model with Monte Carlo/VOI, NeqSim shut-in pressure and hydraulics, results.json and Word report; Java ShutInPressureEstimator (neqsim.process.mechanicaldesign.subsea) with ShutInPressureEstimatorTest. Notes: Pressure class (shut-in pressure versus 10 ksi) and a volume near break-even decide the strategy, not the line hydraulics; the dense gas column removes about a quarter of the reservoir pressure. A single-field appraisal had negative VOI, a dual-target well (prospect plus appraisal leg) kept most of the value. Post-tax value is 22 percent of pre-tax cash flow under immediate expensing, so show both. Gotchas: PowerShell redirection writes UTF-16 and unencoded JSON writes cp1252; read_file caches by path.

2026-10-09 — New subsea template for infill and a prospect: ullage-driven value, exploration VOI and fast-track screening

Type: G (Workflow) Keywords: infill, subsea template, host ullage, plateau, exploration value of information, PLX well, NCS cash-flow tax, loss refund, break-even EUR, robustness map, appendix sections, Beggs and Brill heat transfer Solution: Private task folder (redacted): four executed notebooks (host and wells, NeqSim flow assurance, value/VOI/risk, benchmarks), results.json assembled from data files, report with draft decision-document appendices; Java: FiscalParameters.norwegianCashFlowTax2022() and lossRefund in GenericTaxModel with NorwegianCashFlowTaxTest. Notes: Value of an infill on a plateau-limited host is an ullage-timing question: net new oil must subtract displaced booked barrels, and the break-even EUR per well (about 1 MSm3) is more informative than a tornado. The registry Norway model is the pre-2022 uplift regime; use the cash-flow preset (after-tax = 22 % of pre-tax, dry-hole cost 78 % refunded, so exploration break-even chance of success is low). CashFlowEngine discounts from the first year with cash flow and ignores negative production years: replicate acceleration cases outside it or compare on a positive-only series. PipeBeggsAndBrills is adiabatic unless setUseOverallHeatTransferCoefficient(true) and it throws when the outlet pressure goes negative.

2026-10-09 — Offshore platform as a tie-in hub: host capacity, host-life economics and exploration success case

Type: G (Workflow) Keywords: host ullage, tie-in, area development, host cessation, tariff principle, fixed-cost sharing, JV value, minimum economic volume, exploration EMV, value of information, hydrate CPA, power from shore CO2 Solution: Private task folder (redacted): data-acquisition and analysis scripts, results.json assembled from data files, and a host-life function with tests in the enterprise host-ullage skill. Notes: The host had free capacity; only a large gas tie-in made rich gas binding. The decisive result was commercial: under a marginal-cost tariff the incumbent JV lost value from extending the host at any fixed cost, under a pro-rata fixed-cost share it gained; without tie-ins the host ceased within a few years for any plausible fixed cost, because the incumbent decline sets the end. Check the incumbent plan against demonstrated capacity before blaming a tie-in for a binding constraint. A wrong literature value produced an apparent 8 K hydrate error; verify the benchmark first.

2026-10-04 — Multi-platform offshore oil process model with historian hold-out validation

Type: B (Process) Keywords: ProcessModel, multi-platform, Uleberg P/A split, setpoint-driven topology, GOR factor, compressor efficiency calibration, hold-out window, scrubber K utilisation Solution: Private task folder (redacted): ProcessPilot-format package with platform layout helper, historian-window workbook builder, 31-item model-versus-plant comparison, calibration loop and 6 regression tests. Notes: Three formation fluids tuned to the common paraffin/aromatic model (saturation pressure 10-12 % low). Oil, water, total gas, platform gas split, export-gas mole weight (within 0.8 %) and compressor discharge temperatures reproduced; 25 of 32 scored items pass (23 of 32 on a hold-out window). Searching the historian catalog for discriminating signals overturned a first diagnosis: gas composition and anti-surge recycle were ruled out, and the stage 3/4 machines needed an effective efficiency of 0.35-0.42, which the unfitted train motor power then confirmed within -13 to -27 %. Lesson: before widening an efficiency bound, check mole weight, recycle-valve opening and motor power. Separator gas flow meters still disagree with the gas balance (basis unresolved).

2026-10-03 — Source-locked quantitative C1 ignition-delay comparison

Type: G (Workflow) Keywords: combustion qualification, ReSpecTh, methane, shock tube, ignition delay, CRECK-S, Cantera, uncertainty, provenance Solution: examples/combustion/run_ignition_delay_qualification.py, quantitative ReSpecTh record in benchmark_catalog.json, provenance validation/tests and the optional combustion workflow; guide docs/process/equipment/multi_burner_fired_heater.md. Notes: Added 16 CC-BY-4.0 ReSpecTh observations from Aul et al. mixture 4 with exact archive and XML SHA-256 values, attribution, pressure and temperature, a maximum-pressure-rise-rate ignition marker, and point-specific evaluated standard deviations. The runner verifies the exact CRECK-S 2.0.0 bytes and executes an adiabatic constant-volume reactor without fitting. Cantera 3.2.0 produced a maximum absolute normalized residual of 1.950 and a 115.661 microsecond RMSE; 1000/2000-interval refinement differed by at most 0.25% of an observation. All points are above the CRECK-S deposit’s stated 800-1500 K range, so this is an explicit C1 extrapolation check, not an extension of mechanism validity or heater/emissions qualification. C3/C4 chemistry and heater heat-transfer/mixing evidence remain open.

2026-10-02 — Source-locked quantitative C2 JSR comparison

Type: G (Workflow) Keywords: combustion qualification, ReSpecTh, ethylene, JSR, CRECK-S, Cantera, CO, uncertainty, provenance Solution: examples/combustion/run_jsr_qualification.py, quantitative ReSpecTh record in benchmark_catalog.json, provenance validation/tests and the optional combustion workflow; guide docs/process/equipment/multi_burner_fired_heater.md. Notes: Added seven CC-BY-4.0 ReSpecTh observations for a lean ethylene JSR case with an exact archive and extracted-XML SHA-256, attribution, measurement basis and species-specific evaluated standard deviations. The runner verifies the exact CRECK-S 2.0.0 bytes, enforces exact mechanism species and executes an isothermal constant-pressure perfectly stirred reactor without parameter or emission-factor fitting. Cantera 3.2.0 produced a maximum absolute normalized residual of 1.686 across C2H4, CH4, CO and CO2. This is C2 reactor evidence only; C3/C4, heater heat transfer/mixing and plant qualification remain open.

2026-10-01 — Fail-closed combustion benchmark and mechanism qualification provenance

Type: G (Workflow) Keywords: combustion qualification, JSR, JSFR, LPG, propane, butane, CO, mechanism license, SHA-256, uncertainty, Cantera Solution: examples/combustion/benchmark_qualification.py, benchmark_catalog.json, and test_benchmark_qualification.py; guide docs/process/equipment/multi_burner_fired_heater.md. Notes: Conditions from the Dagaut-Hadj Ali LPG JSR and Sabia propane JSFR primary papers are indexed without digitizing or redistributing copyrighted profiles. Conditions-only records cannot count as quantitative validation. Quantitative data require verified redistribution rights, an exact source fingerprint, and uncertainty coverage for every value. Qualification mechanisms independently require verified SPDX rights, an exact file SHA-256 and an explicit qualification role. GRI-Mech 3.0 remains a software demonstration; its canonical backend fingerprint is not treated as a file hash or C2/C3/C4 qualification evidence.

2026-09-25 — Suspected gearbox damage on a motor-driven recompression train was coupling drive-bolt fatigue

Type: G (Workflow) Keywords: gearbox vibration, 1X step, phase change, disc coupling, drive bolt fatigue, coupling unbalance, API 671, ISO 21940-11, ISO 7919-3, ISO 20816-1, fault localisation, historian, condition monitoring dropout, RotorUnbalanceAssessment Solution: src/main/java/neqsim/process/mechanicaldesign/compressor/RotorUnbalanceAssessment.java, RotorUnbalanceAssessmentTest; private task folder (redacted) Notes: A 1X step with phase change at the gear high-speed-shaft drive-end bearing, after months of slow rise, was diagnosed as gear damage; the inspection found a fatigued coupling drive bolt and a second one failed on the other flex pack ten weeks later. Localising each step by the change of every probe at unchanged speed and load pointed to the right flex pack both times (affected-bearing / other-bearing ratio > 10); a lost fragment of ~10 g at ~57 mm is ~80x the API 671 residual unbalance, so a single fragment explains the step. Torque was a third of the coupling rating, so the fatigue load is alternating (misalignment / hub separation / torsional / structure), not steady torque. Lessons: read SAP records raised after the action on every related tag; mask historian running state on driver power (interpolation holds values through stops); an all-zero vibration feed while the driver runs is a monitoring dropout.

2026-09-22 — Router’s agent_search.py could not find a CLI-installed agent (OLGA case study)

Type: G (Workflow) Keywords: agent_search.py, router.agent.md, neqsim help, agent discovery, installed agents, ~/.neqsim/agents, sibling repo clone, olga-simulation-agent, NEQSIM_AGENTS_HOME, hermetic test Solution: devtools/agent_search.py (_installed_agents_root, new default root in _discover_roots), devtools/test_agent_search.py (InstalledAgentsRootTest, hermetic fix for CrossRepoDedupTest via NEQSIM_AGENTS_HOME override) Notes: While running an OLGA oil-water pressure-drop case through the newly-installed olga-simulation-agent (community, installed via neqsim agent install olga-simulation-agent --vscode, no local sibling clone of neqsim-community-agents), asked @neqsim help "create and run an OLGA case" to test router discovery. The router’s own documented discovery command (devtools/agent_search.py "<query>" --top 8) returned a false-positive top hit (@safety-depressuring, keyword collision on “case”) and never surfaced olga-simulation-agent at all, even though it was fully installed and already successfully invoked earlier in the same session. Root cause: _discover_roots only indexed community/enterprise agents from sibling git clones literally named neqsim-community-agents/neqsim-enterprise-agents next to the repo checkout — it had no awareness of ~/.neqsim/agents, the directory neqsim agent install (the normal, documented way most users obtain community/private agents) actually populates. The --agents-root escape hatch existed but required knowing the exact nesting level to pass (~/.neqsim, not ~/.neqsim/agents) and wasn’t referenced anywhere in router.agent.md. Fix: added ~/.neqsim/agents as a permanent default discovery root (mirroring install_agent.py’s INSTALL_DIR constant exactly), with an NEQSIM_AGENTS_HOME env-var override so tests stay hermetic. This also exposed and fixed a latent test-isolation bug: CrossRepoDedupTest’s synthetic asset-economics-agent fixture silently collided with the real asset-economics-agent already installed on the dev machine once the new default root was added — now redirected via the override. Verified end-to-end: agent_search.py "create and run an OLGA case" now ranks olga-simulation-agent #1 with no flags needed. All 12 tests pass (10 existing + 2 new regression tests). Lesson: a documented “recommended discovery tool” that only covers one of two supported installation paths (sibling clone vs. CLI catalog install) will silently mislead exactly the users who followed the documented install workflow instead of the undocumented one.

2026-09-18 — Are the MCP tools optimal for general problem solving? Probe, verdict and contract fixes

Type: E (Feature) / G (Workflow) Keywords: MCP, tools/list, tool contract, getSchema, validateInput, SchemaCatalog, SchemaChecker, schema coverage lint, unresolved inlet, misplaced properties, hydrateRiskMap NaN, RiskLevel.UNKNOWN, CPA mixing rule default, CLASSIC_TX_CPA, silent success, agent ergonomics Solution: src/main/java/neqsim/mcp/catalog/SchemaCatalog.java (9 new input schemas, hasDetailedInputSchema, normalizeToolName), SchemaChecker.java, runners/Validator.java, runners/ProcessRunner.java, runners/FlowAssuranceRunner.java, runners/FluidDefaults.java, pvtsimulation/flowassurance/HydrateRiskMapper.java, thermo/mixingrule/EosMixingRuleType.defaultForModel; tests in SchemaCatalogTest, ValidatorTest, ProcessRunnerTest, FlowAssuranceRunnerTest, HydrateRiskMapperTest Notes: Method: drive the packaged server over stdio JSON-RPC exactly as a model would (no source access), dump tools/list, then run four blind task chains (PH flash, 3-stage compression, hydrate risk, PSV sizing) and record every turn a model would have wasted. Verdict: scope is optimal (71 tools, all disciplines reachable, good response envelope with provenance/qualityGate, 0.2 s process runs) but the contract was not — 47 tools took one opaque *Json string, getSchema(run_relief) returned a placeholder pointing at a 392 KB getCapabilities that did not contain the field either, and three answers were silently wrong: a guessed process JSON ran a fully disconnected flowsheet and reported success (inlet feed never defined, parameters beside properties ignored); hydrateRiskMap returned NaN → LOW risk (HydrateRiskMapper never set setHydrateCheck(true) and mapped a failed flash to “assume safe”); and, found only while verifying the fix, every runner defaulted CPA fluids to the "classic" (SRK kij) mixing rule giving a wet-gas hydrate temperature of −0.04 °C instead of 15.7 °C. Fixes: real input schemas for all calculation tools with a CI gate that fails when a new run_* tool ships without one; validateInput({tool, input}) for any tool via a 200-line dependency-free JSON-Schema subset checker; UNRESOLVED_INLET / MISPLACED_UNIT_PARAMETERS / UNRECOGNIZED_INPUT_SHAPE as pre-flight errors and runProcess refusing success on unresolved inlets; RiskLevel.UNKNOWN + failureReasons + RESULT_NOT_AVAILABLE; EosMixingRuleType.defaultForModel. Lesson: “does the tool exist” is the wrong question for agent tooling — the probe that finds defects is “can a model that has never seen the source get a correct answer in one or two turns, and does it know when the answer is wrong”. Re-running the same four chains against the rebuilt jar: all four now either succeed correctly or fail with the exact field name.

2026-09-18 — Packaging NeqSim skills, agents and MCP as VS Code Agent Plugins

Type: G (Workflow) Keywords: agent plugins, plugin.json, mcp.json, marketplace, skills, agents, kebab-case, required_skills, frontmatter, install_agent, build_agent_plugin, SessionStart hook, editable install, version gate Solution: devtools/build_agent_plugin.py, devtools/agent_frontmatter.py, devtools/sync_agent_required_skills.py, .github/mcp/mcp.json; renames via devtools/rename_underscore_skills.py, devtools/rename_dotted_agents.py; sibling-repo changes in community-skills (folder names), enterprise-agents (enterprise- prefix), both skills repos (root setup.py) Notes: The Agent Plugins 1.0 layout maps 1:1 onto what already existed (SKILL.md folders → skills/, AGENT.md → com.github.copilot/agents/*.agent.md, MCP config → mcp.json), but three source-repo habits would have made most content vanish silently: 79 community skill folders did not equal their frontmatter name, 45 paperlab skills used underscores, and 31 core agents used dotted filenames. All three were fixed at the source and turned into lint errors rather than papered over in the packager. Skill declarations lived in three different parsers (prose Loaded skills: line, ## Loaded skills bullets, required_skills yaml) — consolidated into one module so the plugin build validates agent→skill resolution with the same code the installer uses. The packager is a thin copier with a content-hash version gate, because VS Code only updates a plugin on a version change. Python packages inside skills are not installed by the plugin; a SessionStart hook runs one pip install -e of the bundled repo root into the shared interpreter, which required a setup.py that aggregates every skills/*/*/src package (all 76 + 118 names are unique). Follow-up (same day): the first real build exposed that the flat plugin layout (skills/<skill>/, no category folders) defeated that skills/*/*/src glob, so the hook would have installed an empty distribution — setup.py now matches both depths with a flat-layout regression test. pyproject.toml’s readme = "README.md" also needed the README copied into the plugin. devtools/validate_agent_plugin.py now re-checks a built marketplace against VS Code’s silent-skip rules and runs in CI. First marketplace published to equinor/neqsim-copilot-plugin (internal): neqsim 86 skills / 36 agents, neqsim-community 79 / 52, neqsim-enterprise 119 / 76, all v0.1.0. PRs: neqsim#3793, community-skills#8, community-agents#8, enterprise-skills#14, enterprise-agents#9.

2026-09-14 — “Operations already swapped the part, is the spec right?” — a Class 150 valve that is 3 % under its Class 150 line

Type: D (Standards) / G (Workflow) Keywords: breakdown notification, malfunction report, spec verification, replacement valve, piping class, PCS, VDS, valve element table, ASME B16.5 material group, CF8M, WCB, 275 psig, 285 psig, soft seated, metal seated, trunnion ball, fire-safe, API 607, nameplate, attachment download, jetty drain valve Solution: private task folder (redacted); skill updates in enterprise-maintenance-api and enterprise-tr2000-api SKILL.md Notes: A very common breakdown-notification pattern: the field has already fitted a spare and asks the responsible discipline whether it may stay. Three transferable lessons. (1) The maintenance API cannot answer the material half of the question — there is no /materials endpoint (three probe paths all 404) and the equipment record’s manufacturer/model/part/serial fields are routinely empty. The photographs the reporter attaches carry more specification than the master record would: one nameplate close-up gave manufacturer, figure number, class/size, MWP, body/ball/stem/seat materials and design standard. Downloading them has two traps — the client accessor returns an envelope with status: ok and zero bytes, and client.base_url/api_version are None, so fetch the binary with an explicit bearer against the literal gateway URL and check the magic bytes. (2) “Class 150” is not a single number. ASME B16.5 rates by material group: carbon steel (1.1) is 285 psig at 38 °C = 19.6 barg, cast CF8M (2.2) only 275 psig = 18.96 barg. A carbon-steel Class 150 pipe class carries the 19.6 barg figure, so an honestly-marked stainless Class 150 valve sits ~3 % below the design pressure of the Class 150 piping it was just bolted into — the discriminating check is the component’s own marked MWP against the class DesignPress02, never class label against class label. (3) Read the class’s valve-element table, not just its rating. The class permitted exactly one live ball VDS, metal-seated trunnion; the generic soft-seated floating-ball spare is outside the class whatever its rating. Also: a P&ID class annotation lacks the two-digit suffix the spec API stores (A1AP → A1AP01), so a literal lookup returns zero revisions and reads as “no such class”; and older line numbers on the same drawing carry no class at all, which makes the class an inference to declare, not assert.

2026-09-12 — Chemical-injection nozzle performance, and testing a historian tag before trusting it

Type: E (Feature) / G (Workflow) Keywords: H2S scavenger, MEA-triazine, chemical injection quill, atomizer nozzle, Sauter mean diameter, Lefebvre pressure-swirl, critical Weber breakup, interfacial area, wall impingement, nozzle turndown, mixing efficiency, dose loop, signal independence Solution: neqsim.process.chemistry.injection.ChemicalInjectionNozzlePerformance + ChemicalInjectionNozzlePerformanceTest; private task folder (redacted) Notes: NeqSim could size a scavenger’s chemistry but had nothing for the hardware that decides whether the chemical ever reaches the gas, so H2SScavenger.setMixingEfficiency had to be guessed. The new class computes drop size from Lefebvre for an atomizer and from the critical-Weber aerodynamic limit for a bare quill, then interfacial area, settling velocity, distance to wall contact given off-centre insertion, and a bounded dispersion index — turning a hardware change into a number comparable against drop-size guidance. Two reusable lessons. (1) A fixed-orifice nozzle follows Q = K√ΔP, so SMD ∝ Q^-0.75: atomisation collapses on turndown, and splitting a given total rate over two nozzles in parallel is always coarser than the better single nozzle, because each sees a quarter of the ΔP. (2) Test a historian tag for independence before deriving anything from it — a controller process value labelled in concentration units tracked its own setpoint through a step change with no movement in the controller output, i.e. it was not measuring the process. A first pass had already produced a load, a stoichiometric demand and a capacity utilisation from it; all were withdrawn and replaced by the chemical-consumption totaliser, which is an independent measurement. The cheap discriminating test is: step the setpoint and watch whether the manipulated variable moves.

2026-08-24 — Solid-argon Helmholtz reference EOS and publication regression

Type: A (Property) / E (Feature) Keywords: argon, solid, Helmholtz EOS, Buckingham exp-6, FCC lattice, Debye, Einstein, anharmonicity, 16 GPa, Table 8, reference state Solution: ArgonSolidHelmholtzEquation, SystemArgonSolidHelmholtzEos, and ArgonSolidHelmholtzEquationTest Notes: Implemented the Maltby-Hammer-Wilhelmsen JPCRD 53, 043102 (2024) equation with second-order automatic derivatives and a safeguarded physical-branch volume solve. The paper does not publish its two absolute Gibbs/entropy reference offsets, so they are recovered from the authors’ Table 8 sample calculation rather than from NeqSim GERG-2008, which uses a different caloric convention. Reproducing Table 8 with the rounded parameter table requires the finite 20-shell FCC lattice sum; independently adding the printed continuum long-range integral changes the low-pressure cancellation and does not reproduce the sample. Regression covers all nine tabulated properties plus molar volume, derivative identities, and pressure inversion through 300 K and 16 GPa.

2026-08-24 — Assess a solid para-hydrogen Helmholtz EOS for NeqSim

Type: A (Property) Keywords: para-hydrogen, solid Phase I, Helmholtz EOS, Vinet, Leachman, freezing point, phase equilibrium, experimental model Solution: task_solve/2026-08-24_solid_para_hydrogen_eos_thesis_assessment/ Notes: A 2026 academic formulation adds dedicated Vinet, vibrational, and anharmonic Helmholtz terms that are not represented by the generic ComponentSolid liquid-reference path. Treat its reported property and phase-boundary deviations as author-reported until independently reproduced; the 17.64% sublimation Gibbs-consistency deviation precludes production-ready adoption. Recommended sequence: repair the SystemLeachmanEos(T, P, true) null-phase constructor defect, replace the -500 K freezing sentinel with explicit failure status, then add an opt-in experimental Phase I para-hydrogen model with coefficient/derivative audit and independent PVT, caloric, melting, sublimation, and triple-point regressions.

2026-08-20 — Gas-turbine water-wash interval planning and permanent-wash business case

Type: E (Feature) Keywords: gas turbine, compressor fouling, water wash, on-line wash, crank wash, corrected efficiency, degradation, wash interval, heat rate, fuel gas, CO2 tax, payback, GasTurbineWashPlanner, GasTurbineDegradation Solution: neqsim.process.equipment.powergeneration.gasturbine.GasTurbineWashPlanner, GasTurbineDegradation.onlineWash(double), GasTurbineWashPlannerTest Notes: Driven by an operational action asking whether to resume water washing of an export-compressor gas-turbine driver and install a permanent wash arrangement. GasTurbineDegradation previously modelled a wash only as a full reset, so an on-line wash (which recovers ~30-50 %) could not be represented, and there was no path from a plant’s trended “corrected turbine efficiency” KPI to a wash interval. The planner carries the steady-state sawtooth with partial recovery (L0 = (1-e)rT/e), integrates the extra-fuel fraction 1/(1-L)-1 over the cycle instead of evaluating it at the mean loss, prices fuel/CO2/wash/outage, optimises the interval and returns the payback of a permanent installation; lossRateFromCorrectedEfficiencyTrend is the KPI-to-model bridge. Two gotchas worth remembering: the outage/deferment term dominates any off-line crank-wash case, so report the payback excluding it as the headline; and an off-line optimum that lands on the scan upper bound means annual crank washing is already correct and on-line washing is the actual lever. Applied in a private task folder (redacted) where a measured degradation of 0.24 pp of corrected efficiency per 1000 fired hours and a measured wash recovery of 1.75 pp on a 22 MW driver were converted, via GasTurbineUnit and Standard_ISO6976, into ~1 MSm3/yr of fuel gas and ~2100 t CO2/yr.

2026-08-09 — Expose Naphtali-Sandholm tray K-value convergence work

Type: E (Feature) Keywords: distillation, Naphtali-Sandholm, MESH, fugacity, K-value, convergence, diagnostics, telemetry Solution: NaphtaliSandholmSolver.evaluateThermoForTray, DistillationColumn convergence diagnostics, and ColumnSpecificationTest.naphtaliSandholmTelemetryRecordsJacobianWork Notes: The solver retains its established two forced-root fugacity sweeps per tray evaluation but no longer assumes they converged. Additive telemetry records sweep count, evaluations whose final maximum absolute logarithmic K update remains above 1e-8, and the worst final update. The base and nearby operating points preserve the numerical trajectory and expose the inner convergence debt deterministically.

2026-08-09 — Correct Naphtali-Sandholm Jacobian work telemetry

Type: E (Feature) Keywords: distillation, Naphtali-Sandholm, MESH, Jacobian, finite difference, diagnostics, telemetry, solver benchmark Solution: NaphtaliSandholmSolver.computeJacobian, DistillationColumn convergence diagnostics, and ColumnSpecificationTest.naphtaliSandholmTelemetryRecordsJacobianWork Notes: The block-tridiagonal Jacobian numerically perturbs every variable, but each column was counted as both analytic and finite-difference work. The analytic counter now remains zero while the finite-difference counter retains the complete work count. Base and nearby operating points preserved iterations, thermodynamic evaluations, residuals, energy, mass, products, and deterministic behavior exactly.

2026-07-16 — Historical FeS wall inventory to elemental-sulfur compressor deposition

Type: E (Feature) / B (Process) Keywords: iron sulfide, FeS, mackinawite, pyrrhotite, siderite, FeCO3, carbon steel, seawater, oxygen ingress, nitrogen purge, elemental sulfur, S8, wall inventory, compressor deposit, entrained condensate, warm shaft Solution: IronSulfideWallInventory retains FeS/FeCO3/iron-oxide-equivalent mass, geometry, mineral reactivity category, and auditable exposure history. IronSulfideOxidationSource models user-configured FeS formation from bare steel/dissolved Fe2+/FeCO3/iron oxide, oxygen-transfer-limited oxidation, S0-yield uncertainty, heat, and an S8 outlet. SolidFlashDepositSource can now flash at explicit local P-T or a compressor thermal node and reports inlet-liquid evaporation. Includes focused Java tests, documentation, and examples/notebooks/IronSulfideWallSulfurDeposition.ipynb. Notes: All kinetic defaults are deliberately zero because FeS polymorph, ageing, porosity, wetting and oxygen transfer are plant-specific. run() reports a non-mutating source rate; runTransient/runExposure mutate the historical inventory. The screening case (1 MSm3/d gas, 20 ppm H2S, 10 kg/h nitrogen with 2 mol% O2) contains about 0.228 kg/h O2, giving a default FeS-to-Fe2O3 route ceiling near 0.30 kg/h S0 before yield/transfer losses. The FeS inventory is a cumulative ceiling, not an hourly source. Generated S0 is passed as existing S8, allowing the established solid flash/filter/deposit route to handle condensate transport and warm-shaft evaporation.

2026-07-10 — PEPR action: subsea gas-condensate tieback flowline liquid-accumulation / gravity-dominated screening

Type: B (Process) Keywords: flow assurance, liquid loading, gravity-dominated, liquid holdup, liquid content vs gas rate, water cut sensitivity, Beggs and Brill, PipeBeggsAndBrills, flow regime segregated stratified intermittent slug, gas-condensate flowline, subsea tieback, deliverability limit, PEPR action, screening, SystemSrkCPAstatoil Solution: private task folder (redacted) — executed notebook step2_analysis/01_utgard_liquid_loading.ipynb + standalone module step2_analysis/utgard_liquid_loading.py (identical physics) run via repo .venv python + neqsim_dev_setup (target/classes). Fluid: best-guess rich gas-condensate SRK-CPA + water (GOR ~199, CGR ~5027 Sm3/MSm3); model PipeBeggsAndBrills (21 km, ID 0.254 m, 40 incr, inlet 150 bara/50 C). Sweep gas rate 0.2-3.0 MSm3/d x water cut 0/5/20/50 %. 3 figures (fig1 gas-rate vs liquid content = primary deliverable, fig2 liquid inventory, fig3 holdup vs velocity+regime), results.json validated (0 errors), consistency PASS, mass-balance closure 0.0000 %. Notes: All inputs are documented best guesses — the two RITM operating cases, real STID geometry, and real fluid were unavailable (best-guess screening, human review required). STID live lookup requires an interactive authenticated Edge SSO session → NOT available in a non-interactive agent run; recorded as unavailable and fell back to public best-guess geometry (never fabricate a STID doc ref). Key result: the line is gravity-dominated / liquid-loading at low turndown (holdup ~16%→33% as rate falls 2.5→0.2 MSm3/d for dry gas); rising water cut is the controlling driver — lifts holdup at every rate, pushes stratified→intermittent (slugging), raises inventory ~170→>600 m3, and lowers deliverability limit 2.5→1.25 MSm3/d (WC 0→50 %). At WC >=20 % the line stays >25 % liquid across the whole feasible window; onset (holdup>25%) 0.74/0.90 MSm3/d for WC 0/5 %. GOTCHAS: (1) PipeBeggsAndBrills uses a fixed inlet pressure — if frictional dP > inlet P it throws InvalidOutputException: Outlet pressure is negative; that is a genuine deliverability limit, not a bug — catch it and report max deliverable rate (to model a fixed arrival pressure, raise inlet P per rate). (2) Reader methods: getLiquidHoldupProfile() (double[]), getFlowRegime() (SEGREGATED/TRANSITION/INTERMITTENT/DISTRIBUTED), getSegmentLiquidHoldup(i), getSegmentGasSuperficialVelocity(i), getMixtureVelocity(). (3) edit_notebook_file with editType=edit did not persist to the running kernel/disk here — the insert op is reliable; use insert-and-rerun rather than edit for ipynb cells. Codified the holdup/flow-regime sweep pattern + both gotchas into the neqsim-flow-assurance skill §4.

Type: B (Process) Keywords: TEG dehydration, rich glycol let-down, flash drum, aqua stripper, atmospheric vent, HC emission reduction, NMVOC, methane, benzene, flash split recovery to HP flare, SimpleTEGAbsorber, ThrottlingValve, Separator, SystemSrkCPAstatoil CPA, PEPR action, emissions screening Solution: private task folder (redacted) — one NeqSim script (step2_analysis/analyze_vd001_pressure.py) run via c:\appl\neqsim-venv python: wet gas + lean TEG → SimpleTEGAbsorber → rich TEG → valve → flash-drum Separator (variable P, gas recovered) → valve → near-atmospheric Separator (gas to atm vent); flash-drum pressure sweep. 3 figures, results.json (HC closure 0.0 kg/hr), consistency_report (0 critical), Word/HTML report. Notes: Screening on public representative feed/TEG basis — no plant rich-TEG composition/flow or real vessel pressures (PEPR action had no tag/WO/notification; only a ServiceNow ref). Key result: the volatile dissolved HC in rich TEG is conserved; the flash drum and the ~atmospheric vent vessel compete for it, so lowering the flash-drum pressure monotonically shifts the split from atm vent to recovered flash gas (HP flare). Modelled: lowering flash drum from assumed 6.0 → ~1.8 bara cut atm-vent HC ~92 % (~131 t/yr avoided), avoided HC recovered at the flash drum. Practical lower bound is NOT thermodynamic — it is the HP-flare header back-pressure + flash-gas compressor/flare capacity. Heavier residual HC (~338 kg/hr) stays dissolved to regeneration (separate still-vent path, out of scope). GOTCHAS: (1) from neqsim import jneqsim then attribute access (jneqsim.process.equipment...) works with the installed package; from jneqsim... import fails (jneqsim is not a top-level module). (2) Per-component mass flow: fluid.getComponent(i).getFlowRate("kg/hr") (verified). (3) Fetch PEPR with system C:\Program Files\Python312\python.exe (has pepr_client); neqsim-venv does not. (4) Mass-balance check must include the VD002 liquid residual (to regeneration), else recovered+vented ≠ dissolved looks like a huge error. Real-data follow-up (same day): Anchored to REAL Snorre B (plant 1221) data via the live chain PEPR facility-map → STID → datasheet download. STID (inst SNB) confirmed 24C-VD001 = GLYCOL FLASH DRUM, 24C-VD002 = AQUASTRIPPER OVERHEAD DRUM, 24C-VE001 = GLYCOL STILL COLUMN (system 24). Downloaded vessel mechanical datasheets (RTF, text) S6-HB-MDE-0001-020/-021/-022: 24C-VD001 = 4.0 barg / 51 °C operating, 11.7 barg/FV design; 24C-VD002 = 0.05 barg / 31 °C; still 99 % TEG, contactor 204 °C. Re-ran anchored to these: base 4.0 barg → 14.4 kg/hr (~126 t/yr) atm-vent HC; lowering toward ~0.8 barg (1.8 bara) → ~88 % cut (~111 t/yr avoided). New GOTCHAS: SNB IP.21 wildcard keyword search("*VD001*"/"*TEG*"/"24PT*") does NOT surface process tags (only Aspen system records) — resolve EXACT instrument tags via STID first, then read exact tags in tagreader. STID download_document_file(inst, doc_no, prefer_pdf=True) returns older NCS vessel datasheets as RTF (strip control words to read DESIGN/OPERATING P&T cells); mechanical datasheet points to a separate PROCESS datasheet for compositions/flows. stidapi needs system Python. Codified the live-data-first chain (plant→facility→SNB/inst_code resolution, STID datasheet recipe, historian-tag-resolution gotcha) into pepr-solve-task-agent/workflows/workflow.md.

2026-07-09 — TEG dehydration: dew-point vs circulation temporary-measure screening for still-column fouling

Type: B (Process) Keywords: TEG dehydration, triethylene glycol, regeneration still column, stripping column fouling, glycol surge drum level, lean-TEG circulation rate, water dew point, dew-point relaxation temporary measure, liquid load to still, pH stabiliser stopped, low pH glycol degradation, acidic corrosion iron salts packing fouling, reboiler temperature, SimpleTEGAbsorber, DistillationColumn, WaterStripperColumn, WaterDewPointAnalyser, SystemSrkCPAstatoil CPA, operational root cause, PEPR action, GPSA Ch.20, Kohl Nielsen Solution: private task folder (redacted) — reused community teg-dehydration-modeling skill builder (build_teg_plant) via devtools neqsim_dev_setup; one executed notebook (base case + lean-TEG circulation sweep + reboiler-T sweep + temporary-measure interpolation), 3 figures, results.json (TaskResultValidator PASS, 0 errors), Word/HTML report. Notes: Screening-level on a representative ASSUMED wet-gas basis — no live plant/STID/tagreader/SAP data (maintenance API returned HTTP 403 “Unable to retrieve SAP token”; STID site code unresolved). All numeric inputs flagged as assumptions. Key quantified result: relaxing the treated-gas water dew point by ~10 °C drops required lean-TEG circulation ~50 % (base 5000 → ~2510 kg/hr) and the rich-TEG liquid load through the still/surge drum ~49 %, while still-vent water boil-off stays ~flat (boil-off scales with absorbed water, liquid traffic scales with glycol circulation). Root cause (qualitative, literature — NOT a NeqSim calc): loss of pH control (stabiliser stopped, pH < 5) accelerates acidic TEG degradation + carbon-steel corrosion; degradation/corrosion products + salts deposit in the cooler still top → restricted traffic → surge-drum top level runaway + fan cycling + trips. GOTCHAS: (1) reuse the validated community builder by prepending its src/ to sys.path — from neqsim import jneqsim inside plant.py attaches to the JVM already started by neqsim_dev_setup.neqsim_init (jpype singleton), so devtools/target-classes JVM + community builder compose cleanly. (2) Water balance must count still vent + regen water draw + degassing flash gas; omit the flash-gas term and closure looks like ~1.9 % instead of ~0.09 %. (3) consistency_checker.py flags false “numerical_mismatch” on parametric sweeps (it groups deliberately-varied dew points / TEG rates / reboiler temps as if they should be equal) — TaskResultValidator is authoritative (PASS). (4) venv c:\appl\neqsim-venv had neqsim+matplotlib but needed nbconvert+python-docx installed. (5) Do NOT chase dew point with reboiler T — purity/dew-point gains plateau near ~204–206 °C while degradation (the root problem) accelerates. (6) TEG stripper deep-purifies lean TEG to ~99.85 wt% even when the lean-TEG feed purity input is set to 0.985.

2026-07-07 — Standards-coverage gap list: P&ID safeguarding rule set vs NeqSim MCP tools

Type: D (Standards) Keywords: standards coverage, gap analysis, API RP 14C, ISO 10418, SAFE chart, NORSOK, API 521, ISO 15156, NACE MR0175, API RP 14E, DNV-RP-O501, API 2000, MCP tool proposal, HAZOP quantification, detect-vs-quantify, runSafeChart, runDepressurization Solution: private task folder (redacted) — A9_gap_list.md (rule-family → standard → NeqSim coverage → verdict → proposed MCP tool) + tool_specs/runSafeChart.md + tool_specs/runDepressurization.md Notes: Reconciliation/analysis deliverable (no simulation notebook). Guiding principle: the P&ID analyser detects presence/topology; NeqSim should quantify adequacy — so only physics-quantifiable rules “fit the program”; drawing/tagging/layout rules (NORSOK Z-001, ISA-5.1, IEC 60079) stay in the analyser. Key finding: the SAFE-chart engine already exists in master — neqsim.process.safety.api14c.Api14cSafeChartBuilder/Api14cSafeChartItem/Api14cSafetyAnalysisTable (device presence per Api14cEquipmentCategory, getMissing()); it just lacks an MCP wrapper and a set-point pass. Likewise DepressurizationSimulator+MDMTCalculator exist (see 2026-06-25 entry). So the top-2 proposed tools (runSafeChart, runDepressurization) are low-effort wrap-and-expose, not new physics. Top gaps needing real new work: two-phase relief (API 520 omega/HEM), sour-service H₂S pp (ISO 15156), API 2000 tank venting. Deliverable built at rule-family level because the literal 152+44 analyser rules were not yet in the workspace (pending tool upload); structured to drop in per-rule IDs later.

2026-06-27 — Two-reservoir (oil + gas-condensate) field: lifetime NPV, whole-system mechanical design, and debottlenecking

Type: F (Design) Keywords: two reservoir field development, oil reservoir, gas-condensate reservoir, shared topside facility, shared PVT characterization, single E300 fluid two compositions, ProcessModel multi-area, three-stage separation, recompression, export compression, LM2500 gas turbine driver, GT loading, seawater cooling, WHRU, RVP ASTM D6377 VPCR4, stabilized oil off-spec, multi-product DCF NPV IRR profitability index, lifetime production profile, plateau optimization, bottleneck identification, API RP 14E erosional velocity, flow-induced vibration, oil wellbore likelihood of failure, debottlenecking study, separator sizing ISO 13703 API 12J, API 617 compressor, SPE-PRMS recoverable volume, Monte Carlo P10 P50 P90, tornado, ISO 31000 risk register Solution: Private task folder (redacted) — field_model.py (3-area ProcessModel: oil field / gas field / shared topside, single shared 17-component PR E300 characterization applied with two compositions; helpers build_field, extract_steady, compute_rvp, lifetime_profiles, whole_system_design, field_economics, lifetime_bottleneck, optimize_plateau, debottleneck_study), one executed main notebook (steady KPIs + lifetime NPV + whole-system mechanical sizing/cost + lifetime bottleneck tracking + plateau sweep + debottleneck ranking + Monte-Carlo/tornado), 6 figures, results.json (TaskResultValidator PASS, 12 keys incl. standards_applied), Word/HTML report. New multi-product DCFCalculator added to neqsim.process.util.fielddevelopment (11/11 tests, spotless clean). Notes: Screening NPV ≈ 13.1 bn USD (P10/P50/P90 ≈ 11.2/13.5/15.6); profitability index ≈ 4.5. Binding bottleneck is the oil wellbore (API RP 14E erosional/FIV), NOT compression — GT loading peaks at only ~12.8 % of 59.4 MW installed (2× LM2500 site-derated). Best debottleneck = export-compressor casing uprate (+10 % gas, +0.91 bn NPV) and oil-wellbore/tubing uprate (+15 % oil, +0.84 bn NPV); a 3rd GT driver is value-destructive (−0.12 bn NPV). Real intended findings (do NOT “fix”): stabilized-oil RVP 1.196 bara > 0.79 spec (off-spec — lower last-stage pressure or add stabilizer); IRR = nan is correct (no cash-flow sign change — all-positive after CAPEX); 999 % oil-wellbore LOF is the real erosional/FIV index. GOTCHAS: (1) consistency_checker.py FAILs with 2 false positives — ordinals (“payback year 1”) read as °C, and distinct percentages (surge 10 %, uprates 10/15 %, GT load 13 %, real 999 % LOF) conflated into one generic bucket; authoritative TaskResultValidator PASSES with 0 errors, so do not distort prints to satisfy the heuristic. (2) replace_string_in_file is unreliable on escaped notebook JSON source strings — edit results.json via a Python JSON round-trip and read user JSON with encoding="utf-8-sig" (BOM risk). (3) From step2_analysis/, relative cd ..\.. overshoots the slug folder — always cd to the absolute repo root before running devtools scripts. (4) Use a single shared E300 with two compositions for cross-reservoir EOS consistency rather than tuning each fluid independently.

2026-06-25 — HP 1st-stage separator fire depressurization + MDMT screening (generic NCS)

Type: F (Design) Keywords: fire case, depressurization, blowdown, API 521 5.20, MDMT, ASME UCS-66, brittle fracture, time to rupture, separator, relief, auto-refrigeration, DepressurizationSimulator, MDMTCalculator Solution: private task folder (redacted) — neqsim.process.safety.depressurization.DepressurizationSimulator + neqsim.process.safety.mdmt.MDMTCalculator; 2 notebooks (main blowdown/MDMT + benchmark/uncertainty/risk) Notes: Screening study with public/generic NCS HP separator assumptions only (no proprietary asset data). DepressurizationSimulator constructor takes backPressure and stopPressure in Pascals; builder methods chain (setFireHeatInput, setWall, setStopPressure, etc.); run() → DepressurizationResult with public List<Double> profiles. Peak/initial relief rate = max(massFlowKgPerS), NOT [0] (index 0 is the t=0 state recorded before the first relief step, so it is 0.0). MDMTCalculator enum via JClass("...MDMTCalculator$MaterialCurve"). Benchmark of NeqSim peak choked rate vs API 520 Part I closed-form passed at 0.2% max deviation. MC (N=200, full NeqSim) → 98% of cases meet the 50%-pressure-in-15-min criterion; BDV orifice dominates the tornado. Execute notebooks with jupyter nbconvert --execute (neqsim_runner CLI failed with “name ‘null’ is not defined”). Type: D (Standards) Keywords: flexible riser annulus integrity, riser annulus venting, annulus vacuum monitoring system, AVMS, armour wire CO2 corrosion, de Waard-Milliams, dry vs flooded annulus, blocked vent screening, free-volume test, nitrogen annulus test, API 17J, ISO 13628-2, API 17B, ISO 13628-11, API 17TR2, DNV-RP-F206, ISO 16530-1, NORSOK D-010, NORSOK M-506, well integrity, riser integrity safety review Solution: Private task folder (redacted) — 3 NeqSim notebooks: (1) main analysis — bore CO2 partial pressure for production vs gas-lift risers, de Waard-Milliams dry-vs-flooded armour-wire corrosion, annulus vent-capacity margin, blocked-vent time-to-pressure screening, 9-riser status table, 5×5 ISO 31000 risk register; (2) benchmark validation vs published de Waard-Milliams nomogram (+ ideal-vs-fugacity conservatism check); (3) Monte-Carlo uncertainty (N=250, full NeqSim flashes) + tornado. results.json + Word/HTML report. Anchored on an operator flexible-riser annulus test report (source document, redacted). Notes: Annulus = the flexible-riser armour-wire annulus (between pressure sheath and outer sheath) monitored by an AVMS — NOT downhole casing. Key results: production-bore pCO2 ≈ 0.42 bara, gas-lift-bore pCO2 ≈ 2.26 bara; dry (vented) armour corrosion ~50× lower than a hypothetical flooded annulus via a water-availability factor (F_W_dry ≈ 0.02); vent-capacity margin > 100× measured permeation; blocked-vent time-to-2-bara on the order of weeks; all 9 risers screened “Dry/OK”. Documentation gap flagged: source report lists “Design diffusion rate: Not found”. GOTCHAS: (1) The NeqSim Runner does NOT set __vsc_ipynb_file__ and runs with cwd = step2_analysis/, so a NOTEBOOK_DIR.parent TASK_DIR resolution writes results.json/figures into step2_analysis/ — use a _find_task_dir() that walks up to the ancestor containing both step1_scope_and_research and step2_analysis. (2) The runner regenerates runner_output/job-*/output/ duplicate notebook copies every run — delete runner_output/ before running consistency_checker.py, else it scans duplicates and reports false numerical mismatches. (3) consistency_checker.py buckets genuinely-distinct sweep values sharing a unit (vent margins 3000/750/300/150× at different permeation rates; de Waard reference points at 20/40/60 °C) into generic other/method_deviation/emission_factor groups → false-positive CRITICALs; reword prose or move sweeps to tables/results.json. (4) step3_report/generate_report.py format_benchmark_html / add_benchmark_word_table / paper formatter crash ('bool'/'str' object has no attribute 'get') if benchmark_validation contains a scalar (e.g. overall_pass) or test dicts use reference/pass instead of description/status — hardened all three to skip non-dict values and map reference→description, pass bool→status (fix applied to devtools/task_template/step3_report/generate_report.py). (5) Execution order matters: NB01 OVERWRITES figure_discussion to a fresh list, NB02/NB03 APPEND — always run 01→02→03 to land the full 8 discussions. (6) Reframed the ideal-vs-fugacity cross-check as a conservatism test (ideal Dalton pCO2 ≥ real-gas fugacity, departure grows with pressure as expected) rather than a 10% exact-match test, since the corrosion screen uses the higher ideal pCO2 → conservative. Validated: TaskResultValidator 0 errors / 0 warnings; 8 figures + benchmark + uncertainty + risk all present.

2026-06-20 — Subsea oil field reservoir-to-inlet-separator model with wells, gathering system, and Seeq live-data comparison

Type: B (Process) Keywords: reservoir to inlet separator, subsea oil field, FPSO, gas-lift wells, producer wells, gathering system, commingled flowline, Vogel IPR, drawdown, BHP, API RP 14E erosional velocity, three-phase inlet separator, inlet heater duty, Seeq SPy, digital twin, live data comparison, parity, GERG-2008 benchmark, ISO 20765-2, SRK, Monte Carlo, P10 P50 P90, tornado, ISO 31000 risk register Solution: Private task folder (redacted) — main model script (castberg_res_to_inletsep.py, 10 wells → commingled gathering → topside inlet separator + inlet heater), Seeq comparison (seeq_compare.py, offline-cached fallback with USE_SEEQ_LIVE flag + SPy signal map), GERG-2008 benchmark (benchmark_validation.py), Monte-Carlo uncertainty/risk (uncertainty_risk_analysis.py), finalize_results.py, summary notebook, and Word/HTML report. Notes: End-to-end NeqSim model: per-well Vogel IPR + drawdown → arrival P/T with API RP 14E erosional-velocity check → Mixer commingling → topside ThreePhaseSeparator + inlet heater. Validated outputs: inlet sep 13.5 barg / 55 °C, gas 4.07 MSm3/d, oil 793 m3/h, water 215 m3/h, heater duty 34.4 MW, mass-balance error 0.0%. Seeq comparison (cached signals) max abs deviation 7.84% (separator temperature), all 4 compared signals within ±10%. Benchmark SRK vs GERG-2008 inlet-gas density max dev 2.21% (PASS, <5%). Monte-Carlo n=220 full-NeqSim sims → inlet-sep gas rate P10/P50/P90 = 3.49/4.25/4.92 MSm3/d; 8-risk ISO 31000 register, overall Medium. GOTCHAS: (1) NEVER addComponent after setMixingRule (ArrayIndexOutOfBounds) — route make-up water through a separate pure-water stream into the Mixer. (2) Seeq live pull is optional/offline by default — cache realistic signals in references/seeq_cached_signals.json; a stale seed field-oil-rate value (5400 vs ~820 Sm3/h) produced a spurious parity error until corrected. (3) results.json standards_applied requires keys code/edition/status/scope with status ∈ {PASS, FAIL, INFO, N/A}. (4) The report’s format_benchmark_html requires benchmark_validation to be a dict of named test entries (each a dict with description/status), NOT a top-level block with a points list — a flat schema crashes HTML generation with 'str' object has no attribute 'get'. (5) consistency_checker.py reports known false positives when notebook discussion prose co-locates distinct quantities sharing a unit (separator pressure 13.5 barg vs benchmark point 160 bara; benchmark dev 2.2% vs ±10% band vs temp dev 7.8%) — these are different physical quantities, not inconsistencies. Validated: TaskResultValidator 0 errors / 0 warnings; notebook executes all cells with embedded figures.

2026-06-20 — Offshore FPSO inlet system / 1st-stage separator simulation-backed HAZOP

Type: D (Standards) Keywords: HAZOP, IEC 61882, NORSOK Z-013, inlet separator, first-stage separation, three-phase separator, guide-words, risk matrix, gas blow-by, hydrate margin, settle-out pressure, API 521, API 14C, HAZOPTemplate, process safety Solution: Private task folder (redacted) — HAZOP analysis script (HAZOPTemplate worksheet + 3 figures + results.json), hazop_worksheet.md, and Word/HTML report. Reuses fluid/topology/operating point from a prior RVP task on the same fluid. Notes: Simulation-backed IEC 61882 HAZOP of the first-stage inlet separation node (inlet separator + inlet heaters + gas/oil/water outlets). 12 deviations across all seven guide-words scored on a 5×5 NORSOK Z-013 matrix before/after safeguards → residual risk {2 Low, 9 Medium, 1 High, 0 Critical}. Four deviations are backed by NeqSim calculations: settle-out bubble point ≈152 barg ≫ 16 barg PSV set (MORE PRESSURE, API 521 PSV-capacity action); gas hydrate-equilibrium T ≈6.6 °C at 13.5 barg with margin sweep falling to ≈+5 °C at 10 °C feed (LESS TEMPERATURE); settle-out/downstream pressure ratios ≈6.3 (oil) and ≈3.6 (water) for gas blow-by (HIGH LEVEL); ~70 °C heater-skin headroom (MORE TEMPERATURE). GOTCHAS: (1) the requested NPV-named source task did not exist — substituted an existing RVP task on the same fluid as source of record (documented in task_spec/notes). (2) Hydrate calc must rebuild a SystemSrkCPAstatoil wet-gas fluid from light hydrate formers only + small water + mixing rule 10 + setHydrateCheck(true); TBP pseudo-components (e.g. C7_PC) are not in the CPA database and must be skipped. (3) results.json standards_applied entries require keys code/scope/status with status ∈ {PASS, FAIL, INFO, N/A}. Use the working .venv (not .venv-1, which has a corrupt numpy/jpype). Validated: TaskResultValidator 0 errors; consistency_checker PASS.

2026-06-17 — Closing the three turbomachinery capability gaps (validated dynamics, map library, geometry-based maps)

Type: E (Feature) / B (Process) Keywords: anti-surge validation, dynamic benchmark, AntiSurgeDynamicBenchmark, recycle valve transient, surge margin, compressor map library, OEM curve library, TurboMachineryChartLibrary, reference map, geometry-based map generation, mean-line, radial inflow turbine, RadialExpanderGeometryMap, blade geometry, nozzle angle, velocity ratio, Dixon Hall, Whitfield Baines, ExpanderChartKhader, CompressorChartKhader2015 Solution: New classes src/main/java/neqsim/process/equipment/expander/RadialExpanderGeometryMap.java (Gap 3 — geometry/mean-line map generator), src/main/java/neqsim/process/equipment/compressor/TurboMachineryChartLibrary.java (Gap 2 — shipped reference-map library), src/main/java/neqsim/process/util/scenario/AntiSurgeDynamicBenchmark.java (Gap 1 — reproducible dynamic anti-surge benchmark). Tests: src/test/java/neqsim/process/equipment/expander/RadialExpanderGeometryMapTest.java (5), src/test/java/neqsim/process/equipment/compressor/TurboMachineryChartLibraryTest.java (4), src/test/java/neqsim/process/util/scenario/AntiSurgeDynamicBenchmarkTest.java (3) — all 12 pass. Notes: Closed the three honest gaps identified in the capability rating vs commercial software. Gap 1 (validated dynamics) — AntiSurgeDynamicBenchmark drives the production AntiSurgeController + a real ThrottlingValve against a transparent first-order gas-path surrogate $m_{k+1}=m_k-\dot d\,\Delta t + a(u_k/100)\Delta t$; the closed loop holds the surge margin ≥0 while the open-loop reference surges (min margin <0), giving a deterministic, inspectable, tunable benchmark scenario. Gap 2 (vendor-certified map libraries) — TurboMachineryChartLibrary ships named, vendor-neutral reference maps (GENERIC_CENTRIFUGAL_3SPEED → CompressorChartKhader2015 with generated surge curve; GENERIC_CRYO_EXPANDER and GEOMETRY_RADIAL_IFR → ExpanderChartKhader) via getCompressorChart/getExpanderChart/list…Charts; Khader normalisation makes each map composition-aware/reusable across fluids. Gap 3 (geometry-based map generation) — RadialExpanderGeometryMap is a mean-line radial-inflow (IFR) turbine model that builds an ExpanderChartKhader from blade geometry (impeller diameter, radius ratio, degree of reaction, nozzle angle per IGV) using a classic incidence + nozzle/rotor loss accounting; peak η sits near $\nu_{opt}=\sqrt{1-R}\sin\alpha_2$ with the characteristic concave roll-off. GOTCHA: CompressorChartKhader2015.getPolytropicHead/Efficiency call fluid.getSoundSpeed(), so the working fluid must be TPflashed + initThermoProperties() before querying the library map (unflashed fluid → NaN head). All Java 8 compatible (explicit types, anonymous Executable/Comparator); JavaDoc complete with KaTeX; validated .\mvnw.cmd test → 12/12 pass.

2026-06-17 — Turboexpander off-design state-of-the-art enhancements (P1–P6)

Type: E (Feature) / B (Process) Keywords: turboexpander, expander performance map, ExpanderChartKhader, composition-aware, IGV control, inlet guide vanes, efficiency penalty curve, anti-surge controller, runTransient, recycle valve, seal-gas envelope, axial thrust, thrust bearing, critical speed, operating envelope, hydrate margin, OEM map ingestion, Khader 2015 Solution: New classes src/main/java/neqsim/process/equipment/expander/ExpanderChartKhader.java (P1), TurboExpanderMapIngestion.java (P4), TurboExpanderOperatingEnvelope.java (P6), src/main/java/neqsim/process/controllerdevice/AntiSurgeController.java (P3), src/main/java/neqsim/process/mechanicaldesign/expander/TurboExpanderSealGasEnvelope.java (P5); modified TurboExpanderCompressor.java (P1+P2 — chart hook, IGV control mode + efficiency penalty curve). Tests: src/test/java/neqsim/process/equipment/expander/TurboExpanderEnhancementsTest.java (6 tests), src/test/java/neqsim/process/controllerdevice/AntiSurgeControllerTest.java (2 tests) — all 8 pass. Notes: Implemented the 6 prioritized NIPs from the turboexpander review to bring the expander side to compressor-side fidelity. P1 — ExpanderChartKhader is a composition-aware 2-D map η_s,head = f(U/C, IGV) modeled on CompressorChartKhader2015: head normalized by reference-fluid sound speed² then scaled by the actual process-fluid cs², bilinear interpolation over U/C and IGV with edge clamping. TurboExpanderCompressor.computeExpanderEfficiency() uses the chart when defined, else falls back to the parabolic U/C × design-eff law. P2 — IGV promoted to a controllable DOF: setIgvControlMode(true) makes IGVopening a true input (model no longer recomputes it), coupled to setIgvEfficiencyPenaltyCurve() (η loss vs opening). P3 — AntiSurgeController extends ControllerDeviceBaseClass, reads Compressor.getDistanceToSurge(), reverse-acting PI with anti-windup drives a recycle ThrottlingValve via setPercentValveOpening() in runTransient. P4 — TurboExpanderMapIngestion builds auditable CompressorChartKhader2015 + ExpanderChartKhader from digitized OEM anchor points (certified design + Case B) with validateExpanderChart(tolerance). P5 — TurboExpanderSealGasEnvelope checks axial thrust vs ΔP and thrust-bearing limit, seal-gas heater duty (28 kW, 30 °C set-point), and critical-speed margin; converts thermodynamic feasibility into mechanical allowability. P6 — TurboExpanderOperatingEnvelope sweeps inlet-P × flow producing feasibility/surge-margin/cold-end-T/hydrate-margin grids with toJson(). GOTCHA: P3 controller fully overrides runTransient (controlled var comes directly from the compressor, not a transmitter); P5 made a standalone companion class rather than editing the 1000-line TurboExpanderCompressorMechanicalDesign. All Java 8 compatible; JavaDoc complete; validated .\mvnw.cmd test → 8/8 pass.

2026-06-17 — Offshore gas-plant turboexpander future-operation review (NeqSim capability assessment)

Type: B (Process) / G (Workflow) Keywords: turboexpander, brake compressor, off-design, cold-end validation, hydrate margin, turndown, capability assessment, NIP, state of the art, future operation review Solution: Private task folder (redacted) — step1 docs (task_spec.md, notes.md, capability_assessment.md, neqsim_improvements.md with 6 NIPs), step2 notebook (3 figures, results.json) Notes: Answered the user’s two questions: (1) Yes, NeqSim can do a detailed technical review of future operation for a single-shaft turboexpander/brake-compressor. The notebook anchors to the certified design (60.4→44.7 bara, 3.9→−11.56 °C, 6550 rpm) and colder Case B (59.45→36.5 bara, −19.84→−41.38 °C, 8160 rpm) points. Machine-specific cold-end validation: at nominal η_s=0.85 the model reproduces certified expander outlet T within ~2–3 °C (design −14.68 vs −11.56; Case B −43.18 vs −41.38), with the 0.80–0.90 band bracketing certified — the small offset tracks the assumed gas (MW 18.84 vs certified 19.1–19.5), not the model. Integrated single-shaft MapTurboExpanderCompressor (BALANCED_SPEED) gives self-balancing speed, surge distance (1.21), turndown limit (~57 bara on the illustrative map), and SRK-CPA cold-end hydrate margins (design −26.8 °C, Case B −55.1 °C below hydrate-form T → dehydration/dry-seal-gas integrity-critical). (2) 6 prioritized improvements to reach state of the art (neqsim_improvements.md): NIP-1 true expander efficiency map η=f(U/C,%N,IGV) (fixes solver instability <75% load); NIP-2 IGV as controllable input + efficiency-penalty curve; NIP-3 dynamic anti-surge control in runTransient; NIP-4 mechanical/thrust/seal-gas envelope; NIP-5 OEM map ingestion; NIP-6 multi-variable feasibility/surge/hydrate contour envelope. Scope caveat: OEM performance curves are scanned images sized far larger than the illustrative composition-aware compressor map, so integrated speed/surge numbers are methodological; the flow-independent cold-end validation is machine-specific. GOTCHA: back-calculating expander η from a small ΔT window is over-sensitive to assumed composition (gave spurious 0.54) — report model-vs-certified ΔT at nominal η instead. Notebook validated end-to-end via nbconvert (160 KB).

2026-06-17 — IGV schedule + anti-surge recycle curve fits; MapTurboExpanderCompressor.toJson/feasibility

Type: E (Feature) / B (Process) Keywords: turboexpander, IGV, inlet guide vanes, anti-surge recycle, hot-gas bypass, turndown, U/C ratio, curve fit, OperatingStatus, toJson, EC-OD, off-design Solution: src/main/java/neqsim/process/equipment/expander/MapTurboExpanderCompressor.java (added OperatingStatus enum, getOperatingStatus(), isFeasible(), toMap(), toJson()), src/test/java/.../MapTurboExpanderCompressorTest.java (added testInfeasibleTurndownPath, testToJsonReportsKeyResults — 4 tests pass), examples/notebooks/ExpanderCompressorModelComparison.ipynb (new Section 11: IGV schedule + recycle curve fits) Notes: Closed reporting gaps on the map-based machine: toJson()/toMap() now emit shaft speed, operating status (BALANCED / UNDER_POWER_SURGE / OVER_POWER_MAX_SPEED), feasibility, and power-balance residual. Notebook Section 11 adds two fitted off-design correlations for the reference single-shaft machine (design 60.4→44.7 bara, 6550 rpm; Case B 59.45→36.5 bara, 8160 rpm): (1) IGV schedule — sweeping expander throughput 100→75% shows IGVopening falls linearly with flow (0.258→0.200), confirming nozzle continuity $A\propto Q/C$; U/C and η hold near optimum to ~80% load then roll off. NOTE: curve-fit TurboExpanderCompressor speed solver hits its bounds (1000/9000 rpm) below ~75% load → restrict sweeps to the valid range. (2) Recycle correlation — make-up power below the turndown limit (55.75 bara) fitted as makeup% = a·exp(b·ΔP). Both grounded in Bloch & Soares (2001) and the TAMU Tutorial on Cryogenic Turboexpanders. Validated end-to-end via nbconvert (495 KB).

2026-04-09 — MapTurboExpanderCompressor + all expander/compressor model comparison

Type: E (Feature) / B (Process) Keywords: turboexpander, expander-compressor, companding, EC-OD, River City Engineering, Mafi-Trench, single shaft, power balance, compressor map, CompressorChartKhader2015, off-design Solution: src/main/java/neqsim/process/equipment/expander/MapTurboExpanderCompressor.java (new map-based single-shaft machine), src/test/java/neqsim/process/equipment/expander/MapTurboExpanderCompressorTest.java, examples/notebooks/ExpanderCompressorModelComparison.ipynb (compares Expander, Compressor+map, CompressorChartKhader2015, TurboExpanderCompressor, MapTurboExpanderCompressor) Notes: New MapTurboExpanderCompressor couples a real Expander + Compressor on a common shaft and solves shaft speed by power balance (BALANCED_SPEED mode) reusing the compressor performance map — the open analogue of EC-OD’s rigorous map method, complementing the existing curve-fit/IGV TurboExpanderCompressor. Notebook gotchas: (1) compressor map flow range must match the feed’s actual inlet volumetric flow (130000 kg/hr ≈ 3525 m³/hr lands mid-map; 423000 kg/hr was far off-map and gave negative head/efficiency); (2) CompressorChartKhader2015.setCurves requires strictly increasing flow per speed line — a duplicate point (3591.5, 3591.5) threw NonMonotonicSequenceException. Both integrated models agree closely (discharge 52.4 vs 52.1 bara, shaft power balanced). Notebook also includes a turndown / feasibility analysis: as expander inlet pressure falls, recovered power drops ~linearly (isentropic enthalpy-drop law) while the brake-compressor min-speed power demand stays ~constant (1.019 MW); their crossover gives the minimum feasible inlet pressure (~55.5 bara, expansion ratio ≈1.33). Below it the shaft pegs at min map speed with negative power-balance residual → compressor surge (EC-OD recycle line). Related to Bloch & Soares (2001), Agahi & Ershaghi, Whitfield & Baines (U/C≈0.7). Notebook validated end-to-end via nbconvert.

2026-06-16 — Offshore gas platform process model: lumped + high-fidelity expansion

Type: B (Process) Keywords: ProcessModel, multi-area, E300 shared-pseudo, parallel compressor trains, anti-surge per train, TEG dehydration regeneration, SRK-CPA water saturation, test separator, verification benchmark, two-fidelity flag Solution: private task folder (redacted) — eot_sla Python package (one ProcessSystem builder per area composed into a ProcessModel) plus a stand-alone TEG regeneration sub-model module Notes:

2026-06-09 — Distillation column energy-balance bug: phase-split out-stream enthalpy

Type: E (Feature / bug fix) Keywords: distillation, DistillationColumn, SimpleTray, reboiler duty, energy balance, phaseToSystem, getEnthalpy, single phase, phase type, TEG regeneration Solution: Fix in src/main/java/neqsim/process/equipment/distillation/SimpleTray.java (scalePhaseSystemToNormalizedMoles); regression test src/test/java/neqsim/process/equipment/distillation/TegRegenerationEnergyBalanceTest.java Notes: Single-stage TEG regeneration column reported reboiler duty ~6 kW and global energy imbalance ~ -20 kW (reference rig value 24.38 kW). Root cause: SystemThermo.phaseToSystem builds a single-phase out-stream by copying the selected phase’s moles into every phase slot, relying on setNumberOfPhases(1) + setPhaseType. SimpleTray.scalePhaseSystemToNormalizedMoles then re-scaled all slots and ended with init(0); init(1), which re-expanded the system to its max phases AND reset slot 0 to the default (gas) type — so getEnthalpy() summed a spurious second phase and evaluated a liquid outlet on the vapour EOS root. Gas outlets “accidentally” worked (default slot-0 type is gas). Fix: capture PhaseType getType() at method entry, then after scaling do setNumberOfPhases(1); setPhaseType(0, extractedType); init(3). Note setPhaseType(int, String) rejects names like “aqueous” via byName, so use the PhaseType enum overload. After fix: Qreb=24.57 kW, global imbalance 0.008 kW, all 90 existing distillation tests still pass.

2026-06-04 — Gravity dump-flood seawater injection: choke cavitation, free-fall & flow-assurance screen

Type: B (Process / Flow assurance) + E (Feature) Keywords: gravity injection, dump flood, seawater injection, depleted reservoir, hydrostatic head, choke cavitation, ISA-75, IEC 60534, vapour pressure, free-fall, vapour cavity, downhole choke, ICD, water hammer, Joukowsky, API 14E erosional velocity, FIV, sulphate scale, BaSO4, SrSO4, ElectrolyteScaleCalculator, subsea water treatment, GravityDumpFloodInjectionAnalyzer Solution: task_solve/2026-06-04_gravity_dump_flood_seawater_injection_choke_cavitation_fa/ (notebook step2_analysis/01_choke_cavitation_screen.ipynb) + new Java class src/main/java/neqsim/process/equipment/pipeline/GravityDumpFloodInjectionAnalyzer.java + test Notes: A 2630 m sub-seabed seawater column (ρ≈1013 kg/m³ at 2.5 °C) delivers ~261 bar static head — exceeding a depleted reservoir at 180–200 bara (static sandface ~299 bara). To land sandface on P_res the tubing-top pressure would be NEGATIVE (−61 to −81 bara) ⇒ a wellhead/seabed choke CANNOT throttle it: the column free-falls and a near-vacuum vapour cavity opens to ~617 m below seabed (P_res 200). Water true vapour pressure is ~7.5 mbar (NOT the “0.01 bar” liquid assumption), so a surface choke drives σ→0 (full flashing/cavitation/erosion/FIV). The ~100–120 bar surplus MUST be dissipated DOWNHOLE (downhole choke / ICD / small-ID tail-pipe; 6” friction only ~1.6 bar, need <100 mm ID). Water hammer on the liquid-full column ≈13 bar (6”, wave 1365 m/s, reflection 2L/a≈3.85 s ⇒ close slower). API 14E erosional velocity Ve≈3.83 m/s. Sulphate scale from seawater SO4 + formation Ba/Sr: BaSO4 SI up to 3.48 (strongly scaling) ⇒ rising backpressure over life. Implemented the missing unified GravityDumpFloodInjectionAnalyzer (head balance + free-fall/vapour-cavity onset + required downhole back-pressure + friction tail-pipe sizing + ISA-75 σ), Java 8, Serializable, 3 JUnit tests green; cross-validates the notebook (head 261.24 vs 261.44 bar). Total solution: subsea seawater treatment (filtration + electrolytic disinfection + sulphate removal, e.g. Seabox/SWIT NOV, qualified ~3000 m) as the water-quality front-end + downhole flow control. Consistency-checker FAIL is the known false-positive pattern (parametric sweep arrays + two depletion cases lumped into other).

2026-06-02 — Kent-Eisenberg validation: CO₂/H₂S partial pressures over aqueous MDEA

Type: C (PVT/thermo validation) Keywords: Kent-Eisenberg, MDEA, amine, CO2, H2S, acid gas loading, partial pressure, validation, electrolyte chemistry, SystemKentEisenberg Solution: task_solve/2026-06-02_kent_eisenberg_model_validation_co2_h2s_amine/step2_analysis/kent_eisenberg_validation.ipynb Notes: SystemKentEisenberg is MDEA-only (protonation + bicarbonate/carbonate + bisulfide, NO carbamate; for MEA/DEA use AmineSystem). MUST call chemicalReactionInit() + createDatabase(True) BEFORE setMixingRule(4), else acid gas is treated as physical Henry-law solubility and pCO₂ is over-predicted by 1–2 orders. Robust partial pressure = liquid-phase fugacity p_i = x_i·φ_i·P at a single-liquid TP flash (avoids unstable bubble-point search). Known limitation: CO₂ @ 40 °C (313.15 K) does not converge the electrolyte equilibrium solve in this build (free-CO₂ x→1, pressure-independent) — flagged non-converged and excluded; CO₂ @ 50 °C and H₂S @ 40/50 °C converge. Consistency checks use Spearman ρ≥0.98 for monotonicity (tolerant of ~2% solver noise at top loading). Literature comparison is a labelled PLACEHOLDER (Jou/Mather/Otto 1982 anchors) — deviations illustrative only; NeqSim still over-predicts pCO₂ vs open-literature MDEA range.

2026-05-30 — Agentic dynamics: pluggable integrators + EventScheduler wired into runTransient

Type: E (Feature) Keywords: dynamic simulation, runTransient, IntegratorStrategy, BDFIntegrator, implicit euler, EventScheduler, ESD trip, setpoint ramp, ProcessSystem, ProcessModel, measurement device, differential pressure transmitter, composition analyzer, flow ratio meter, transient runnable serialization Solution: src/main/java/neqsim/process/dynamics/{IntegratorStrategy,ExplicitEulerIntegrator,BDFIntegrator,EventScheduler}.java; src/main/java/neqsim/process/measurementdevice/{DifferentialPressureTransmitter,CompositionAnalyzer,FlowRatioMeter}.java; wiring in ProcessSystem.runTransient(double,UUID) and new ProcessModel.runTransient(double,UUID) / setEventScheduler / setIntegratorStrategy; tests in src/test/java/neqsim/process/processmodel/RunTransientEventSchedulerTest.java. Notes: EventScheduler must be a transient field on ProcessSystem because Runnable payloads (lambdas, anonymous classes) are not Serializable; otherwise ProcessSystem.deepCopy inside captureInitialState throws NotSerializableException on the first runTransient call. Multi-area plants: install scheduler once on ProcessModel, it is propagated to every child area. For stiff dynamics use setIntegratorStrategy(new BDFIntegrator()); check lastStepFellBack() after each step to detect Newton-divergence fallback. Skill neqsim-dynamic-simulation updated with three new sections.

2026-05-30 — Agentic synthesis: SeparationDuty + FlowsheetSynthesisEngine

Type: E (Feature) Keywords: flowsheet synthesis, separation duty, candidate topology generation, total annual cost, recovery target, purity target, unit operation selection, agentic process design Solution: src/main/java/neqsim/process/synthesis/{SeparationDuty,FlowsheetSynthesisEngine,FlowsheetCandidate}.java; tests in src/test/java/neqsim/process/synthesis/. Notes: Engine generates candidate flowsheet topologies (separator trains, columns, flash cascades) for a given SeparationDuty and scores them on TAC / recovery / energy, returning a ranked List<FlowsheetCandidate> with JSON-serializable spec for downstream agents. Reusable lesson: keep the duty spec orthogonal to the synthesis engine so future synthesis strategies (genetic, RL, LLM-guided) plug in cleanly.

2026-05-30 — Agentic automation: typed writes with rollback + audit log

Type: E (Feature) Keywords: ProcessAutomation, typed write validation, setVariableValue, transactional rollback, write history audit, diagnostics taxonomy, VALUE_OUT_OF_BOUNDS, INVALID_TYPE, READ_ONLY_VARIABLE, UNIT_CONVERSION_FAILED Solution: src/main/java/neqsim/process/automation/ProcessAutomation.java plus diagnostics in AutomationDiagnostics; tests under src/test/java/neqsim/process/automation/. Notes: setValuesWithRollback(Map updates, String unit) reverts every write in the batch if any single update fails validation. getWriteHistory() returns a timestamped audit list with old/new value, unit, status, and error category. Reusable lesson: for agentic write paths, validate before mutating and capture the pre-write value for every variable so a single failure does not leave the model in an inconsistent state.

2026-05-08 — Safety-system barrier performance analyzer

Type: E (Feature) / G (Workflow) Keywords: safety critical systems, barrier performance, major accident risk, deluge, firewater, fire gas detection, passive fire protection, SIS voting, STID, performance standards Solution: src/main/java/neqsim/process/safety/barrier/SafetySystemPerformanceAnalyzer.java; tests in src/test/java/neqsim/process/safety/barrier/SafetySystemPerformanceAnalyzerTest.java Notes: Added an analyzer that bridges the existing BarrierRegister, FireDetector/GasDetector, and neqsim.process.logic.sis.SafetyInstrumentedFunction models. Reusable lesson: assess active/passive safety-system barriers as a reporting layer over existing evidence, instruments, and SIS logic instead of creating parallel detector or SIF abstractions.

2026-05-08 — Recompressor barrier verification technical safety screen

Type: F (Design) / G (Workflow) Keywords: barrier verification, technical safety, closed flare, recompressor, HAZOP, FMEA, LOPA, bow-tie, risk matrix, STID, tagreader Solution: private task folder (redacted) Notes: Completed a separate barrier and technical-safety screening study using prior NeqSim source-term results and a real STID retrieval package curated into a barrier-linked evidence inventory. Reusable lesson: broad document retrieval should be converted into a small traceable evidence map, and current barrier credit should still be withheld until status, effectiveness, independence, proof-test/SRS evidence, event replay, and material/MDMT records are verified.

2026-05-08 — Closed-flare recompressor blowdown verification screen

Type: F (Design) / G (Workflow) Keywords: closed flare, recompressor, blowdown, trapped inventory, depressurization, MDMT, flare load, tagreader, STID, technical safety Solution: private task folder (redacted); reusable code in src/main/java/neqsim/process/safety/inventory/TrappedInventoryCalculator.java; tests in src/test/java/neqsim/process/safety/inventory/TrappedInventoryCalculatorTest.java Notes: Reused a private, consistency-checked recompressor inventory and dynamic blowdown source-term task, screened transient flare load versus documented capacity context, and generated Word/HTML report outputs. Added TrappedInventoryCalculator to bridge documented equipment/pipe volume evidence to NeqSim blowdown inputs. Reusable lesson: distinguish small transient blowdown loads from sustained closed-flare/recompression operating margin, and treat low blowdown temperatures as an MDMT follow-up until material/wall data are verified.

2026-05-07 — Confidential gas precompression inlet velocity screen

Type: B (Process) / G (Workflow) Keywords: STID, tagreader, P&ID, pressure drop, gas velocity, scrubber, compressor suction, Word report, PipeBeggsAndBrills Solution: private task folder (redacted) Notes: Retrieved route P&IDs and equipment design documents from STID, extracted line/nozzle diameters, read 24-hour historian averages with tagreader, used NeqSim gas properties plus a PipeBeggsAndBrills straight-pipe check, and generated a Word report. Reusable lesson: reject inconsistent historian unit metadata, document the adopted flow-unit interpretation, and separate measured route pressure loss from straight-pipe friction and local equipment/minor losses.

2026-05-07 — Confidential STID UniSim power extraction

Type: B (Process) / G (Workflow) Keywords: STID, UniSim, HYSYS, process simulation, total power, compressor duty, document retrieval Solution: private task folder (redacted) Notes: Searched multiple installation scopes for the newest runnable .usc case, inspected zip attachments before selecting the latest case file, ran the selected UniSim case through COM, and reported total mechanical power as compressor plus pump duty. Reusable pattern: keep STID identifiers and asset-specific power values private, while recording the selection and power-accounting method publicly.

2026-05-06 — Confidential separator carry-over cooler scaling screen

Type: B (Process) / G (Workflow) Keywords: separator carry-over, cooler scaling, anti-surge recycle, STID, tagreader, NaCl source term, compressor calibration, plate heat exchanger Solution: private task folder (redacted) Notes: Built a NeqSim gas-path screening model from separator gas outlet through a suction cooler, scrubber, and recompressor with measured fixed anti-surge recycle. STID and tagreader manifests were kept in the private task folder. Reusable pattern: model anti-surge recycle as a measured stream when compressor maps are unavailable, then evaluate NaCl risk first as a water carry-over source term and halite saturation threshold before claiming a deposition/fouling rate.

2026-04-29 — Route-level piping hydraulic builder for STID line lists

Type: E (Feature) / G (Workflow) Keywords: PipingRouteBuilder, STID, E3D, line list, piping route, pressure drop, PipeBeggsAndBrills, fittings, K-value, equivalent length Solution: src/main/java/neqsim/process/equipment/pipeline/routing/PipingRouteBuilder.java, src/test/java/neqsim/process/equipment/pipeline/routing/PipingRouteBuilderTest.java, docs/process/piping_route_builder.md Notes: Added a high-level builder that converts serial line-list rows with from/to nodes, pipe length, hydraulic diameter, wall thickness, roughness, elevation change, and fitting/valve K values into a ProcessSystem of Beggs-and-Brill pipe segments. Future STID/E3D/P&ID hydraulic tasks should extract route rows first, then use PipingRouteBuilder instead of hand-assembling pipe units; export route.toJson() for traceability and reuse.

2026-04-28 — Confidential upstream compressor pressure-drop analysis

Type: B (Process) Keywords: upstream compressor, precompression, pressure drop, STID, tagreader, piping hydraulics, separator outlet, scrubber, route hydraulics, debottlenecking Solution: private task folder (redacted) Notes: STID P&IDs/stress isometrics and a saved pressure workbook were combined with NeqSim PR gas properties and Darcy/K-value hydraulics. Base model pressure drop matched the plant snapshot within about 0.1 bar. Main reusable lesson: extract serial route rows first, preserve private source references only inside the task folder, and keep public logs to generic route-pressure-drop decisions and method choices.

2026-04-21 — Confidential scrubber performance deliverable

Type: F (Design) / G (Workflow) Keywords: scrubber, GasScrubberMechanicalDesign, operator-specific conformity, ConformityReport, mesh pad, demisting cyclones, inlet momentum, k-factor, historic peak Solution:

2026-07-04 — Compressor Sealing

Type: B (Process) Keywords: bics, components, compressor, connected, equipment, flow, floating production, model, pr78 Solution: private task folder (redacted) Notes: The unified NeqSim model replicates a confidential floating production process in a single connected ProcessSystem. Public log keeps only reusable modeling lessons; asset-specific validation metrics remain in the private task folder.

2026-04-16 — Confidential full process model with plant data integration

Type: B (Process) Keywords: compression, converged, data, full process, plant data integration, liquid recycle, recycle convergence Solution: private task folder (redacted) Notes: A confidential full process model with recycles converged. Scrubber liquids were recycled to appropriate separation stages and parallel train behavior was modeled explicitly. Exact asset names and performance figures are kept in the private task folder.

2026-04-16 — CO2 injection hydrogen accumulation in wells

Type: B (Process) Keywords: accumulation, hydrogen, injection, wells, CO2, CCS Solution: private task folder (redacted) Notes: Task folder created; analysis in progress.

2026-04-16 — CO2 injection hydrogen accumulation risk assessment

Type: B (Process) Keywords: accumulation, assessment, bara, classic, component, conditions, critical, dense, drops, equation Solution: private task folder (redacted) Notes: The confidential CO2 injection well case operates safely in dense single phase under the screened normal operating envelope.

2026-04-13 — Elemental sulfur deposition in gas turbine fuel

Type: B (Process) Keywords: approximately, assumed, causes, cooling, deposition, drop, elemental sulfur, fuel gas Solution: private task folder (redacted) Notes: NeqSim thermodynamic modelling showed a low-temperature S8 deposition risk for an assumed confidential fuel-gas case. Public log retains only the reusable JT-cooling and sulfur-solidification workflow.

2026-04-13 — FLNG feedgas process design and analysis

Type: F (Design) Keywords: achieved, amine, benzene, both, case, cases, comp, component, design, essentially Solution: task_solve/2026-04-13_flng_feedgas_process_design_and_analysis/step2_analysis/01_flng_process.ipynb Notes: 1. CO2 removal to 50 ppm achieved for both Lean and Rich cases via amine unit (modelled as component splitter). 2.

2026-04-10 — Crude oil blending into export blend

Type: B (Process) Keywords: blend, blending, crude, decreases, e300, exceed, fluid, fraction, gravity Solution: private task folder (redacted) Notes: The confidential crude blend API gravity decreases monotonically with increasing heavy-stream fraction. Public log keeps the reusable interpolation and specification-screening method; exact stream names are private.

2026-04-10 — Out of Zone Injection - NeqSim Implementation Discussion

Type: E (Feature) Keywords: discussion, implementation, injection, zone Solution: task_solve/2026-04-10_out_of_zone_injection_neqsim_implementation_discussion/ Notes: Task folder created; analysis in progress.

2026-04-09 — MIMEE NeqSim Code Review - Methane Emissions

Type: E (Feature) Keywords: code, emissions, methane, mimee, review Solution: task_solve/2026-04-09_mimee_neqsim_code_review_methane_emissions/step2_analysis/01_reference_implementation.ipynb, task_solve/2026-04-09_mimee_neqsim_code_review_methane_emissions/step2_analysis/02_detailed_method_comparison.ipynb, task_solve/2026-04-09_mimee_neqsim_code_review_methane_emissions/step2_analysis/04_gas_composition_sensitivity.ipynb Notes: Key results: deviation average percent: 38.0; deviation range percent: 8.4% to 80.1%; offshore norge equivalent temp C: 60-65; crossover temp C: ~40; neqsim factor at 20C g per m3 bar: 25.21.

2026-04-08 — Condensation UniSim NeqSim comparison

Type: D (Standards) Keywords: characterization, comparison, component, components, compositions, condensation, e300, feed Solution: private task folder (redacted) Notes: The E300 import successfully reproduces the UniSim 31-component fluid characterization in NeqSim. Molecular weights match to within 0.3% for all 12 streams tested (feed, gas, oil compositions). The feed flash vapour fraction differs by 3.

2026-04-08 — R510 SG condensation UniSim to NeqSim conversion

Type: B (Process) Keywords: condensation, conversion, r510, unisim Solution: task_solve/2026-04-08_r510_sg_condensation_unisim_to_neqsim_conversion/step2_analysis/01_unisim_neqsim_comparison.ipynb Notes: Task folder created; analysis in progress.

2026-04-08 — Early phase sprint paper

Type: B (Process) Keywords: early, paper, phase, sprint, field development Solution: private task folder (redacted) Notes: Task folder created; analysis in progress.

2026-04-07 — Compressor dry gas seal condensation analysis

Type: B (Process) Keywords: alkane, caused, causes, components, compressor, condensation, continuous, dry gas seal, envelope Solution: private task folder (redacted) Notes: A confidential dry gas seal case identified two condensation mechanisms. Public log keeps only the reusable phase-envelope, JT expansion, and seal-gas workflow; equipment tags and exact pressures remain private.

2026-04-07 — Injection compressor dry gas seal failure analysis

Type: B (Process) Keywords: compressor, failure, injection, seal, dry gas seal Solution: private task folder (redacted) Notes: Task folder created; analysis in progress.

2026-04-06 — Advanced Electrolyte EOS Development and Scientific Paper

Type: A (Property) Keywords: advanced, average, calculation, corrected, counter, cross, development, dilution, discovered, electrolyte Solution: task_solve/2026-04-06_advanced_electrolyte_eos_development_and_scientific_paper/step2_analysis/01_electrolyte_model_comparison.ipynb Notes: Discovered fundamental reference state bug in getActivityCoefficient(k): counter-ions retained in reference, weakening DH ~3x. Corrected 2-arg calculation reduces average MAE from 16.9% to 4.2%. Cross-ion Cl- W0 consistency improved from 6x to 1.

2026-04-06 — TEG Dehydration Sizing for 50 MMSCFD Wet Gas

Type: B (Process) Keywords: dehydration, mmscfd, sizing Solution: task_solve/2026-04-06_teg_dehydration_sizing_for_50_mmscfd_wet_gas/step2_analysis/01_TEG_dehydration_sizing.ipynb Notes: Task folder created; analysis in progress.

2026-04-05 — Wax Formation Models Comparison and Improvement

Type: D (Standards) Keywords: comparison, formation, improvement, models Solution: task_solve/2026-04-05_wax_formation_models_comparison_and_improvement/ Notes: Task folder created; analysis in progress.

2026-03-30 — NeqSim Library Review - High Impact Fixes and Updates

Type: E (Feature) Keywords: fixes, high, impact, library, review, updates Solution: task_solve/2026-03-30_neqsim_library_review_high_impact_fixes_and_updates/ Notes: Task folder created; analysis in progress.

2026-03-27 — Hydrogen blending in export gas quality analysis

Type: B (Process) Keywords: binding, blending, compositions, constraint, density, export, fraction, hydrogen, index, lean Solution: private task folder (redacted) Notes: Relative density — not the Wobbe index — is the binding constraint for H2 blending in the screened export-gas cases. Lean gas tolerates lower H2 addition than medium or rich gas before violating EN 16726 relative-density limits.

2026-03-27 — Process model from existing simulator

Type: B (Process) Keywords: compression, compressors, condensate, existing simulator, export, feed, model Solution: private task folder (redacted) Notes: The confidential process model runs successfully in NeqSim with PR EOS. Public log keeps the reusable simulator-conversion and compression-train workflow, while asset names and exact capacities remain private.

2026-03-26 — CO2 injection hydrogen accumulation in wells

Type: B (Process) Keywords: accumulation, bara, bulk, component, enrichment, factors, hydrogen, injection, mixing, phase Solution: private task folder (redacted) Notes: Hydrogen accumulation in the gas phase is a REAL thermodynamic phenomenon. At T=4 C the two-phase region spans 42-58 bara. H2 enrichment factors reach 5-8x (3.9-5.9 mol% H2 in gas vs 0.75% in bulk). K_H2 = 11.9 at 50 bara.

2026-03-24 — NeqSim Pseudo-Component Characterization Documentation

Type: E (Feature) Keywords: characterization, component, documentation, pseudo Solution: task_solve/2026-03-24_neqsim_pseudo_component_characterization_documentation/ Notes: Task folder created; analysis in progress.

2026-03-24 — Probabilistic NPV Monte Carlo analysis

Type: G (Workflow) Keywords: analytical, appraisal, carlo, field, function, influential, model, monte, musd Solution: private task folder (redacted) Notes: A confidential field NPV study used Monte Carlo and value-of-information screening. Public log keeps the reusable economic workflow; field name, exact valuation figures, and recommendations remain private.

2026-03-23 — FLNG Class A Concept Study Offshore Tanzania 3000m

Type: G (Workflow) Keywords: benchmarks, c3mr, capex, challenges, class, concept, contr, depth, economic, faces Solution: task_solve/2026-03-23_flng_class_a_concept_study_offshore_tanzania_3000m/step2_analysis/01_reservoir_fluid_pvt.ipynb, task_solve/2026-03-23_flng_class_a_concept_study_offshore_tanzania_3000m/step2_analysis/02_flng_process_simulation.ipynb, task_solve/2026-03-23_flng_class_a_concept_study_offshore_tanzania_3000m/step2_analysis/03_capex_economics.ipynb Notes: The FLNG Tanzania concept at 3000m water depth faces significant economic challenges. Total CAPEX of $6201M ($1772/tonne) is at the upper end of FLNG benchmarks.

2026-03-23 — CO2 injection hydrogen accumulation analysis

Type: B (Process) Keywords: accumulation, beckm, concern, confirmed, cross, engineering, feasibility, four, gerg, hydrogen Solution: private task folder (redacted) Notes: Hydrogen accumulation in the gas phase is a confirmed engineering concern for the confidential CO2 injection case, validated by four independent EOS models and cross-referenced with private feasibility-study findings.

2026-03-21 — compressor_train_analysis

Type: B (Process) Keywords: above, assessed, baseline, booster, capex, compressor, compressordesignfeasibilityreport, extends, feasibility Solution: private task folder (redacted) Notes: The booster compressor + precooler installation screened as feasible for a confidential production case. Public log keeps only the reusable compressor-feasibility workflow; asset name and exact economic uplift remain private.

2026-03-20 — H2 properties data comparison

Type: D (Standards) Keywords: aard, agrees, closely, compared, comparison, data, densitometer, density, enhanced, experimental Solution: task_solve/2026-03-20_h2_properties_data_comparison/step2_analysis/01_h2_density_comparison.ipynb Notes: Overall AARD: REFPROP=1.8408%, NeqSim Std GERG-2008=2.0790%, NeqSim GERG-2008-H2=2.2120%, NeqSim SRK=1.9948%. NeqSim standard GERG-2008 agrees closely with REFPROP (AARD=0.6221%).

2026-03-19 — Utsira Nord Floating Wind Class A Concept Study

Type: G (Workflow) Keywords: class, commercial, concept, cost, costs, current, farm, floati, floating, foundation Solution: task_solve/2026-03-19_utsira_nord_floating_wind_class_a_concept_study/step2_analysis/01_design_basis_and_site.ipynb, task_solve/2026-03-19_utsira_nord_floating_wind_class_a_concept_study/step2_analysis/02_wind_resource_and_aep.ipynb, task_solve/2026-03-19_utsira_nord_floating_wind_class_a_concept_study/step2_analysis/03_electrical_system_design.ipynb Notes: The project LCOE of ~2141 NOK/MWh (202 EUR/MWh) reflects the pre-commercial cost level of floating offshore wind. At current costs, the project requires substantial government CfD/subsidy support (~2000 NOK/MWh) to achieve economic viability.

2026-03-18 — umoe_composites_300bar_cng_tank_filling_temperature

Type: B (Process) Keywords: approximately, classic, composites, filling, hours, lean, limit, maximum, methane, mixing Solution: task_solve/2026-03-18_umoe_composites_300bar_cng_tank_filling_temperature/step2_analysis/01_filling_simulation.ipynb, task_solve/2026-03-18_umoe_composites_300bar_cng_tank_filling_temperature/step2_analysis/02_literature_review.ipynb, task_solve/2026-03-18_umoe_composites_300bar_cng_tank_filling_temperature/step2_analysis/03_benchmark_validation.ipynb Notes: Filling the Umoe Composites 300 bar Type IV tank from 20.0 to 300.0 bar at 247.5 Sm3/day takes approximately 52 hours. The maximum gas temperature reaches 31.0 C, which is within the ISO 11119-3 limit of 85.0 C with a margin of 54.0 C.

2026-03-12 — turboexpander modification evaluation for future operation

Type: B (Process) Keywords: across, barg, below, class, declining, decreases, drops, evaluation, feasible, future Solution: task_solve/2026-03-12_turboexpander_modification_evaluation_for_future_operation/step2_analysis/01_tex_performance.ipynb, task_solve/2026-03-12_turboexpander_modification_evaluation_for_future_operation/step2_analysis/02_seal_gas_condensation.ipynb, task_solve/2026-03-12_turboexpander_modification_evaluation_for_future_operation/step2_analysis/03_uncertainty_risk.ipynb Notes: TEX PERFORMANCE: Feasible 2025-2029 (inlet P > 48 barg). Infeasible from 2030 when pressure ratio drops below ~1.05. Speed DECREASES from ~6950 to ~4500 rpm — no overspeed risk. TEX provides 5-8 degC advantage over JT valve through 2029.

2026-03-11 — TPG4230 Field Development and Operations Learning Material

Type: G (Workflow) Keywords: aspects, assurance, chain, characterization, complete, compress, course, covering, covers, design Solution: task_solve/2026-03-11_tpg4230_field_development_and_operations_learning_material/step2_analysis/Module_01_Introduction_and_Value_Chain.ipynb, task_solve/2026-03-11_tpg4230_field_development_and_operations_learning_material/step2_analysis/Module_02_Flow_Performance.ipynb, task_solve/2026-03-11_tpg4230_field_development_and_operations_learning_material/step2_analysis/Module_03_Oil_Gas_Processing.ipynb Notes: The learning material covers all key aspects of field development: reservoir fluid characterization, production flow performance, oil and gas processing, flow assurance, separator design, gas compression and pipeline hydraulics, production scheduling…

2026-03-07 — Ultima Thule Field Development - Class A Study

Type: G (Workflow) Keywords: class, development, field, study, thule, ultima Solution: task_solve/2026-03-07_UltimaThule_ClassA_study/ Notes: Task folder created; analysis in progress.

2025-07-24 — Process Optimization Enhancements: NIP-03, NIP-06, NIP-08, NIP-09 Implementation

Type: E (Feature) Keywords: process optimization, rate-based absorber, SQP optimizer, multiphase flow, Hagedorn-Brown, Mukherjee-Brill, multi-variable adjuster, Onda correlation, Billet-Schultes, mass transfer, enhancement factor, damped successive substitution Solution: src/main/java/neqsim/process/equipment/absorber/RateBasedAbsorber.java, src/main/java/neqsim/process/util/optimizer/SQPoptimizer.java, src/main/java/neqsim/process/equipment/pipeline/PipeHagedornBrown.java, src/main/java/neqsim/process/equipment/pipeline/PipeMukherjeeAndBrill.java, examples/notebooks/process_optimization_enhancements.ipynb Notes: Implemented four NIPs from process optimization review. NIP-06: RateBasedAbsorber with Onda 1968 and Billet-Schultes 1999 mass transfer correlations, Hatta/Van Krevelen enhancement factors (6 tests). NIP-08: SQPoptimizer with active-set SQP for constrained process optimization (5 tests). NIP-03: PipeHagedornBrown and PipeMukherjeeAndBrill multiphase flow correlations (8 tests). NIP-09: MultiVariableAdjuster convergence fix — replaced Broyden accelerator with damped successive substitution (α=0.1) after Broyden caused oscillation/divergence due to wrong Jacobian sign. All 23 tests pass. Docs updated: absorbers.md, sqp_optimizer.md, multiphase_flow_correlations.md, adjusters.md, CHANGELOG_AGENT_NOTES.md.

2026-04-17 — cDFT Surface Tension: Kernel Correction, Mixture Extension, Paper

Type: E (Feature) Keywords: cDFT, surface tension, interfacial tension, density functional theory, kernel range, mixture IFT, Peng-Robinson, SRK, predictive, lambda correlation, acentric factor, critical correction, Miqueu, gradient theory, Parachor, Fluid Phase Equilibria Solution: src/main/java/neqsim/thermo/util/LCSF/surfacetension/CDFTSurfaceTension.java, task_solve/2026-04-17_cdft_surface_tension_paper_kernel_correction_and_mixture_extension/, neqsim-paperlab/papers/cdft_surface_tension_2026/ Notes: Implemented predictive cDFT surface tension from cubic EOS. Three proposals: (A) kernel range correction λ(ω) = 0.749 − 0.740ω reduces AAD from 41.5% to 9.5% for 8 pure components (beats GT 12.8%, Parachor 17.6%; Miqueu GT 2.2% still best). (B) Mixture solver with shared-δ tanh profiles and cross kernels achieves 37.6% AAD for CH4/C3H8 at 277.6K (vs 61.7% Parachor). (C) Paper manuscript for Fluid Phase Equilibria with 4 figures, 3 tables. 27+ tests across 6 test classes. Key insight: critical exponent correction (1−Tr)^(−0.24) essential near Tc.

2026-04-18 — Systematic “hardcoded phase 0” bug elimination in two-phase flow

Type: E (Feature/Bugfix) Keywords: two-phase flow, mass transfer, heat transfer, friction factor, Reynolds number, velocity, phase index, interphase transport, Krishna-Standart, film model, non-equilibrium, pipeline condensation, stratified flow, slug flow, droplet flow, stirred cell Solution: src/main/java/neqsim/fluidmechanics/flownode/ (multiple files across 3 rounds) Notes: Found and fixed 29 bugs across 3 audit rounds. Root cause: methods accepting int phase/int phaseNum parameters internally called getReynoldsNumber(), getVelocity(), or calcWallFrictionFactor(0, node) without passing the phase index through. These default to phase 0 (gas), making liquid-phase (1) calculations use incorrect gas-phase Reynolds numbers, velocities, and friction factors. Fixed files: NonEquilibriumFluidBoundary, ReactiveKrishnaStandartFilmModel, KrishnaStandartFilmModel, TwoPhaseFixedStaggeredGridSolver, InterphaseStratifiedFlow, TwoPhaseFlowNode, InterphaseDropletFlow, InterphaseSlugFlow, InterphaseTransportCoefficientBaseClass, MultiPhaseFlowNode, InterphasePipeFlow, InterphaseStirredCellFlow. Also added NaN guards, divide-by-zero protections, convergence fixes, and dead code cleanup. All fluidmechanics tests pass.

2026-06-18 — TwoFluidPipe transient & pressure gradient benchmark and fixes

Type: E (Feature) Keywords: TwoFluidPipe, transient, multiphase, two-fluid model, pressure gradient, benchmark, McAdams viscosity, Beggs Brill, holdup, friction factor, Haaland, pipeline Solution: src/main/java/neqsim/process/equipment/pipeline/TwoFluidPipe.java, src/test/java/neqsim/process/equipment/pipeline/TwoFluidPipeBenchmarkTest.java Notes: Fixed transient inlet BC override (isTransientMode flag), outlet pressure capture bug, improved viscosity model (McAdams quality-based harmonic averaging). Added 19 benchmark tests in 8 categories validating against PipeBeggsAndBrills and literature. Single-phase gas ratio 0.98, two-phase GLR sweep 0.81–1.33, vertical riser gravity 1.04 bar matches ρgH, D⁻⁵ diameter scaling ratio 33.7. Transient holdup evolution 0.19→0.09 after flow step-change now works correctly.

2026-03-14 — Fix IEC 60534 gas valve sizing: use standard volumetric flow (issue #1918)

Type: D (Standards) Keywords: valve sizing, IEC 60534, Cv, Kv, gas valve, standard flow, actual flow, control valve, throttling valve, choked flow, N9 Solution: src/main/java/neqsim/process/mechanicaldesign/valve/ControlValveSizing_IEC_60534.java, src/main/java/neqsim/process/mechanicaldesign/valve/ControlValveSizing_IEC_60534_full.java, src/test/java/neqsim/process/mechanicaldesign/valve/ControlValveSizingTest.java Notes: Gas valve Cv was severely underestimated (~98% too low at 50 bara) because IEC 60534 equation was applied with actual volumetric flow instead of standard volumetric flow (273.15 K, 101.325 kPa). Fix: convert Q_actual to Q_std = Q_actual × (P₁/P_std) × (T_std/T₁) / Z before applying the IEC formula. Fixed in sizeControlValveGas(), calculateFlowRateFromKvAndValveOpeningGas(), and calculateValveOpeningFromFlowRateGas() in both base and _full classes. Added regression test matching Python fluids library result (Cv ≈ 16.2 for 10000 kg/hr methane at 50 bara). Liquid valves were not affected.

2026-03-10 — Process architecture improvements: stream introspection, named controllers, connections, unified elements

Type: E (Feature) Keywords: architecture, ProcessElementInterface, ProcessConnection, MultiPortEquipment, getInletStreams, getOutletStreams, controller map, named controllers, runTransient, controller scan, getAllElements, DEXPI, topology, stream introspection, connections Solution: src/main/java/neqsim/process/ProcessElementInterface.java, src/main/java/neqsim/process/equipment/MultiPortEquipment.java, src/main/java/neqsim/process/processmodel/ProcessConnection.java, src/main/java/neqsim/process/equipment/ProcessEquipmentInterface.java, src/main/java/neqsim/process/equipment/ProcessEquipmentBaseClass.java, src/test/java/neqsim/process/processmodel/ProcessArchitectureTest.java Notes: Six backward-compatible architecture improvements motivated by DEXPI integration friction. (1) Stream introspection: getInletStreams()/getOutletStreams() on ProcessEquipmentInterface with default empty lists; overridden in TwoPortEquipment, Separator, ThreePhaseSeparator, Mixer, Splitter — all return unmodifiable lists. (2) Named controller map: addController(tag, ctrl), getController(tag), getControllers() on ProcessEquipmentBaseClass alongside legacy setController(). (3) ProcessElementInterface: unified marker extending NamedInterface + Serializable; adopted by ProcessEquipmentInterface, MeasurementDeviceInterface, ControllerDeviceInterface. (4) Controller scan in runTransient: explicit loop over system-level controllerDevices after equipment loop. (5) ProcessConnection: typed connection metadata (MATERIAL/ENERGY/SIGNAL) with ProcessSystem.connect() and getConnections(). (6) MultiPortEquipment: abstract base class for multi-inlet/outlet equipment. 173 tests passing (14 architecture + 42 DEXPI + 117 core process). Documentation updated in process_system.md, extending_process_equipment.md, controllers.md, dynamic_simulation_guide.md, CODE_PATTERNS.md, CONTEXT.md.

2026-03-10 — DEXPI review: multi-outlet nozzles, stream identity matching, namespace support

Type: E (Feature) Keywords: DEXPI, multi-outlet, nozzle, separator, stream identity, connection, pass-through, namespace, absorber, stripper, column subtype, instrument rename, DexpiStreamUtils, DexpiXmlWriter, DexpiEquipmentFactory, DexpiSimulationBuilder Solution: src/main/java/neqsim/process/processmodel/dexpi/DexpiStreamUtils.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiXmlWriter.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiEquipmentFactory.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiSimulationBuilder.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiXmlReader.java Notes: Implemented all 11 recommendations from DEXPI code review. (1) DexpiStreamUtils: shared outlet-stream resolution utility replacing duplicated reflection-based code. (2) Reflection removal: outlet access via TwoPortEquipment/Separator casts instead of Method.invoke. (3) Multi-outlet nozzles: writer creates 2 outlet nozzles for Separator, 3 for ThreePhaseSeparator. (4) Stream identity matching: connections built by matching System.identityHashCode of inlet/outlet streams; registerPassThroughStreams handles wrapper Streams that delegate getFluid(). (5) Column subtype: DexpiEquipmentFactory detects “absorb”/”strip” in DEXPI class to configure condenser/reboiler flags. (6) Namespace-aware parsing: setNamespaceAware(boolean) on builder and reader. (7) Instrument renaming: applyAutoInstrumentation now calls setName() on transmitters and controllers (ControllerDeviceBaseClass cast). 4 new tests (cyclic topology, multi-outlet separator, 2 round-trip profile); 68 tests total, all passing.

2026-03-10 — DEXPI round-trip export, cycle detection, and column support

Type: E (Feature) Keywords: DEXPI, P&ID, round-trip, export, XML writer, connection, nozzle, reverse mapping, cycle detection, distillation column, simulation results, instrument wiring, DexpiXmlWriter, DexpiXmlWriterTest Solution: src/main/java/neqsim/process/processmodel/dexpi/DexpiXmlWriter.java, src/test/java/neqsim/process/processmodel/dexpi/DexpiXmlWriterTest.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiTopologyResolver.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiEquipmentFactory.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiSimulationBuilder.java Notes: Completed 7 round-trip (DEXPI↔NeqSim) improvements. DexpiXmlWriter gains Connection/Nozzle export (buildConnections, appendNozzle, appendConnectionSystem), native equipment reverse mapping (reverseMapComponentClass maps Separator→VesselForStorage, Compressor→CompressorUnit, etc.), and simulation results export (appendSimulationResults writes temperature/pressure/flow as GenericAttributes). DexpiTopologyResolver gains hasCycle() via DFS-based detection. DexpiEquipmentFactory gains createColumn() for DistillationColumn instantiation with NumberOfTrays and FeedTray sizing attributes. DexpiSimulationBuilder instrument tag wiring replaced setName() calls with logging-based tag association (ControllerDeviceInterface/MeasurementDeviceInterface lack setName). Fixed instanceof ordering bug: Cooler extends Heater, so Cooler must be checked before Heater in reverseMapComponentClass. 15 new tests (11 in DexpiXmlWriterTest, 2 cycle-detection, 2 column-creation); 64 tests total, all passing.

2026-03-10 — DEXPI topology resolver, equipment factory, and simulation builder

Type: E (Feature) Keywords: DEXPI, P&ID, topology, nozzle, connection, equipment factory, simulation builder, mapping loader, sizing, DexpiTopologyResolver, DexpiEquipmentFactory, DexpiSimulationBuilder, DexpiMappingLoader, GenericAttribute, Kahn, topological sort Solution: src/main/java/neqsim/process/processmodel/dexpi/DexpiTopologyResolver.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiEquipmentFactory.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiSimulationBuilder.java, src/main/java/neqsim/process/processmodel/dexpi/DexpiMappingLoader.java Notes: Resolved 7 critical gaps in DEXPI implementation. DexpiTopologyResolver parses Nozzle/Connection/Equipment XML elements into a directed graph, collapses inline piping components (valves, reducers) to equipment-level edges, and produces topological ordering via Kahn’s algorithm. DexpiEquipmentFactory converts DexpiProcessUnit placeholders to real NeqSim equipment (Separator, Compressor, Pump, HeatExchanger, Heater, Cooler, Valve, Expander, Mixer, Splitter) with sizing attributes applied. DexpiSimulationBuilder is a fluent builder API: setFluidTemplate/setFeedPressure/setFeedTemperature/setFeedFlowRate/setAutoInstrument → build() returns runnable ProcessSystem. DexpiMappingLoader provides thread-safe cached loading of .properties mapping files from classpath. DexpiMetadata expanded with 10 sizing constants. DexpiProcessUnit gains sizingAttributes map and dexpiId. Equipment mapping expanded from ~30 to ~65 entries; piping component mapping from ~15 to ~28. 49 tests across 7 test classes (all passing).

2026-03-10 — DynamicProcessHelper utility for steady-state to dynamic conversion

Type: E (Feature) Keywords: dynamic, transient, simulation, DynamicProcessHelper, transmitter, PID, controller, instrument, auto-instrument, pressure, level, flow, temperature, control loop, PC, LC, FC, TC, runTransient, setCalculateSteadyState Solution: src/main/java/neqsim/process/util/DynamicProcessHelper.java, src/test/java/neqsim/process/util/DynamicProcessHelperTest.java, docs/process/dynamic-simulation.md Notes: Utility that converts a sized steady-state ProcessSystem into a dynamic simulation. Auto-creates transmitters (PT, LT, TT) and PID controllers (PC, LC, WLC) by scanning equipment and matching stream identity to downstream valves. Handles Separator, ThreePhaseSeparator, Compressor, Heater, Cooler. Convenience methods for addFlowController() and addTemperatureController(). Default PID tuning with per-type customization. Key gotcha: transmitters implement MeasurementDeviceInterface (NOT ProcessEquipmentInterface), so ProcessSystem.add(MeasurementDeviceInterface) must be used. 10 tests passing.

2026-03-10 — Implement InstrumentDesign framework

Type: E (Feature) Keywords: instrument, design, ISA, SIL, I/O, DCS, SIS, instrumentation, ISA-5.1, IEC 61508, IEC 61511, API 670, safety, compressor, separator, heat exchanger, pipeline, valve, tag number, cabinet sizing, cost estimation Solution: src/main/java/neqsim/process/instrumentdesign/ Notes: Mirrors ElectricalDesign pattern. Base class InstrumentDesign with InstrumentSpecification (ISA-5.1 data sheets) and InstrumentList (I/O counting, cost aggregation, tag generation). Equipment-specific designs for separator (PT×2 + PSH + TT + LT×2 + LSH + LSLL + ZT×2; three-phase adds interface LT + water ZT), compressor (API 617/670 suite: ~18 instruments including VT×4 vibration probes, anti-surge FT/FCV, bearing TTs, lube oil PT/PSLL), heat exchanger (auto-detects shell-and-tube/air cooler/electric heater), pipeline (pig detection ZS×2, leak detection PSLL, metering FT), and valve (ZT + ZC; safety valves add XV + ZSO/ZSC). System-level SystemInstrumentDesign aggregates across ProcessSystem and sizes DCS (~16 ch/card, ~16 cards/cab), SIS (~8 ch/card, ~8 cards/cab), and marshalling cabinets. Integrated via ProcessEquipmentInterface.getInstrumentDesign() and ProcessSystem.getSystemInstrumentDesign(). 12 tests passing.

2026-03-09 — H₂S/CO₂ Distribution Between Gas, Oil, Water — EOS Model Comparison

Type: A (Property) Keywords: H2S, CO2, acid gas, distribution, solubility, water, oil, gas, produced water, brine, salinity, SRK, PR, CPA, electrolyte CPA, chemical reactions, three-phase, salting-out, pH, NACE MR0175, sour service, model selection, decision matrix, Duan Sun, Carroll Mather, Soreide Whitson, Monte Carlo, benchmark Solution: task_solve/2026-03-09_h2s_co2_distribution_gas_oil_water_produced_water_eos_comparison/ Notes: Systematic comparison of 4 EOS models (SRK, PR, SRK-CPA, Electrolyte-CPA) across 10 scenarios for acid gas partitioning. Critical findings: (1) SRK/PR give near-zero CO₂ solubility in water — unsuitable for acid gas-water systems; (2) Only Electrolyte-CPA correctly predicts three phases (gas/oil/aqueous); (3) chemicalReactionInit() is mandatory for pH, salting-out, and ionic speciation; (4) H₂S shows retrograde solubility (max 60-70°C); (5) Water content is dominant sensitivity (1.42% swing in Monte Carlo). Benchmark: 5/5 tests PASS (13.8-25.0% deviation vs Duan & Sun 2003, Carroll & Mather 1991). Monte Carlo N=300: H₂S aqueous P10/P50/P90 = 0.51/0.92/1.35%. Decision matrix maps 12 applications to recommended models. 6 NIPs proposed (acid gas report, produced water builder, pH calculator, salting-out DB, compliance checker, model advisor).

2026-03-09 — CO2 Corrosion Analyzer with Electrolyte CPA pH

Type: E (Feature) Keywords: corrosion, CO2, pH, electrolyte CPA, de Waard-Milliams, NORSOK M-506, chemical reaction equilibrium, H3O+, carbonic acid, HCO3-, CCS, pipeline, corrosion rate, scale, FeCO3, inhibitor, brine, NaCl, severity, aqueous speciation Solution: src/main/java/neqsim/pvtsimulation/flowassurance/CO2CorrosionAnalyzer.java, src/test/java/neqsim/pvtsimulation/flowassurance/CO2CorrosionAnalyzerTest.java, examples/notebooks/CO2_Corrosion_Analysis_ElectrolyteCPA.ipynb Notes: Facade class coupling electrolyte CPA EOS (SystemElectrolyteCPAstatoil) with de Waard-Milliams corrosion model and ScalePredictionCalculator. Key insight: must call chemicalReactionInit() → createDatabase(true) → setMixingRule(10) → init(0) to enable aqueous chemical equilibrium (CO2 + 2H2O → HCO3- + H3O+). Without this, pH returns 7.0 (no H3O+ component). The analyzer auto-creates the electrolyte system, runs flash with chemical reactions, extracts rigorous pH from H3O+ activity, and feeds it into the corrosion model. Supports temperature/pressure sweeps, brine (Na+/Cl-), inhibitor efficiency, and JSON reporting. 12/12 tests passing.

2026-03-09 — Water Solubility in Gas and Liquid CO2 Phase Behaviour

Type: A (Property) Keywords: water, solubility, CO2, CPA, SRK, PR, equation of state, phase equilibrium, CCS, carbon capture, dehydration, pipeline, gas phase, liquid phase, supercritical, mutual solubility, Wiebe, Gaddy, Bamberger, Spycher, King, Song, Kobayashi, benchmark, validation, ISO 27913, ppmv, water content Solution: task_solve/2026-03-09_water_solubility_in_gas_and_liquid_co2_phase_behaviour/ Notes: Investigated water solubility in CO2 across gas, liquid, and supercritical conditions (5-200 bar, 10-80 C) using CPA EOS (SystemSrkCPAstatoil, mixing rule 10). Key findings: gas-phase water content decreases with pressure (Raoult’s law dilution), liquid CO2 has low solubility (1000-3000 ppmv), characteristic minimum at CO2 saturation pressure. Benchmark: 9/13 points within 30% tolerance, mean error 25.2%. CPA under-predicts at 60 C (40-50% error vs Bamberger data). CPA outperforms SRK/PR at high pressures. Monte Carlo (N=300): P10/P50/P90 = 2986/3616/4253 ppmv for CCS conditions — dehydration always required (100% exceed 500 ppmv ISO limit). Tornado: EOS model uncertainty dominates (1729 ppmv swing), then pressure (1068), then temperature (945). Overall risk: Medium (2 high, 3 medium, 2 low).

2026-03-09 — Sulfur Deposition Analysis

Type: B (Process) Keywords: sulfur, S8, deposition, desublimation, Joule-Thomson, JT cooling, backflow, letdown, valve, H2S, pressure reduction, solid flash, GibbsReactor, SulfurDepositionAnalyser, preheating, mitigation Solution: private task folder (redacted) Notes: Analysed elemental sulfur deposition in a backflow letdown system (70→15 bara). JT cooling gives ~-20°C outlet (JT coeff 0.46-0.58 K/bar). 100% of Monte Carlo scenarios (N=300) produce solid S8. Primary mechanism is desublimation, not chemical reaction. Air ingress (O2) contributes via H2S oxidation at Gibbs equilibrium. Preheating helps but S8 solid persists even at 100°C preheat with >0.01 ppb S8 feed. Used SRK EOS, ThrottlingValve, TPSolidflash, GibbsReactor, SulfurDepositionAnalyser. 9/9 benchmarks PASS (JT coefficients within 15%, S8 solubility within literature order-of-magnitude). Overall risk: High (5 high, 4 medium, 1 low risks).

2026-03-08 — Mercury Removal in LNG Pre-Treatment — NeqSim Chemisorption Model

Type: B (Process), F (Design) Keywords: mercury, Hg, removal, guard bed, chemisorption, CuS, sorbent, adsorber, NTU, Ergun, packed bed, LNG, pre-treatment, mass transfer zone, breakthrough, transient, bed lifetime, mechanical design, ASME VIII, cost estimation, CAPEX, OPEX, sorbent replacement, fuel gas strategy Solution: src/main/java/neqsim/process/equipment/adsorber/MercuryRemovalBed.java, src/test/java/neqsim/process/equipment/adsorber/MercuryRemovalBedTest.java, task_solve/2026-03-08_mercury_removal_lng_pretreatment/ Notes:

2026-03-08 — NeqSim-based Monte Carlo uncertainty and risk evaluation for NPV

Type: G (Workflow) Keywords: uncertainty, Monte Carlo, risk, NPV, GIP, resource estimate, tornado, sensitivity, ISO 31000, risk matrix, NeqSim simulation, SRK EOS, SimpleReservoir, Beggs & Brill, SURFCostEstimator, triangular distribution, P10 P50 P90, field development Solution: task_solve/2026-03-07_npv_calculation_of_field_development_subsea_tieback/step2_analysis/03_uncertainty_risk_analysis.ipynb, step3_report/generate_report.py (Sections 9-10) Notes:

2026-03-04 — Sulfur deposition and corrosion analysis system

Type: E (Feature) Keywords: sulfur, S8, H2S, deposition, precipitation, solubility, Gibbs reactor, Claus, FeS, corrosion, NACE, sour gas, solid flash, TPSolidflash, SulfurDepositionAnalyser, GibbsReactor, SO2, pipeline, subsea, onshore Solution: src/main/java/neqsim/process/equipment/reactor/SulfurDepositionAnalyser.java, src/test/java/neqsim/process/equipment/reactor/SulfurDepositionAnalyserTest.java, examples/sulfurtask/SulfurDepositionAnalysis.ipynb, docs/chemicalreactions/sulfur_deposition_analysis.md Notes:

2026-03-07 — CNG tank filling and emptying temperature estimation (workflow test)

Type: B (Process) Keywords: CNG, tank, filling, emptying, depressurization, pressurization, temperature, wall temperature, MDMT, heat transfer, transient wall, VesselDepressurization, X80 steel, energy balance, Churchill-Chu, natural convection Solution: task_solve/2026-03-07_cng_tank_filling_and_emptying_temperature_estimation/step2_analysis/CNG_Tank_Temperature_Estimation.ipynb Notes:

2025-07-17 — CNG tank temperature estimation improvements and Jupyter notebooks

Type: E (Feature) Keywords: CNG, tank, filling, emptying, depressurization, VU-flash, heat transfer, Churchill-Chu, Gnielinski, natural convection, mixed convection, transient wall, VesselDepressurization, temperature estimation, MDMT Solution: src/main/java/neqsim/process/equipment/tank/VesselDepressurization.java, examples/CNGtankmodelling/CNG_FillingSimulation.ipynb, examples/CNGtankmodelling/CNG_EmptyingSimulation.ipynb, examples/CNGtankmodelling/CNG_GasProperties_HTC.ipynb Notes:

2026-03-01 — Well mechanical design and cost estimation system

Type: F (Design) Keywords: well, subsea, casing, tubing, mechanical design, NORSOK D-010, API 5CT, cost estimation, drilling, completion, barrier verification, WellMechanicalDesign, WellDesignCalculator, WellCostEstimator Solution: src/main/java/neqsim/process/mechanicaldesign/subsea/WellMechanicalDesign.java, WellDesignCalculator.java, WellCostEstimator.java, src/test/java/.../WellMechanicalDesignTest.java Notes:

2026-03-01 — Task log and context system created

Type: E (Feature) Keywords: context, documentation, workflow, onboarding, task-solving Solution: CONTEXT.md, docs/development/TASK_SOLVING_GUIDE.md, docs/development/TASK_LOG.md Notes: Created a 3-file context system to make repo-based task solving faster:


2026-03-10 — Electrical design: equipment-specific classes and system integration

Type: E (Feature) Keywords: electrical design, separator, heater, cooler, pipeline, heat tracing, cathodic protection, system electrical design, load list, transformer sizing, emergency generator Solution: src/main/java/neqsim/process/electricaldesign/separator/SeparatorElectricalDesign.java, heatexchanger/HeatExchangerElectricalDesign.java, pipeline/PipelineElectricalDesign.java, system/SystemElectricalDesign.java Notes:

2026-04-16 — Review Dynamic Process and Control Functionality

Type: G (Workflow) Keywords: dynamic simulation, transient, PID controller, MPC, HYSYS Dynamics, K-Spice, safety chain, HIPPS, ESD, blowdown, VU-flash, DynamicProcessHelper, ProcessEventBus, alarm, runTransient, control, measurement device, valve, split-range, override, bumpless transfer, sequence control, SFC, distillation dynamics, heat exchanger dynamics, rotor inertia Solution: task_solve/2026-04-16_review_dynamic_process_and_control_functionality/step1_scope_and_research/analysis.md Notes: Comprehensive 45-feature comparison across 7 categories against 5 commercial simulators. NeqSim scores 63/90 (70%) vs HYSYS 79/90 (88%). Leads in 8 areas (VU-flash, safety chain, Monte Carlo risk, auto-instrumentation, water hammer, DEXPI export, event bus, specialised analysers). 10 NIPs proposed with 4-phase roadmap. Key gaps: explicit Euler only (no implicit/adaptive), no dynamic HX/column, no bumpless transfer, no split-range/override, no sequence control.


2026-07-06 — Gas-export piping route: inlet separator → export (STID + TR2000 → pipe ID → NeqSim ΔP)

Type: B (Process) Keywords: STID line tag decode, TR2000 PCS pipe-size, internal diameter, PipeBeggsAndBrills, gas export pressure drop, line sizing, route tracing Solution: private task folder (redacted) — reusable method in enterprise-stid-live-lookup + enterprise-tr2000-api skills Notes: STID line tag encodes NPS (size field = inches × 100) + TR2000 PCS name; resolve PCS get_pcs_pipe_sizes → internal Ø = OuterDiam − 2·WallThickness. Line lengths are NOT in STID/TR2000 — take off from isometrics (doc_type WM) or plot plan (doc_type XF). NeqSim PipeBeggsAndBrills (PR EOS) for single-phase gas ΔP per segment. Added “line tag → PCS → internal diameter” recipe to both skills. Model validated vs last-week historian data via tagreader: Equinor PI tag naming <PLANT>.<STID_TAG>[/Y/PRIM] (piwebapi source from STID plant ims field); resolve historian tag by *STID_TAG* search + prefer /PRIM channel; check get_units (barg vs bara, FT tag may be mbar orifice dP); validate against process PT/TT not densitometer-cabinet slipstream tags. Model reproduced measured compressor discharge T at a plausible polytropic efficiency. Added the historian-tag-resolution recipe to enterprise-plant-data skill.


2026-07-09 — PEPR action: verify anti-surge control line on an injection compressor (EE)

Type: B (Process) Keywords: PEPR action solve, anti-surge control line, surge margin, compressor chart, distance to surge, recycle power penalty, energy efficiency, compressor operating window, surge test, gas sample molweight Solution: private task folder (redacted) — reusable method in neqsim-compressor-antisurge-recycle + neqsim-compressor-operating-window-check skills Notes: PEPR action (read-only via pepr-client, Entra ID SSO on MAIN thread) described injection/recompression compressors run on the anti-surge control line (continuous ASV recycle) with the machine far right of the theoretical control line — an EE opportunity to move the control line and close the ASV. NeqSim method: Compressor + CompressorChartGenerator.generateCompressorChart("normal curves", n) (stand-in for the vendor map), getSurgeFlowRate()/getDistanceToSurge(), getPolytropicFluidHead(), getPower("kW"), getOperatingPoint(). Control line = surge flow ×(1+margin). Recycle power penalty = P_shaft·recycle_frac. Turndown sweep gives the throughput where recycle becomes genuinely necessary (op point reaches control line). MW sweep on a fixed chart shows why a gas sample is needed (head ∝ 1/MW). GOTCHAS: (1) c:\appl\neqsim-venv does NOT have pepr-client — use system C:\Program Files\Python312\python.exe to fetch PEPR, and the neqsim-venv for nbconvert. (2) Under nbconvert, __vsc_ipynb_file__ is undefined and cwd = repo root, so a os.getcwd()-based TASK_DIR resolves to the repo root — derive TASK_DIR from PROJECT_ROOT / "task_solve" / "<slug>" instead. (3) neqsim.thermodynamicoperations package is lowercase. (4) Build task .ipynb with nbformat raw-string cells (preserves LaTeX backslashes); hand-written .ipynb JSON with string source got its sources wiped on execute. Screening-level; requires field surge test + API 617/692 review.


2026-07-09 — PEPR action: retune two PID level controllers with dynamic simulation

Type: B (Process) Keywords: PEPR action solve, PID tuning, level control, integral time, deadband limit cycle, dynamic simulation runTransient, separator level, LevelTransmitter, controller MANUAL hold, IAE, valve reversals, historian trend, TEG dehydration Solution: private task folder (redacted) — reusable method in neqsim-dynamic-simulation skill; NeqSim ControllerDeviceBaseClass.setDeadBand added + ControllerDeviceDeadBandTest Notes: PEPR action (read-only via pepr-client, Entra ID SSO on MAIN thread) asked IOC Process Control to retune two averaging level controllers on a gas-treatment/TEG system: one with too-short integral time (level cycling into the next stage), one with an SP-PV deadband causing a valve limit cycle. Workflow: fetch PEPR (system C:\Program Files\Python312\python.exe, has pepr-client/stidapi/tagreader; neqsim-venv does NOT) -> STID live lookup (stidapi.Plant/Tag) to identify the system/tags, level ranges, and the historian source (plant .ims field = PI Web API server) -> tagreader.IMSClient(<ims>,'piwebapi') 30-day SP/PV/OP trends to confirm the reported oscillation and get real operating points -> NeqSim dynamic model. Historian tag naming (this DCS): <PLANT>-<TAG>_YR=SP, _Z.X=PV(filtered), _nofilter=PV(raw), _Z.Y=OP(valve %); classify suffixes by value-range (SP constant, PV near SP, OP 0-100). Search needs leading+trailing wildcards *TAG*. NeqSim dynamic level loop (GOTCHA): build steady with ops.run(), THEN setCalculateSteadyState(False) on the separator + all valves and sep.setLiquidLevel(sp) before ops.runTransient(dt) — if steady-state mode is left on the level stays pinned at 0.5 and the controller never acts. Liquid-outlet level valve is setReverseActing(False) (level up -> open); Cv is auto-derived from the steady solve. Add a pressure controller on the gas valve to hold vessel P so the level loop is isolated. Deadband: ControllerDeviceBaseClass had no deadband — added native setDeadBand/getDeadBand (freeze output + integral while |error|<=deadband; both PID branches; 4-test ControllerDeviceDeadBandTest, 19 controller tests still pass). The study (installed pip package) emulates it identically via controller.setMode(MANUAL) inside the band / AUTO outside (bumpless). Result: longer Ti cut PV variability ~21% + IAE ~24% + valve reversals; removing the deadband cut the valve limit-cycle p-p ~63% + IAE ~68%, matching the ~8% p-p limit cycle in the historian. Both PEPR proposals supported; screening-level (representative separator geometry, confirm on-panel parameter changeability, log in IOC database).


2026-08-03 - Native Venturi DP flow meter (ISO 5167-4 + ISO/TR 11583 wet gas)

Type: E (Feature) Keywords: venturi, differential pressure, flow meter, ISO 5167-4, ISO/TR 11583, wet gas, over-reading, Lockhart-Martinelli, Chisholm, expansibility, measurement device, orifice, DP flow Solution: src/main/java/neqsim/process/measurementdevice/VenturiFlowMeter.java + src/test/java/neqsim/process/measurementdevice/VenturiFlowMeterTest.java; documented in docs/process/equipment/measurement_devices.md Notes: Ports a Python-side DP-to-flow calculation into a native StreamMeasurementDeviceBaseClass device. Dry gas uses the ISO 5167-1 general equation with the ISO 5167-4 Venturi expansibility, NOT the ISO 5167-2 orifice approximation 1-(0.41+0.35*beta^4)*dp/(kappa*p1), which downstream models were incorrectly applying to Venturi tubes — it over-predicts mass flow by 0.03-9% as dp/p1 grows. Upstream pressure p1 comes from the stream and tau=(p1-dp)/p1. Wet gas adds the full ISO/TR 11583 method (iterative C, Phi, CCh, n, X, Fr_gas), with the liquid load from the stream phase split, a separator-test ratio, an absolute rate, or the clause 6.4.5 third-tapping pressure loss. Annex A Example 1 reproduces to every digit printed in the standard (q=5.319258 kg/s, X=0.125, Fr=3.53111, Fr_th=12.6629, C=0.975418, n=0.483916, CCh=4.08694, Phi=1.235513); Example 2 (pressure-loss route) is pinned as a regression baseline. Two items had to be read off the rendered PDF because text extraction mangled them: the 6.4.5 inverse is X = [-ln(1-Y/Ymax) / (35 exp(-0.28 Fr_gas/H))]^(4/3), and the extra 6.4.5 density-ratio limit is an UPPER bound rho_g/rho_l <= 0.09 (a lower bound would invalidate the standard’s own Example 2 at 0.05). GOTCHAS: (1) the venturi expansibility returns NaN for kappa <= 1 or dp >= p1 where the orifice form stayed finite — guard call sites that relied on that; (2) a Venturi gas meter must read the gas-phase density, not system.getDensity("kg/m3") which is the volume-weighted mixture density — identical for single-phase gas but wrong for wet gas; (3) ISO/TR 11583 Eq. (4) replaces the discharge coefficient with a generic value tending to 1, so on a meter with an in-service calibrated Cd it discards the calibration and can shift the reading several percent in either direction — setUseWetGasDischargeCoefficient(false) keeps the calibrated Cd and applies only the over-reading factor; (4) the TR states it covers a single liquid and “is not intended for the oil and gas industry”, so lumping aqueous + hydrocarbon into one effective liquid is an extension beyond it, and de Leeuw (1997) remains the industry alternative for low gas/liquid density ratios.


2026-08-03 - de Leeuw (1997) wet-gas Venturi correlation added to VenturiFlowMeter

Type: E (Feature) Keywords: de Leeuw, venturi, wet gas, over-reading, Lockhart-Martinelli, Chisholm, Froude number, ISO/TR 11583, measurement device, DP flow, Steven 2002 Solution: src/main/java/neqsim/process/measurementdevice/VenturiFlowMeter.java (WetGasCorrelation.DE_LEEUW) + 7 new tests in src/test/java/neqsim/process/measurementdevice/VenturiFlowMeterTest.java; documented in docs/process/equipment/measurement_devices.md Notes: Adds R.N. Steven (2002), “Wet gas metering with a horizontally mounted Venturi meter”, Flow Measurement and Instrumentation 12, 361-372, Eqs. (12)-(14) as a second wet-gas correlation alongside ISO/TR 11583. de Leeuw uses the same Chisholm-form over-reading equation Phi = sqrt(1 + CCh*X + X^2) and the identical gas densiometric Froude number as ISO/TR 11583 (verified algebraically equal to Steven’s Eq. (12), so the existing calcFroudeNumber is reused as-is), but its own exponent n = 0.41 for Fr,gas <= 1.5 and n = 0.606*(1 - exp(-0.746*Fr,gas)) for Fr,gas >= 1.5 — no diameter-ratio term, unlike ISO/TR 11583’s beta-reduced exponent. The exponent’s negative sign (-0.746) was verified against a rendered page image rather than trusted from pymupdf.get_text(), since PDF minus-sign stripping had already caused one bug in the ISO/TR 11583 work. Key design choice: de Leeuw never replaces the discharge coefficient (unlike ISO/TR 11583 Equation (4)), so setUseWetGasDischargeCoefficient has no effect on it and it is inherently safe to use with an in-service-calibrated Cd. Below the paper’s Fr,gas >= 0.5 lower bound the class extrapolates the 0.41 plateau rather than returning NaN (consistent with the class’s never-throws convention) and flags it via getValidityViolations() / isWithinDeLeeuwValidityRange(); a beta far from de Leeuw’s own 0.401 reference geometry is flagged as an informational extrapolation note rather than blocked. Only the correlation itself was added to NeqSim; it has not been made a downstream production model’s default (comparison pending sign-off) — a scratch screening script built the REAL Java class (not a Python reimplementation) at four wet gas meters on a downstream platform model and found de Leeuw and ISO/TR 11583 agree to within 0.34% at all of them, with de Leeuw reporting no numeric validity failure where ISO/TR 11583 is formally outside its own rho_gas/rho_liquid > 0.02 limit (two of the four meters, both low-pressure/high-carry-over).


2026-08-04 - ISO 5167 differential-pressure flow meters: shared base class + orifice, nozzle, cone, wedge

Type: E (Feature) Keywords: ISO 5167-1, ISO 5167-2, ISO 5167-3, ISO 5167-5, ISO 5167-6, orifice plate, nozzle, ISA 1932, long radius nozzle, throat-tapped nozzle, Venturi nozzle, cone meter, wedge meter, Reader-Harris/Gallagher, expansibility, discharge coefficient, differential pressure, DP flow, measurement device Solution: src/main/java/neqsim/process/measurementdevice/{DifferentialPressureFlowMeter,ExpansibilityModel,OrificeFlowMeter,NozzleFlowMeter,ConeFlowMeter,WedgeFlowMeter}.java + re-parented VenturiFlowMeter.java; 32 new tests across {Orifice,Nozzle,Cone,Wedge}FlowMeterTest.java; documented in docs/process/equipment/measurement_devices.md; recorded in CHANGELOG_AGENT_NOTES.md Notes: Extended the single-device VenturiFlowMeter (ISO 5167-4 only) into full coverage of ISO 5167-1’s five device-specific parts. Architecture decision (asked of and confirmed by the user before implementing): split by geometry, not by ISO part number, because (a) ISO 5167-3 alone holds four different devices, one of them literally called a “Venturi nozzle”; (b) the cone and wedge meters have no physical throat bore — beta is the primitive (derived from cone diameter or wedge gap height via ISO 5167-5 Formula (2) / ISO 5167-6 Formula (3)) and d = D * beta is derived, the reverse of orifice/nozzle/Venturi where d is physical and beta is derived; (c) only three expansibility-factor families exist and they cut across parts (ORIFICE for ISO 5167-2, ISENTROPIC shared by all four ISO 5167-3 nozzle sub-types plus ISO 5167-4 and ISO 5167-6, CONE for ISO 5167-5). Result: one abstract DifferentialPressureFlowMeter base (geometry stored as pipe diameter D + throat diameter d with beta = d/D always recomputed on demand, so cone/wedge just store their derived equivalent throat; differential pressure incl. transmitter linkage; gas density/isentropic exponent/dynamic viscosity readers, each overridable; a generic Reynolds-number fixed-point solve qm <-> Re,D that converges on the first pass for Re-independent devices; mass/actual-volume/standard-volume/getMeasuredValue accessors) plus one concrete class per device with only its own calcDischargeCoefficient(beta, reynoldsD) + getExpansibilityModel() + getValidityViolations(). VenturiFlowMeter was re-parented onto this base with zero public API change — its wet-gas machinery (ISO/TR 11583 + de Leeuw) stayed untouched and Venturi-only; all 20 pre-existing tests pass unmodified, confirming the refactor is behavior-preserving. Formula provenance, all verified against rendered ISO page images (not trusted from pymupdf/pypdf text extraction alone, per the standing rule from the earlier Venturi/de Leeuw work — PDF text layers reliably mangle exponents and strip minus signs): Reader-Harris/Gallagher (1998) orifice discharge coefficient (ISO 5167-2:2022 Formula (4), all three tapping arrangements’ L1/L2’ pairs, plus the D < 71.12 mm small-pipe correction term); ISA 1932 (Formula (5)), long radius (Formula (10)/(11), Re,D or Re,d form), throat-tapped (Formulae (13)/(14), piecewise in Re,d with the 3.0e6 branch point) and Venturi nozzle (Formula (19), Reynolds-independent) discharge coefficients (ISO 5167-3:2022); cone meter C = 0.82 constant + expansibility Formula (4) 1 - (0.649 + 0.696 beta^4) dP/(kappa p1) (ISO 5167-5:2022, a scanned PDF with no text layer at all — every value read from a rendered page image); wedge meter C = 0.77 - 0.09 beta + the beta-from-h/D arccos formula (ISO 5167-6:2022 Formula (3)), which is self-validating against the standard’s own worked examples (h/D = 0.5 -> beta = sqrt(0.5) = 0.70711, beta = 0.5 -> h/D ~= 0.298 - both reproduced exactly in WedgeFlowMeterTest) and pinned in a test. The cone expansibility formula was independently cross-checked against ISO 5167-5 Annex A’s own tabulated value (beta = 0.6000, kappa = 1.3, p2/p1 = 0.9 -> epsilon = 0.9431) and matches to 4 decimal places. Deliberately out of scope, documented for the user to decide separately: (1) neqsim.standards.gasquality.Standard_AGA3’s own Reader-Harris/Gallagher implementation has real bugs (the (0.0188+0.0063A)beta^3.5 term is missing its (1e6/ReD)^0.3 factor, the tapping term (0.043+0.080e^-10L1-0.123e^-7L1)(1-0.11A)beta^4/(1-beta^4) is entirely missing, the downstream term uses beta^4 instead of beta^1.3 plus a spurious factor, Reynolds number is built on the orifice diameter instead of the pipe diameter, and the D < 71.12 mm correction is missing) — found incidentally while verifying OrificeFlowMeter against the same ISO 5167-2:2022 Formula (4), left untouched because the user wants to raise a maintainer issue rather than have an agent silently rewrite a neqsim.standards class; AGA 3 also differs from plain ISO 5167-2 in some particulars (flange-tapping-only, its own reference conditions) so “delete and delegate to OrificeFlowMeter” is not automatically correct. (2) ISO/TR 11583 wet-gas correction was not generalized from Venturi to the orifice (the TR does cover orifice plates in its Clause 7, with its own C/epsilon/limits) — deferred as optional future work. (3) ISO 5167-6 wedge meter’s Kd2 imperial-unit convenience conversion (Annex B) was not added — low value, easy to add later if a vendor datasheet needs it. Validation: 52 new/updated tests (8 Orifice + 7 Cone + 7 Wedge + 10 Nozzle + 20 Venturi unchanged) plus the full pre-existing neqsim.process.measurementdevice package (98 tests total) all pass; spotless:check clean.


2026-08-04 - ISO/TR 11583 Clause 7 wet-gas correction added to OrificeFlowMeter

Type: E (Feature) Keywords: ISO/TR 11583, orifice, wet gas, over-reading, Lockhart-Martinelli, Chisholm, Froude number, permanent pressure loss, measurement device, DP flow Solution: src/main/java/neqsim/process/measurementdevice/OrificeFlowMeter.java (WetGasCorrelation.ISO_TR_11583) + protected DifferentialPressureFlowMeter.setReynoldsNumberPipe(double) + 9 new tests in src/test/java/neqsim/process/measurementdevice/OrificeFlowMeterTest.java (17 total, up from 8); recorded in CHANGELOG_AGENT_NOTES.md. Notes: Follow-up to the same-day ISO 5167 DP-flow-meter architecture work, giving OrificeFlowMeter feature parity with VenturiFlowMeter’s wet-gas support, using the orifice-specific ISO/TR 11583 Clause 7 method (as opposed to Clause 6 used for Venturi). Liquid load can be supplied as an absolute rate (setLiquidMassFlowRate), a mass ratio (setLiquidToGasMassRatio), read from the stream’s own phase split (setLiquidFromStream(true)), or — when 0.5 <= beta <= 0.68 and no rate/ratio is given — derived from a measured permanent pressure loss via the 7.5.5 route (setPressureLoss). Key formula difference from Venturi’s Clause 6: Clause 7.5.2 states the discharge coefficient is never replaced (always the plain Reader-Harris/Gallagher equation at the gas-only Re,D), unlike Venturi where ISO/TR 11583 Equation (4) does replace C (requiring the useWetGasDischargeCoefficient guard there) — so orifice needs no such toggle. The Chisholm exponent formula also differs: no diameter-ratio term (n = 0.214 for Fr,gas < 1.5, n = (1/sqrt(2) - 0.3/sqrt(Fr,gas))^2 for Fr,gas > 1.5), unlike Venturi’s beta-reduced exponent. All formulas (including the orifice-specific exponent and the ISO 5167-2:2022 Formula (7) dry pressure-loss ratio used by the 7.5.5 route) were verified against rendered ISO/TR 11583 and ISO 5167-2 page images rather than trusted PDF text extraction — the first OCR-based transcription of the dry pressure-loss formula was wrong (missing a (1 - C^2) term inside the square root), caught only by re-rendering the page as an image. Because the orifice’s dry discharge coefficient depends on Re,D (unlike Venturi’s constant Cd field), the wet-gas iteration re-solves both flow and Re,D each pass; a new protected DifferentialPressureFlowMeter.setReynoldsNumberPipe(double) lets the subclass record the converged Re,D onto the base class so getReynoldsNumberPipe()/getReynoldsNumberThroat() reflect the final wet-gas operating point rather than staying pinned at the dry-gas seed value from the initial solve (a real bug caught by a self-consistency test that recomputed the discharge coefficient at the reported Re,D and found a ~0.008% mismatch before the fix). Deliberate design tradeoff: rather than promoting Venturi’s liquid-density/liquid-ratio machinery into the shared base class, the same logic was duplicated directly in OrificeFlowMeter to keep the change self-contained and low-risk. Validation: All 8 pre-existing OrificeFlowMeterTest cases pass unchanged (default correlation is NONE); 9 new wet-gas tests added (17 total) covering dry-mode fallback, both Chisholm exponent branches, the over-reading formula, “C never replaced” self-consistency, setLiquidFromStream on a real two-phase stream, validity in-range/out-of-range, and the 7.5.5 pressure-loss route. Full neqsim.process.measurementdevice package (146 tests) regression-clean; spotless:check clean.

2026-08-07 — Self-heating / spontaneous ignition of combustible liquid in porous insulation

Type: E (Feature) Keywords: self-heating, spontaneous ignition, lagging fire, glycol soaked insulation, oil soaked lagging, Frank-Kamenetskii, Semenov, critical thickness, critical ambient temperature, induction time, basket test, EN 15188, ASTM E2021, thermal runaway, fire with no ignition source Solution: src/main/java/neqsim/process/safety/selfheating/ + tests in src/test/java/neqsim/process/safety/selfheating/; skill .github/skills/neqsim-self-heating-ignition/ Notes: Self-heating is size-dependent (generation ~ r^3, loss ~ r^2), so the answer is a critical thickness, not just a critical temperature. RunawayReactionAnalyzer is lumped-adiabatic and CANNOT answer this — it has no spatial conduction. Equilibrium/GibbsReactor is also the wrong tool: it reports complete oxidation of any hydrocarbon at ambient temperature, so it gives the fuel but not the hazard; ignition is purely kinetic. Activation energy and volumetric pre-factor must come from hot-storage/basket testing (BasketTestRegression), never from thermodynamics. Use the wetted (not dry) insulation conductivity and the hot process surface (not ambient air) as the boundary temperature. Also fixed a latent data bug found on the way: TEG and DEG carried water’s dHf and CO2’s dGf as placeholders in COMP.csv/COMP_EXT.csv, so every glycol Gibbs/reactive-flash result was wrong.

2026-08-07 — Flow-accelerated corrosion and in-situ pH in closed heating-medium loops

Type: E (Feature) Keywords: flow accelerated corrosion, FAC, magnetite dissolution, wall thinning at welds and bends, heating medium loop, cooling medium, WHRU tube leak, boiler feedwater, in-situ pH, pH at temperature, alkaline margin, amine buffer, DEA protonation, pKa temperature dependence, Cr-Mo upgrade, P11, erosion-corrosion distinction Solution: src/main/java/neqsim/process/corrosion/{FlowAcceleratedCorrosion,AmineBufferedPH}.java + tests; skill .github/skills/neqsim-flow-accelerated-corrosion/ Notes: Two traps. (1) A laboratory pH is measured on a COOLED sample; neutrality is pH 7.00 at 25 C but ~5.85 at 150 C, so a hot-system pH must never be judged against 7 — use the alkaline margin pH(T) - pH_neutral(T). For a buffered fluid the pH shift equals the pKa shift exactly. (2) NORSOK M-506 is CO2 corrosion and does NOT apply to a CO2-free closed loop; FAC is also NOT erosion-corrosion (electrochemical dissolution under mass-transfer control vs mechanical particle impingement) — same locations, different mitigation. Also: wall shear goes as v^1.75, so a “3% velocity exceedance” is a ~13% shear exceedance — always report shear. Re rises ~70% from 100 to 150 C at constant velocity (viscosity halves), so damage should concentrate at the hot end — a cheap testable prediction. Magnetite fines are 1-10 um, so an 80 um filter removes essentially none. Found and fixed: the DEAprot reaction had full stoichiometry AND full constants but USEREACTION=0, so DEA-buffered systems silently returned no acid-base equilibrium.

2026-08-17 — Riser hydrostatics: section inclination from atan2 on the axial cell length

Type: E (Feature) Keywords: severe slugging, riser, pipeline-riser, section inclination, elevation profile, atan2 asin, hydrostatic head, Taylor bubble film, slug unit cell, falling film, Brotz, Taitel Barnea, TwoFluidPipe, mesh convergence, limit cycle Solution: TwoFluidPipe.createSections inclination + TwoFluidPipe.taylorBubbleFilmHoldup(...); benchmark SevereSluggingExperimentalBenchmarkTest Notes: Two coupled defects, both found by driving a pipeline-riser severe-slugging case and asking why the answer moved with the mesh. (1) Geometry. Each section was built with inclination = atan2(elev[i+1] - elev[i], secDx), but secDx is the cell length along the pipe axis - it is the finite-volume dx and it sums to length - so the elevation change across a cell is its vertical component and the angle is asin(dz/secDx). atan2 treats secDx as a horizontal run, so a vertical cell came out at 45 degrees and a riser only ever delivered sin(45) = 71% of its hydrostatic head. The error is maximal exactly at a riser and vanishes on a gentle line (dz << dx makes asin ~ atan), which is why it survived every existing test. The initial-pressure estimate twenty lines above already used the correct sine form, avgSinTheta = totalElevChange / length - the two halves of the same method disagreed. The second half of the same defect: the last section always got inclination 0 because there is no elev[i+1], so the top riser cell was horizontal and the lost fraction of the riser was 1/nRiserCells, i.e. mesh dependent. It now inherits its neighbour. (2) Closure. calculateSlugHoldupOLGA took the Taylor-bubble film from calculateAnnularHoldupOLGA, whose momentum balance is written for a film dragged upward by the gas core, so gravity and wall shear sit on the same side of tau_i = tau_wL + rhoL*g*sin(theta)*delta and it has no root in a riser: the iteration walked to its delta/D = 0.2 clamp, returned a film hold-up of 0.64, drove the slug-length ratio to its clamp and pinned every riser cell at 0.90. A riser held permanently liquid-full cannot drain and therefore cannot slug at all. The film is now also bounded by liquid conservation across the slug unit with a gravity-drained film (Taitel & Barnea 1990), H*(v_TB + 9.916*sqrt(g*D*|sin(theta)|*(1 - sqrt(1-H)))) = H_LS*(v_TB - v_m), which is monotone in H so the root is unique at any inclination and is found by bisection; the smaller of the two bounds is used. Lesson: when a riser result moves with the mesh, print the section inclinations before touching a closure - a vertical pipe reporting 45 degrees is the tell. Second lesson: a five-minute hand solve of the new closure at riser conditions predicted a film hold-up near 0.13 and an average near 0.43, and that is what the implementation returned; do the arithmetic before writing the code. Validation: On the 19.81 m flowline + 14.94 m riser benchmark, closure-development runs moved the steady riser hold-up from a constant 0.90 clamp to a 0.74-0.65 profile and produced 81-97 kPa pressure swings. The independent targets are approximate direct digitizations of the green experimental SS trace in Tengesdal Figure 5-6 (printed page 91, physical PDF page 111): 98 +/- 5 kPa and 38 +/- 2 s; the black Model trace is excluded. These are benchmark values, not plant values. The current SevereSluggingExperimentalBenchmarkTest is disabled pending #2909/#2911: the coupled route does not progress, and the legacy route sets isTransientOutletBackflowClamped(). Any clamped trajectory is invalid regardless of apparent amplitude, period, or mass closure. The earlier amplitude improvement remains diagnostic development evidence, not model qualification.

2026-09-03 - addTBPfraction2 silently discarded its boiling point

Type: E (Feature) Keywords: addTBPfraction2, addTBPfraction3, addTBPfraction4, boiling point, normal boiling point, Tb, TBP fraction, pseudo-component, specific gravity, Riazi-Daubert, Watson characterization factor, Kw, PNA, paraffin naphthene aromatic, calcTB, PedersenSRK, phase envelope insensitive to boiling point, gas chromatograph, DHA Solution: SystemThermo.calculateDensityFromBoilingPoint / calculateMolarMassFromDensityAndBoilingPoint / addTBPfraction2,3,4 + new calculateDensityFromBoilingPointAndWatsonK; tests TBPBoilingPointInversionTest Notes: A user reported that a phase envelope did not move when the boiling point of a C10/C11 pseudo-component was changed from 447 K to 10 K. Root cause: addTBPfraction2 did not store the boiling point at all - it inverted the selected TBP model’s own calcTB for a density and passed that to addTBPfraction. For the Pedersen models calcTB has no density term below 540 g/mol (2e-6*M^3 - 0.0035*M^2 + 2.4003*M + 171.74), so the inverse problem has no root. The bisection then degenerated in a way that hid it: f_mid was identical every iteration, so the best-point tracker if (abs(f_mid) < abs(fmidOLD)) fired only on iteration 0 and froze the answer at the first midpoint, 0.5*(0.5+1.5) = 1.0. Every boiling point returned exactly 1.000 g/cm3, so Tc/Pc/omega were bit-identical for Tb = 10 K and Tb = 1000 K - and 1.000 is also physically wrong for a C10 cut (~0.734), so the base case was biased too. PedersenPR2 (Soreide) is the only model whose calcTB depends on density, and even there it is non-monotonic with a minimum near 429 K, so bisection was invalid: below the minimum there is no root (it silently returned the frozen value) and above it there are two (it returned the wrong one). Replaced with the closed-form inversion of Riazi-Daubert (1980) M = 4.5673e-5*Tb^2.1962*SG^-1.0164 (Tb in Rankine) - a pure power law, strictly monotonic, single valued, no iteration. Added guards: a resulting SG outside 0.5-1.3 now throws instead of returning a fabricated number, so an inconsistent (M, Tb) pair is rejected rather than silently accepted. Three further latent defects found on the way. (1) addTBPfraction4 called setBoilingPoint on the shared TBP model and never cleared it; since TBPBaseModel.calcTB short-circuits on getBoilingPoint() > 0, that one boiling point leaked into every fraction added afterwards - now pinned for the duration of the call and cleared in a finally. (2) The molar-mass solve returned a stale best rather than the converged root and never checked its bracket - now brackets properly and throws with the attainable range. (3) The 7-arg addTBPfraction silently discards the caller’s acentric factor (overwritten by the value back-calculated from the EOS m parameter), and its JavaDoc claimed Pc in Pa when it is stored as bara - documented, not yet changed, because fixing it is behaviour-changing. Engineering lesson: M and Tb are not independent. Specifying both over-determines the cut; the only freedom left is SG, and SG has almost no leverage on Tb (0 K for PedersenSRK, 11 K for Cavett, 85 K for Lee-Kesler over SG 0.6-1.0), so the inversion is ill-posed by construction. The well-conditioned direction is the other one: solving for M given (SG, Tb) works because M has hundreds of K of leverage, which is why addTBPfraction3 was sound all along. If the PNA split is known, do not go through molar mass at all - the Watson factor Kw = (1.8*Tb)^(1/3)/SG encodes exactly the paraffinic/naphthenic/aromatic character that a generic M-based correlation cannot represent, and reproduces pure-component SG to 0.1-0.4 % against 5-7 % for Riazi-Daubert. Riazi-Daubert is a single-valued surface over (M, Tb), so two cuts with the same M and Tb must get the same SG - nC9 and propylcyclohexane sit at nearly the same M and Tb but differ by 11 % in density, and the correlation cannot separate them. Its residuals are systematic (paraffins +5 to +6.7 %, naphthenes +0.2 %, aromatics -1.9 to -4.9 %), i.e. it is implicitly calibrated to naphthenic character. Added calculateDensityFromBoilingPointAndWatsonK for that route. Validation: TBPBoilingPointInversionTest 10 tests (monotonic response to Tb, non-physical input rejected, Watson K within 1 % on four pure components, no boiling-point leak, unattainable Tb rejected, plus two tests that execute the documentation examples verbatim). TBPBoilingPointCorrelationTest 7/7 and TBPfractionModelTest 13/13 unchanged. Full neqsim.thermo.** = 1209 tests, 0 failures. Reference values are read from COMP.csv itself rather than typed in, so the verification tracks the database. Also corrected two documentation examples that had the argument order reversed (addTBPfraction(name, moles, density, molarMass)), which would have meant a 730 g/mol molar mass and a specific gravity of 7.5.

2026-09-07 - GasTurbine returned unburned fuel as its exhaust in driven-load mode

Type: E (Feature) Keywords: GasTurbine, addDrivenLoad, runPowerDemand, power-demand mode, combustion exhaust, CO2 emission, carbon balance, emission factor, combustFuel, calcStoichiometricOxygenDemand, element database, pseudo-component, TBP fraction, characterised fluid, E300, combustion air, fuel gas, thermal efficiency, driven compressor, tie-back CO2 profile, STEA, external profiles, fmu-steaclient, CashFlowEngine, breakeven gas price, unit development cost Solution: GasTurbine.buildExhaust / GasTurbine.carbonAndHydrogen; test src/test/java/neqsim/process/equipment/powergeneration/GasTurbineCombustionTest.java Notes: Found while building an incremental-CO2 profile for a subsea tie-back, where the host facility’s fuel and flare are booked against the facility rather than the field, so the emissions had to be modelled from the incremental compression duty rather than read from a production forecast. (1) GasTurbine.run branches: with no driven loads it runs the Brayton path and sets its outlet stream to combustion exhaust via combustFuel; with addDrivenLoad/setRequiredPower it takes runPowerDemand, which sized the fuel correctly but then set outStream to thermoSystem.clone() - the unburned fuel. So getOutletStream() returned two physically different things depending on a mode the caller may not have thought about, and an emission calculation on a load-driven turbine read the fuel’s own CO2 content instead of the combustion products: 60.6 kg/hr against a true 1089.6 kg/hr, a factor of 18 low, with no error and a plausible-looking number. The right guard here is a carbon balance on the fuel: CO2 out must equal fuel carbon in, and that check is what exposed it. runPowerDemand now builds the exhaust the same way the Brayton path does. (2) The combustion stoichiometry asked getElements().getNumberOfElements("C") of every hydrocarbon, and the pseudo-components of any characterised reservoir fluid are absent from the element database, so a real fluid aborted the whole solve with Element:getNumberOfElements - Input C component not in element database. Atom counts are now estimated from molar mass with the paraffinic relation when the database has no entry; Element.getElementNames() returns null in that case, so it can be detected without catching an exception. (3) Found and deliberately not fixed: Fluid.create("combustion air") is nitrogen 0.78084 / oxygen 0.20946 / CO2 0.033 / water 0.1 - an unnormalised set that works out to 2.9 mol% CO2 and 8.9 mol% water against atmospheric 0.04 % and about 1 %, so every turbine exhaust CO2 is inflated by air-borne CO2 (75 % in this case). Correcting it to atmospheric values breaks GasTurbineTest.testRun with “net power must be positive”: the Brayton net power balance is marginal and depends on the humid air as a working fluid, which is a deeper problem than the task warranted. Left alone, with the air-borne CO2 subtracted explicitly where the exhaust is read. Practical guidance also added to the neqsim-power-generation skill: build the fuel from real named components (renormalising an export gas onto nitrogen, CO2, methane..n-hexane captures over 99.8 mol%), and always cross-check the exhaust against a carbon balance. Validation: GasTurbineCombustionTest 2 tests - exhaust CO2 must close the carbon balance on fuel plus combustion-air CO2 to within 2 %, and a fuel containing a TBP pseudo-component must burn rather than throw. Full neqsim.process.equipment.powergeneration package 63 tests, 0 failures, including the pre-existing GasTurbineTest (12) that the reverted air-composition change had broken. In the study that found this, the fixed exhaust read and an independent carbon balance agreed to 0.0 % at 1089.6 kg/hr.

2026-09-14 — Gas-to-LNG value chain concept evaluation (offshore hub, dense-phase export, FLNG)

Type: F (Design) Keywords: LNG, liquefaction, SMR, FLNG, dense phase, cricondenbar, gas export hub, gas injection conversion, iceberg scour, trenching, TEG dehydration, hydrate, DNV-ST-F101, NGL extraction, CAPEX, AACE Class 5, Monte Carlo Solution: private task folder (redacted); reusable outputs: .github/skills/neqsim-lng-liquefaction/, .github/agents/lng-value-chain.agent.md, devtools/py_to_notebook.py Notes: Seven-notebook single-basis fan-out — one module holds the fluid and the design feed rate, every downstream stage reads it and never re-derives it, so the report sections cannot drift. Four NeqSim defects found and fixed, three of them silent factor errors caught only by independently computed anchors: phase-envelope continuation truncating and under-reporting the cricondenbar by 50%; DNV-ST-F101 burst resistance missing a factor 2; cost correlations extrapolated 80x beyond validity while weight-based vessel methods overstated columns (net study error 3x); and a hard-wired LNG refrigerant inventory giving a specific energy 2.2x outside its own published band. Key method points: calibrate an unknown gas composition against published NGL yields using GPA 2145 liquid densities rather than EOS densities; derive the feed rate backwards from LNG capacity; solve the dehydration specification from the hydrate curve rather than assuming a sales-gas spec; always check the Joule-Thomson letdown temperature at an onshore reception (it landed at -30 degC here, making inlet heating mandatory). See /memories/repo/neqsim-silent-factor-errors.md.

2026-09-15 — Are two named units of a five-unit fleet really the cost and production-loss drivers?

Type: G (Workflow) Keywords: fleet comparison, worst unit, maintenance cost ranking, production efficiency loss, PE loss, attribution artefact, booking default, permutation test, duty normalisation, running hours, campaign work, gas turbine generator, maintenance API work order costs, man-hours, PEPR loss tag, tag hierarchy sub-tree Solution: private task folder (redacted); reusable outputs: devtools/generate_sources_md.py, devtools/generate_work_record.py, devtools/validate_task_results.py; enterprise skills enterprise-maintenance-api, enterprise-pepr-actions, enterprise-ots-timeseries, enterprise-fleet-equipment-benchmarking Notes: An internal conclusion named two of five nominally identical units as the drivers of both maintenance cost and production loss. Half of it survived, and the two halves failed differently, so the reusable result is the gate rather than the ranking. Adjudicate every metric before ranking with it: the work-order cost field was populated on corrective orders only and exactly zero on 80% of those, covering 8.8% of the population and no planned maintenance, which forced a second metric (confirmed man-hours from work-order operations). That metric has its own unit trap - plannedWorkHours is ALREADY man-hours, so multiplying by capacityCount inflated the plant total 13-fold and the error is invisible in the median. Define a machine as its tag SUB-TREE (866-906 tags here); a root-tag-only roll-up named a different leader. Then normalise by measured running hours and permute the unit label 20 000 times: the observed max/min spread of 1.94 sat BELOW the null median of 2.04 (p = 0.58), i.e. the fleet was more uniform than random allocation produces. On the consequence side the loss-record equipment tag turned out to be a booking default - 87% of unit-tagged loss value sat on the unit that ran 7.5% of fleet hours, under weather and national-grid categories - so consequence must be attributed twice (tag, and the unit the free text names) and cross-checked against exposure. Removing fleet-campaign work (same job title on >= 3 units, 19% of work orders) changed the leader again. The claimed pair survived in 3 of 7 metrics. Method sanity anchor: the identical pipeline returned p = 5e-09 on an earlier recurring-failure study and p = 0.58 here, which is the evidence that it can return a negative. Also fixed three devtools gaps found on the way: generate_sources_md.py never wrote the document_evidence_manifest.json the quality gate requires, the two manifest tools disagreed on which files count as sources, and the work-record generator only scanned step 2 so step-1 data-acquisition scripts were falsely reported missing. See /memories/repo/fleet-worst-unit-significance-gate.md.

2026-09-16 — Instrument review and measurement readout of a first-stage (inlet) separator

Type: B (Process) Keywords: historian readout, instrument loop, STID tag discovery, frozen mirror namespace, level transmitter pegged, discriminating test, recurrence scan, positive control, PI Web API, tagreader, produced-water outlet, erosion probe full-scale saturation Solution: private task folder (redacted); devtools fixes on task/norwegian-task-spec-headings-and-assumption-rendering Notes: Two general lessons, both of which produced a WRONG answer before being caught. (1) A plant can expose two historian namespaces for the same tag where one is a frozen legacy mirror: it returns rows, raises nothing, and yields plausible setpoints and valve outputs that are months stale. Prove a series is alive (distinct-value count and last-change timestamp) before interpreting any number from it. (2) A single multi-month historian read came back silently truncated, and an episode scan over it reported ZERO events when the true answer was nine — which would have flipped the conclusion from “recurring operating practice” to “one-off”. Chunk long reads, concatenate, and assert a known event is inside the assembled frame before believing any negative finding. Also: a level transmitter sitting at exactly full scale is not automatically a fault — the discriminating test (independent transmitter tracking, surviving signal noise, level responding to valve movement with the right lag) showed a real high interface, while an erosion-rate tag pinned at exactly full scale for 90 days WAS a dead reading, contradicted by its own accumulated metal-loss channel by five orders of magnitude. Same symptom, opposite verdicts, decided by data. devtools fixes: extract_spec_section matched English headings only, so a fully written Norwegian scope section was reported as “lacks source data”; and the work-record generator dumped schema-correct assumption/data-gap dicts as raw JSON. Both now covered by tests.

Type: G (Workflow) Keywords: STID, SAP Maintenance API, PEPR, historian, isometric drawing search, proven negative, positive control, tag-form traps, anchor object, P&ID topology reading, dosing regime change point, DCS reconciliation, document control Solution: private task folder (redacted); enterprise skill updates (STID / maintenance / PEPR / plant-data) Notes: A “we cannot find the drawings” request is a search problem, and the failure mode is reporting absence when the search was wrong. Four transferable lessons. (1) Query TWO independent registers. The engineering document register and the maintenance register disagreed: the maintenance register carried a drawing link that the document register did not expose on the line object, so a single-system search would have reported a drawing that exists as missing. (2) A negative is only worth reporting with a POSITIVE CONTROL. Every zero-row result was re-run against the full corpus, the same module and the same size class; the surviving conclusion is “this specific 2004 project filed no per-line isometrics”, not “this kind of drawing is not registered”. Six competing explanations (thin corpus, small-bore never drawn, poor module coverage, filed on a work order, access failure, malformed query) were each refuted with a count. (3) THE ANCHOR-OBJECT RULE: a fabrication isometric is named after the piping segment and filed against the equipment it serves, not against every line tag it crosses. When a line-tag search finds nothing, look on the mixer, the valve or the package. Reading the P&ID showed the small-bore tubing and the downstream piping were one physical run separated only by a spec break — which explained why one drawing was linked to both injection valves and the mixer, and turned an apparent two-line gap into probably one. Reading the drawings, not just listing them, was what produced the answer. (4) Three tag-form traps each sufficient to fake an absence: case (12mm stored 12MM, and the SAP tag lookup is case-sensitive while its prefix search is not); the historic-vs-as-built leading zero (drawings filed under .75" for a line now tagged 0.75"); and word-valued status filters where the API takes single-letter codes and silently returns zero rows. Also: the PEPR contains filter is a word-PREFIX match, not a substring match — proven with mid-word probes returning zero — so every negative from it must be qualified. Operating-data lesson: for a chemical-dosing system a 30-day mean is not the operating point once the dose has been stepped; detect the change point and report both, and cross-check a dosing rate against the tank level slope because these tags are prone to multi-day frozen segments. Report hygiene: the report generator embeds every PNG in figures/, so working crops must be moved to a subfolder — leaving them in place produced a 100 MB Word file instead of 2.9 MB.

2026-09-21 — 3-stage compression with intercooling from 5 to 150 bara

Type: B (Process) Keywords: Compressor, Cooler, intercooler, multi-stage compression, equal pressure ratio, SRK EOS, ProcessSystem, screening, lean pipeline gas, devtools task template Solution: task_solve/2026-09-21_3_stage_compression_with_intercooling_from_5_to_150_bara/step2_analysis/run_compression_train.py Notes: Screening-level (AACE 4-5) calc: 3x Compressor in series with equal per-stage pressure ratio (P_out/P_in)^(1/3), each followed by a Cooler intercooler back to suction temperature (no aftercooler on the final stage). At 5 -> 150 bara the equal split gives PR = 3.107 per stage, comfortably inside the typical centrifugal range (2.5-4) — worth checking before assuming an equal split is fine, since a 2-stage split for the same ratio (PR ~ 5.5) would not be. Flow rate wasn’t specified, so used a 1000 kmol/hr basis and reported power per kmol/hr alongside the absolute number so the answer rescales linearly for a real design flow. Devtools fix (same session, Continuous Improvement Rule): devtools/task_template/README.md held maintainer-facing “Canonical Task Template Files” documentation instead of the per-task README — because setup_workspace() overlays every file under devtools/task_template/ verbatim into task_solve/TASK_TEMPLATE/ and then into every new task folder, every task ever created by neqsim new-task got this meta-doc as its README.md instead of the real step-by-step instructions (the TASK_README constant in new_task.py). Fixed by writing the correct per-task README content into devtools/task_template/README.md and relocating the maintainer-facing overlay-mechanism doc to devtools/TASK_TEMPLATE_OVERLAY.md (outside the walked directory, so it can no longer leak into task folders). Lesson: nothing meant for humans browsing a source folder should be placed inside a directory that a tool copies wholesale — check what walks/overlays a directory before adding a README to it.

2026-09-22 — TwoFluidPipe benchmark matrix: one-, two- and three-phase, steady and transient

Type: G (Workflow) Keywords: TwoFluidPipe, multiphase pipe flow, benchmark matrix, gas condensate, gas-oil, three-phase, riser, hilly terrain, transient turndown, ramp-up, energy balance, equilibrium cp, Andritsos-Hanratty, steady-consistent transient, regime gate, work record Solution: private task folder (redacted); Java fixes in TwoFluidPipe, TwoFluidConservationEquations, InterfacialFriction; tests TwoFluidPipeEnergyBalanceTest, SteadyMomentumCorrectionTest Notes: 13 steady and 5 transient cases against an industry transient multiphase simulator on one shared NeqSim fluid basis (the reference PVT table and source phase fractions were written from the same SRK flash). Fixes that mattered:

2026-09-24 — Contaminated closed MEG/water cooling-medium loop: cleaning, monitoring, materials basis

Type: G (Workflow) Keywords: cooling medium, MEG, glycol, biofilm, MIC, crevice corrosion, strainer dP, water activity, pH buffer, feed and bleed, PEPR Solution: private task folder (redacted); pattern in .github/skills/neqsim-production-chemistry/SKILL.md “Closed Glycol Cooling/Heating Media” Notes: SRK-CPA water activity of 20 wt% MEG = 0.923 (above the ~0.91 bacterial growth limit; 0.88 needs 28.5 wt%). Unbuffered MEG/water loses pH 8 -> 7 with ~0.007 mmol/L organic acid, so caustic dosing cannot hold pH. A past feed-and-bleed chloride drop reconciled to a well-mixed volume of ~10 m3 versus a stated 35 m3 -> stagnant branches/dead legs. Historised strainer dP was the leading indicator (48x baseline before the deposit find, regrowth within a year). SAP gotcha: a cleaning work order went TECO with every operation confirmed at 0 actual hours although the work was not done. NIP: SRK-CPA CO2-water Henry constant 19% low at 25 C / 1 atm.

2026-09-24 - Lifetime-programme action for an ageing fire-door population (peer benchmark in the lifetime register)

Type: G (Workflow) Keywords: levetidsprogram, lifetime programme, LTP action, fire doors, A60, barrier, failure to close on demand, Crow-AMSAA, peer benchmark, robustgjoring, Thelma Solution: private task folder (redacted); pattern in enterprise-life-extension-assessment steps 1b and 8b Notes: The lifetime programme had no action for the doors because a pre-yard lifetime evaluation had rated them satisfactory; 18 other installations carried a fire-door lifetime case, which gave a sourced expected life (25 y) and unit costs. Trend excluded ageing, but a flat demand-failure rate on A60/H doors made it a barrier case. Robust option = survey + pneumatic operators + targeted replacement + verified function test: same barrier gain as full replacement at one third of the cost; targeted-only collapses if failures do not concentrate on known bad doors (the discriminating test). Horizon in the lifetime register (2045) differed from the task horizon (2037) - assess both.

2026-09-25 - Continuous agentic improvement of task folders (living tasks)

Type: G (Workflow) Keywords: continuous improvement, living task, daily cycle, digital twin, drift detection, EWMA, CUSUM, improvement ledger, baseline promotion, watermark, incremental pull, scheduled agent, Copilot CLI headless, ProcessAutomation evaluate, AgenticProcessOptimizer, OnlineCalibrator Solution: private task folder (redacted); design document following up the two 2026 agentic engineering books Notes: Proposes a continuous/ layer per task (promoted baseline, append-only watermarked data, immutable per-cycle folders, JSONL improvement ledger) and an eight-stage cycle (sense, refresh, qualify, replay, drift, re-optimise, diff+ledger, review+promote) built on existing ProcessAutomation/AgenticProcessOptimizer/OperationalEvidencePackage/OnlineCalibrator/ProcessModelState APIs. Rule: program the loop, prompt the exceptions - the daily runner makes no LLM calls; an agent runs only on triggers; only an engineer promotes. Replay baseline inputs whenever the NeqSim commit changes to separate tool change from plant change. Keep large historian partitions off OneDrive. Copilot CLI 1.0.87 supports -p/–silent/–agent/–allow-tool/–deny-tool/–log-dir for bounded headless reviews. Not implemented yet (Phases 1-4 proposed). Update: foundation implemented in devtools/neqsim_continuous/ (entry-point plugin registry, stop rules, append-only ledger with union merge, watermarks, file adapter; test_neqsim_continuous.py) and Word/Markdown briefs for new-task --prompt-file (backward compatible). Public-first placement: engine/agent/methods/reference case in neqsim + community; only site adapters in enterprise. SOTA additions planned: EnKF + identifiability, Bayesian/multi-fidelity search, guarded hybrid model, branches + critic, backtesting metrics. Update 2: implemented end to end. neqsim task-living/task-cycle/task-solve/task-backtest/task-schedule/task-promote/task-ledger/task-status/task-reference-case; Java neqsim.process.operations.continuous (ModelDriftMonitor, BaselineComparator, ImprovementCycle); core agent continuous-improvement + skill neqsim-continuous-task-improvement; community toolkit (tagreader adapter, GP-EI, EnKF, identifiability) and agent; enterprise OTS/PDM adapters and overlay agent. Public reference case: 3/3 injected faults detected, 0 false alarms, 100 % reproducible. Gotchas: a 30-sample warm-up underestimates sigma - without per-signal min_sigma floors white noise gave 3 false alarms in 2 months; start EWMA at the baseline mean, not the first value; make step/criterion triggers fire on crossing only; os.replace on Windows/OneDrive needs a retry on PermissionError; plugins resolve by dotted path (pkg.mod:Class) so aggregated skill installs need no entry points. Update 3: living tasks use the general task root (neqsim --show-task-root): every <task> argument accepts a folder name inside it, and task-status / task-reference-case default to it. User guide: docs/development/CONTINUOUS_TASK_SOLVING.md, introduced in TASK_SOLVING_GUIDE.md § “Keeping a Task Alive”.

2026-09-29 — Optional finite-rate multi-burner gas-fired hot-oil heater

Type: E (Feature) Keywords: Cantera, C2/C3 combustion, CO burnout, burner switching, staged air, radiation, refractory, hot oil Solution: MultiBurnerFiredHeater, FiniteRateCombustionReactor, CombustionKineticsBackend, HotOilHeatBalance; guide docs/process/equipment/multi_burner_fired_heater.md. Notes: Native ProcessSystem equipment has separate fuel/air and optional oil ports, fixed-volume burner PSRs, enthalpy-conserving bypass-air mixing and a reacting post-flame volume. Heat to oil, refractory loss, stack sensible energy and residual chemical energy are checked separately. Exact mechanism species remain available; the EOS projection is bounded by mass and every element, with no renormalization or factor-based CO. The optional staged-air assumption demonstrates a nonmonotonic constant-air CO response with sustained hot burner zones; it is not a geometry-derived entrainment law. Prior focused JUnit (12 tests) and optional Cantera tests (5) passed. Native 10–40 MW examples ran against the packaged NeqSim runtime; the latest current-master native demonstration rejects its EOS projection on the hydrogen-element tolerance. Current-master end-to-end validation and plant calibration remain incomplete; published as a draft at the user’s request. A bounded private measurement comparison did not establish plant calibration; fuel assay, local mixing, temperature and effective geometry remain unidentified. GRI is a software demonstration; C2/C3 mechanism qualification is separate.

2026-09-30 — Fired-heater zone conservation qualification (#4131, campaign #4151)

Added fail-closed mass/every-element checks at burner inlet mixing/PSRs, common mixing including bypass air and post-flame PFR, retaining signed roundoff and exact mechanism inventories. Initial branch head 0c139de311e20b0f5b082f8a8f6c98575f422622; validated against merge ref ed75b0909f584d1e36540096a861f8b7612754e8 containing current master 529ea9c358ab1e15917c5244ae0ede2ff272cce5. Nineteen Python tests and twelve focused Java tests passed; native seven/five burners and 10–40 MW scale examples executed from compiled workspace classes. Synthetic seven/five CO was 0.110188/0.103241 kg/h at equal total supply, with about 26.27 MW oil heat. Default projection bounds remain unchanged. Carbon-free hydrogen exposed absent-carbon integrator roundoff at scalar atol 1e-18/1e-22; selected 1e-28/1e-32 integration passed the same strict element bound. The historical EOS hydrogen rejection remains unreproduced. No plant calibration or experimental C2/C3 qualification claim; next dependency is benchmark provenance and the broader operating envelope. Evidence and blockers are tracked in #4151.

2026-10-04 — Review direct terminal specification residuals (PR #4127)

Type: E (Feature) Keywords: distillation, reflux, boilup, PVrefluxflash, cached streams, specification residuals Solution: PVrefluxflash, Condenser, Reboiler; regression coverage in PVrefluxflashTest, TerminalRatioStreamCacheTest, and DirectTerminalSpecificationResidualTest. Notes: Reproduced a vapor-only condenser moving away from its target and stale terminal outlet flows after changing feed flow. Reused the bracketed vapor-fraction flash and invalidated terminal caches on every run. Thirteen focused tests pass on Java 17, including existing fixed-liquid-reflux coverage. The two existing coupled column regressions still fail; the PR remains a draft and is not qualified for merging. No existing assertion or tolerance was weakened.

2026-10-04 — Coupled terminal ratio correction (PR #4127 follow-up)

Type: E (Feature) Keywords: distillation, simultaneous MESH, reflux, boilup, heterogeneous feeds, pumparound Solution: Added the missing active terminal flow-ratio equations to the full and local finite-difference residuals. Direct specifications now fail closed, including non-finite residuals. Isolated guarded correction retains return streams and accounts for side products/pumparound draws, named feed components and phase-flow-weighted feed enthalpies. Explicit Naphtali-Sandholm is not redundantly rerun after its guarded fallback. The correction-only initializer bypasses Sum-Rates terminal-duty equations; standalone initialization is unchanged. Validation: Integrated master bc0ffeb416b3ea9a2404f3da373ba3f680249f41. The final focused six tests pass: the original nearby-ratio and coordinated-flow regressions, a new reordered/subset-feed and copied-pumparound regression, inside-out telemetry, nearby K-value telemetry and complete atmospheric fractionation. A broader 104-test Maven run on the preceding candidate had 7 failures, 8 errors and 1 skip; the additional K-telemetry failure was reproduced against the passing original head, traced to redundant simultaneous correction, and eliminated by the final focused check. Existing scalar telemetry, two rejected-candidate-count assertions, three atmospheric and eight vacuum qualification failures remain open; no acceptance assertion, tolerance or iteration budget was relaxed. Vacuum investigation isolated a Sum-Rates dry-condenser seed and subsequent ill-conditioned Newton convergence. This remains a partial draft repair, not a merge qualification.

2026-10-04 — Conservative condensate endpoint recovery (#4202, numerical roadmap #2937)

Reproduced the SRK 353.15 K / 350 bara condensate on master 21ec52b309ab16a3129089ec1cf2b7bc18ace7e9: the ordinary flash removed a phase and retained a composition with maximum component-balance error 3.45422e-5. An invalid dry SRK/PR single-phase endpoint now triggers a cold multiphase stability flash on a clone, with conserved-feed Gibbs, normalization, component balance and fugacity acceptance gates. Failed recovery throws rather than returning an unbalanced fluid. The corrected ordinary path retains two phases; four repeats have balance error at most 2.0e-13 and log-fugacity residual below 5.5e-13. Five regression tests cover the exact case, nearby conditions, reuse, warm starts, PR and all 750 phase-map points from NeqSim-Colab PR #187. The map’s maximum balance error is 5.25e-12, retaining its original 1e-7 acceptance tolerance. All 301 selected Java flash/stability, pump, separator and documentation tests and 12 engineering-coverage Python tests passed. Direct Spotless apply/check, both pre-commit stages, documentation search and flash-package Javadoc passed; the environment-only Javadoc launcher uses the installed JDK module. Updated the flash guide, initialization skill and generated engineering inventory. Numerical qualification does not establish experimental accuracy or global stability of every possible phase set.

2026-10-04 — Minimize condensate recovery cost (#4202, PR #4205)

Gated endpoint screening on a per-run final-phase-removal flag: ordinary results without cleanup add only a boolean reset/check, with no recovery component scan, clone or EOS initialization. The invalid endpoint first tries the multiphase stability/beta solver directly from the conserved homogeneous gas-root seed; a fresh-clone cold TP flash remains the fallback. Direct candidates are ordered by density before final initialization to preserve gas/oil identity. Eligible trace-phase cleanup preserves all feed moles. Both trials retain identical component, normalization, fugacity and Gibbs qualification. Added a regression for reuse of the same operation after cleanup, gas/oil identity and preservation of every component inventory over 128 repeats, plus a standalone complete-flash benchmark with elapsed/thread-CPU clocks covering seven workload families, cold recovery, unchanged conditions and alternating nearby conditions. All 337 selected Java tests and 12 engineering-coverage Python tests passed; the 750-point map is retained.

Paired benchmark against initial PR commit 24467a8ad9313c7dc7a5c5d85ec1510ee7d0b4d5: two JVMs per version, one pinned CPU, Java 17, 256 MB heap, Serial GC and -Xbatch; 48 flashes per batch, five batches, 128 warmups (4096 for the fast gas/two-phase cases). Median thread CPU time for fresh exact condensate recovery fell from 9.38 to 6.34 ms (32%), repeated unchanged condensate from 11.11 to 6.59 ms (41%), and changing condensate from 10.42 to 8.36 ms (20%). Fresh-recovery elapsed time fell from 9.54 to 6.54 ms; elapsed times elsewhere show host scheduling variation. Fast ordinary workloads changed by at most about 1.8 microseconds of median thread CPU time in this sample; this is not a universal timing bound. All 140 optimized snapshots passed the existing benchmark’s strict conservation/equilibrium screen. The 30 initial-fix failed snapshots (trace mass residual about 2.3e-12 against its 1e-12 screen) remain recorded, without tolerance relaxation; optimized mass/mole residuals were zero. Across initial/final snapshots the largest beta difference was 2.30e-11 and composition difference 3.92e-12, with matching phase identities.

Initial full CI found five failures in WellSystemTest and reactor mechanical design tests. Those endpoints reach recovery with unnormalized overall fractions (the well sum was 0.99908; reactor fractions exceeded one). Recovery eligibility now requires a finite, nonnegative normalized feed; these legacy states retain their prior path rather than entering a conserved-feed repair they cannot pass. Candidate acceptance tolerances are unchanged. The two complete affected test classes (34 tests) pass with this prerequisite.

2026-10-04 — Repair PR #4205 CI and master integration

Reproduced the cricondenbar NaN and strict multistage side-draw failures from workflow 37215992029 on head 6c596a18b611338990259c2026623907d7c7500f. The legacy cricondenbar loop now initializes temperature derivatives after TPflash with init(2), replacing its stale pre-flash init(3), and checks convergence before a possible zero-over-zero temperature correction. This repairs state initialization, not the accuracy qualification of the legacy pressure search. Trace-phase cleanup now preserves full feed inventory only for an eligible dry endpoint already failing the 1e-10 balance gate and requiring recovery. Balanced endpoints retain established cleanup; the recovery acceptance gates, ordinary no-cleanup path and all original regression tolerances are unchanged. Experimental distillation-controller changes and increased test budgets were rejected during validation and are not included. Synchronized with master bc0ffeb416b3ea9a2404f3da373ba3f680249f41, resolving the generated engineering inventory conflict by regeneration. Updated the flash guide and initialization skill for the changed behavior.

Validation on Java 17.0.20: 244 flash/well/mechanical-design tests pass, including the seven condensate regressions and 750-point map. The unchanged high-flow side-draw regression and both critical-point tests also pass. Direct Spotless apply/check, both all-file pre-commit stages, documentation search and flash-package Javadoc pass; Javadoc uses the installed JDK module through an environment-only launcher. Full GitHub CI is pending on the repair commit. The remaining twelve side-draw tests pass as well: 259 distinct affected tests pass in total, without changing any existing test target, tolerance or budget.

2026-10-04 — Gas-limited stop choke list from allocation data (PEPR 80302059)

Type: B (Process / production optimisation) Keywords: choke list, strupeliste, GOR, gas handling, regass scrubber, PDM allocation basis, compressor meter basis, WAG, backtest Solution: Two-constraint LP on the per-well PDM table with the gas budget calibrated on a previous stop; cross-checked with ChokeAndGasLiftAllocationOptimizer; stage-separation sweep for 3rd-stage pressure and scrubber temperature; gas injectors ranked from 12 months of per-well injection. Notes: A compressor-meter capacity is not the allocated well gas: on the studied platform allocated gas was 0.79 of the meter flow with a compressor train out of service, so planning on the meter figure over-promised about 1,050 Sm3/d of oil. The previous stop gave a free backtest (every GOR above 1,000 well was shut in both; oil within -6.5/+8.2 %). GOR had moved by a factor 4-5 for two wells since the last stop. A simple stage model under-predicted recompressor load by 12-38 % but gave the right slope for RVP against 3rd-stage pressure (0.30 vs 0.28 bar/bar). Tooling: PEPR skill now resolves the task root; PDM skill documents injection and basis; production-optimization skill has the natural-flow recipe.

2026-10-04 — PR #4127 diagnostic and total-condenser repairs

2026-10-04 — Converge exchanger regression before millikelvin assertions (PR #4205)

The final fast-test failure reproduced at 14.1455588737 C with recycle tolerance 1e-3. At sub-1 kg/s flow that tolerance is absolute kg/s. Tightening to 1e-4, 1e-6 and 1e-8 gave 14.1482251294, 14.1485165096 and 14.1485165096 C; both recycle objects reported convergence. The regression now uses 1e-6 before checking exchanger performance, retaining its original expected temperatures and acceptance tolerances. Added recycle-convergence, duty-direction, positive-terminal- temperature and independently reconstructed UA checks against the existing 0.1% UA solver criterion. Production code and its runtime cost are unchanged. Integrated master 466cd0f333561fbe442156d47cfa0c9b358687f7, retaining both task-log histories and regenerating the engineering inventory. Documentation impact: none for the test-only correction; the recycle guide already documents the low-flow absolute tolerance and the exchanger guide documents the duty/LMTD relation.

2026-10-04 — Gas-limited stop choke list from allocation data (PEPR 80302059)

Type: B (Process / production optimisation) Keywords: choke list, strupeliste, GOR, gas handling, regass scrubber, PDM allocation basis, compressor meter basis, WAG, backtest Solution: Two-constraint LP on the per-well PDM table with the gas budget calibrated on a previous stop; cross-checked with ChokeAndGasLiftAllocationOptimizer; stage-separation sweep for 3rd-stage pressure and scrubber temperature; gas injectors ranked from 12 months of per-well injection. Notes: A compressor-meter capacity is not the allocated well gas: on the studied platform allocated gas was 0.79 of the meter flow with a compressor train out of service, so planning on the meter figure over-promised about 1,050 Sm3/d of oil. The previous stop gave a free backtest (every GOR above 1,000 well shut in both; oil within -6.5/+8.2 %). A simple stage model under-predicted recompressor load by 12-38 % but gave the right RVP slope against 3rd-stage pressure (0.30 vs 0.28 bar/bar). Report generator: report.front_matter_lists skips lists of figures and tables on short reports.

2026-10-05 — Well/SURF network integration audit and steady hydraulic fidelity

Type: E (Feature) Keywords: subsea, SURF, gathering, injection, Beggs-Brill, two-fluid, topology, campaign 4228 Solution: LoopedPipeNetwork, NetworkHydraulicFidelityTest, docs/fielddevelopment/SURF_NETWORK_INTEGRATION.md. Notes: Reuse the detailed steady graph, existing well physics, dedicated storage-node two-fluid transient network and lifecycle/design models. Pipe-edge fidelity overrides preserve topology and JSON replay. Two-fluid failures remain explicit; cached Beggs-Brill geometry is refreshed. Eight new regression tests and the affected network suites pass (152 passed, one existing skip). Live WellSystem/injection boundaries, independent field benchmarks and mixed-fidelity dynamic junction qualification remain campaign work.

2026-10-06 — Troll A well-to-export model with tuned common fluid (ProcessPilot package)

Type: B (Process / production optimisation) Keywords: gas platform, well to export, Uleberg P/A fluid, Fluid Symphony PVT tuning, compressor map utilization, bottleneck sweep, PDM allocation, hold-out window Solution: One ProcessSystem per area in a ProcessModel with set-point driven separators, scrubbers and four pre-compression trains; common P/A gas EOS tuned to five PVT samples; utilization register from vendor compressor maps (equivalent speed anchored to measured speed) with throughput sweeps; pvt_tuning_quality block in results.json checked by validate_task_results.py and rendered by the report generator. Notes: The platform has no gas injection. Compressor efficiency from the plant energy balance makes compressor mass flow an independent check on allocated gas (3 % gap in one window). Two routing hypotheses for parallel subsea lines had to be tested on two windows before one was kept; a fitted roughness at its bound is a sign of the wrong structure. Allocated condensate and water are not measurements and must not drive retuning of the gas path. A gas CME that stays near 1.0 was run on separator liquid and is excluded from EOS tuning. Fluid Symphony field lists page at 1000: filter through the URL parameter and capture the page JSON.

2026-10-06 — Kvitebjorn well-to-export model with formation fluids tuned to Fluid Symphony PVT (ProcessPilot package)

Type: B (Process / production optimisation) Keywords: gas-condensate platform, well to export, Brent/Cook/Statfjord fluids, Uleberg P/A split factor, hold-out PVT samples, recycle, inlet-flow-matched anti-surge, Valemon reception, bottleneck register Solution: One ProcessSystem per area in a ProcessModel; wells recombined from tuned formation fluids to PDM allocated gas, condensate and water; measured recycle or recycle solved from measured compressor inlet flow; scrubber liquid returns collected in a Mixer before a Recycle; own Souders-Brown K register for vessels; pvt_tuning_quality block with per-sample before/after and four held-out samples. Notes: The platform has no gas injection (only produced-water injection). A multi-stream Recycle returned -268 C when one input had zero flow: mix first. NeqSim vessel gas-load constraints use another area basis for horizontal vessels and parallel pairs, so report an explicit K. IOC digital-twin streams are model outputs (first-stage gas equals the whole wellstream mass, a 145 t/h recycle does not close the export balance) and must not be used as measurements. Matching allocated gas and condensate at standard conditions does not fix the plant stage split: stock-tank liquid was 59 % above the allocation and stage 2 flash gas 10x too low, so recompression margins stay unusable until the stage routing is confirmed. Mean dew-point error did not improve by tuning GOR and density; report it as is.

2026-10-06 — Oil and gas platform well-to-export model with gas injection, seven formation fluids and utilisation register (ProcessPilot package)

Type: B (Process / production optimisation) Keywords: well to export, gas injection, gas lift loop, Uleberg P/A fluid, Fluid Symphony PVT tuning, untuned-EOS benchmark, hold-out window, utilisation register, Monte Carlo on allocations, anti-surge recycle gap Solution: Seventy-two wells recombined from seven tuned fluid groups (oil end-member plus gas-cap end-member solved to allocated standard volumes), twelve ProcessSystems in a ProcessModel with two recycles; calibration and hold-out weeks plus an untuned-EOS run; utilisation register with design and inferred rows; throughput sweep and 48-run Monte Carlo; pvt_tuning_quality block with 17 samples and parameter bound flags; report generator now accepts a list-form benchmark_validation. Notes: Export gas and water close by construction when allocations are the input; judge the model on oil volume and density, gas density, compressor suction flows and temperatures. The untuned EOS gave nearly the same plant-level numbers although Psat error fell from 11 % to 2 %. Shaft power far below measured points to anti-surge recycle, not efficiency: size the recycle from the measured compressor inlet flow, then solve the efficiency in one window and test it in the hold-out week; vendor data sheets confirm the inlet volume incl. recycle and show the solved efficiency (0.48) far below the data sheet value (0.73), an open item. getMolarMass() returns kg/mol, so yields per kmol need a factor 1000. A Souders-Brown K without internals data gave a misleading 3x scrubber load: use an inferred row from the connected compressor flow instead. The gas-cap S and heavy scale sit at their bounds, which is a finding.

2026-10-06 - Troll B well-to-export model with gas injection and three formation fluids tuned to Fluid Symphony PVT (ProcessPilot package)

Type: B (Process / production optimisation) Keywords: well to export, oil rim and gas cap, gas injection window, Uleberg P/A split factor, global kij offset, untuned-EOS benchmark, hold-out windows, non-iterative anti-surge spill gas, minimum-flow line, utilisation register, throughput sweep Solution: About 30 wells recombined from three tuned fluids (gas cap, Sognefjord oil rim, Oseberg oil) to PDM allocated rates; five ProcessSystems in a ProcessModel; three plant windows (calibration, hold-out, injection window); anti-surge minimum flow taken from the calibration window and implemented as spill gas built in a Calculator callback; one oil basis factor fitted on one window; utilisation register, throughput sweep and sensitivity; pvt_tuning_quality block with before/after per sample. Notes: A Recycle/Wegstein anti-surge loop oscillated for small LP flows and a mass-balance-only stagnation stop hid unconverged loops: use recycle.solved() in the stop test or avoid the loop. Measured compressor inlet flows that stay flat across windows with different gas rates mean the machines sit on the minimum-flow line. Allocated oil is not additive with the EOS stock-tank basis (per-well std flash 0-12 % high, near-zero-oil wells get condensate from the gas-cap yield): check per well. A ComponentSplitter water factor of 0 blew up the scrubber liquid. Gas alpha and S sit at their bounds. Fuel, Troll A and injection gas are inputs, not validations.

2026-10-07 — Beggs and Brill flow-solve acceptance (#4258)

Type: E (Feature / numerical correctness) Keywords: pipeline, flow capacity, pressure residual, iteration limit, rollback, JPype Solution: PipeBeggsAndBrills, immutable FlowSolveReport, and monitor JSON now expose pressure-to-flow termination evidence. A failed candidate throws and restores stream fluids; only final forward replay within pressure tolerance is accepted. Arbitrary property failures are no longer converted to excessive-flow bounds. This also improves agent/optimizer evidence: solved() is false after failure and JSON carries the same termination contract. Validation: Public reproducer first failed the new regression on original master. Updated Java suite: 24 passing tests and two existing skips, including six flow-solve regressions; JPype/JSON parity and recovery passed. The reproducer’s 0.437220209 bar iteration-limit residual is rejected; normal budget converges in 13 trials to a 0.002861683 bar residual against 0.008 bar. Documentation: Updated pipeline guide, Javadocs and executable Python bridge example.

2026-10-07 — PR #4260 report-audit syntax repair

2026-10-06: User-requested PR #4127 terminal-ratio recovery

Reproduced the Big Hill atmospheric regression with an unmet top reflux ratio and 13.9% tray component imbalance against the unchanged 2% gate. Retained the existing Newton correction and added isolated sequential recovery only after Newton rejection. The recovery candidate must satisfy all physical convergence gates before adoption; failed candidates leave the original column unchanged. Big Hill atmospheric and several vacuum cases recover; Sarir and two vacuum sensitivity points remain unqualified. An adaptive tightening experiment was rejected because it did not qualify Sarir and increased runtime beyond its test budget. No tolerance or iteration limit was relaxed. Updated the distillation guide and regenerated engineering coverage.

2026-10-07: PR #4127 physical terminal recovery qualification

Reproduced the remaining Sarir atmospheric and Big Hill vacuum feed-temperature/reflux failures on the current PR head. Deep-copy recovery lost transient tray outlet caches and the sequential initialization identity. Preserve these inventories, qualify the connected component balances during recovery, and try isolated Newton correction before an optional tighter component-closure pass. Ratio-constrained Newton recovery permits up to twenty fugacity sweeps with the existing early-stop tolerance. A candidate restoring every active physical gate can replace an unqualified source even when its trace-component MESH norm increases within the configured limit. User convergence settings and iteration limits and physical acceptance tolerances are unchanged.

Qualified separation exposed a product-distribution reporting failure: positive traces below cumulative floating-point resolution created duplicate support points. Omit those points while retaining their contribution to the mean; two focused regressions cover heavy and light traces. The heavy-trace regression fails against the previous implementation. MESH pumparound continuation now preserves gross phase inventory and connects newly created returns while retaining the mixed tray fluid. Other solvers retain their established cold outer initialization. It reconciles products and terminal duties after the accepted return update. The qualified Sarir draw tray has positive liquid traffic; its negative reporting test explicitly zeros the published draw after a successful positive-flow screen instead of assuming a dry tray. Its original zero-flow rejection assertion remains, with additional conservation and cooler checks. Side-stripper contacts now use the same qualified material-draw mapping. Negative tests explicitly zero the published side draws or swap their compositions at conserved mass and enthalpy rates, retaining the rejection messages and all physical tolerances instead of relying on dry or inverted products from an unqualified solve. Water-bearing tray flashes use a bounded stability preflight for balanced gas/oil endpoints and single SRK gas phases before full reciprocal flashing. SRK gas-endpoint trials defer transport initialization; liquid endpoints, trace-water reciprocal trials and other models retain existing initialization. Documentation impact: recovery, pumparound publication and trace-distribution semantics in the distillation guide, plus the bounded stability path in the TP flash algorithm guide. Engineering coverage is regenerated after final formatting.

Validation: 539 unique tests pass across the affected fast/slow distillation, TP flash, PV-reflux and documentation regressions, with two existing disabled tests. A clean final pumparound rerun passes 44 tests with one existing disabled test. Restrict warm outer continuation to MESH to preserve the other solvers’ established repeat-run behavior. Validated NeqSim 3.23.0 with OpenJDK 17.0.20 and Python 3.12.14; all seven edited Java sources also compile with --release 8. Stable double Spotless apply, Spotless check, Javadoc, documentation-search audit and regenerated engineering-coverage check pass. The pre-commit executable is unavailable; all required direct gates ran.

2026-10-07: PR #4127 cross-capability regression repair

Reproduced all three hosted failures after merging the existing branch changes with master 1768fc1: wet-oil RVP phase rejection, Eclipse separated-oil enthalpy, and an unbracketable condensate-pump entropy target. Controlled runs isolated the latter two to the new bounded TP-flash screen and the RVP change to its reduced phase initialization path. Restore the shared master TP-flash implementation, keeping the terminal-ratio, recovery, pumparound and boiling-distribution improvements. Existing regression expectations, physical acceptance tolerances and iteration limits remain unchanged. This supersedes the previous entry’s TP-flash optimization claims.

Preserved both task-log histories while resolving the master synchronization conflict. Documentation impact: update the distillation guide to describe the restored shared TP-flash path; remove the unqualified shortcut from the TP-flash guide.

Validation for the repaired tree: 102 tests pass (47 cross-capability/PV-reflux and 55 focused distillation tests), with zero failures/errors. Includes unchanged oil RVP rejection, Eclipse enthalpy and pump/diagram regressions, direct terminal specs, cache/mode/coordinated flow, Sarir atmospheric/pumparound/side-stripper and Big Hill atmospheric/vacuum feed-temperature/reflux qualification. Slow-tagged suites were not included in this repair run; previous broader counts are historical evidence. python3 devtools/run_spotless.py apply and check, engineering-coverage generation and --check, python3 devtools/check_documentation_search.py, and both exact pre-commit hook stages pass. Hosted CI remains pending on the published head.

2026-10-06 - Visund well-to-export model with gas injection and seven formation fluids tuned to Fluid Symphony PVT (ProcessPilot package)

Type: B (Process / production optimisation) Keywords: well to export, gas condensate and oil, gas injection window, Uleberg P/A split factor, fluid tuning quality before and after, produced-gas heavy-end leaning, stock-tank oil basis, hold-out window, anchored compressor maps, utilisation register, throughput sweep Solution: Thirteen producers recombined from seven tuned fluid groups to PDM allocated rates; eight ProcessSystems in a ProcessModel (wells, separation, compression, export, injection, oil, recycle, water); three plant windows (calibration, hold-out, 2020 gas-injection window); LP-stage anti-surge recycle derived from measured motor power; throughput sweep and Monte Carlo on the headroom of the 4th-stage GT. Notes: A single factor on the allocated oil closed the calibration window and failed the hold-outs; the cause was the C5+ content of the standard gas of the discovery-gas fluids. A produced-gas heavy-end leaning fitted on one window carried to the hold-out window (export oil +0.4 %). Benchmark oil on the stock-tank basis (flash to 15 C, 1 atm). Report the untuned fluid next to the tuned fluid per sample and label each metric fit target or check. Window C needs its own leaning and shows that maps anchored on one window do not transfer (4th-stage speed -10 %).

2026-10-07 - Tie-in bottleneck study for a satellite oil field to an existing platform process model (ProcessPilot package)

Type: B (Process / host capacity) Keywords: tie-in, host bottleneck, utilisation register, plan profiles by field, annual-mean and p90-day rates, linear response per (unit, metric), ullage, Monte Carlo on response surface, turndown versus capacity Solution: Every manifold of the existing platform model is split into oil, gas and water at standard conditions with the model EOS and scaled to the plan rates of its field; the satellite fluid is mapped to the model pseudo-components by molar-mass interpolation and mixed into the HP manifold. Eleven cases (host plan, three satellite profiles, host upside, x2 satellite) at annual-mean and p90-day rates ran as resumable parallel jobs; ullage, tornado and a 20 000-draw Monte Carlo come from a response surface fitted per (unit, metric) to the runs. Notes: Scale every manifold of a field, including the test-separator manifold; leaving it out added about 1 MSm3/d gas to every case. Interpolate per (unit, metric): the binding metric of a vessel switched from water to oil when the satellite oil was added and the best-metric slope was wrong by a factor of three. Surge and minimum-flow rows are turndown, not capacity. Annual-mean plan rates hid the exceedances that appear at p90-day rates (PDM p90 over mean 1.17-1.21). Case runs at low gas flow (swing compressors idle) took 15-60 min or did not converge; plan the run budget for the declining years. generate_work_record.py now accepts a list-form figure_captions. Produced water and water injection are outside the model: use demonstrated peaks and one STID design case and say so.

2026-10-08: PR #4127 main-steam runtime and merge-conflict repair

Reproduced the unchanged main-column steam screen timeout on head 3217716 at 402 seconds locally. Profiling identified eager transport-property initialization on inactive multiphase search templates during repeated tray PH flashes. Defer that initialization until the existing lazy property accessor is used; preserve phase cloning, mixing rules and every equilibrium/refinement gate. New regressions verify deferred first access and identical gas/oil/aqueous splits and final density, viscosity and conductivity compared with an eagerly initialized template.

Sequential terminal recovery previously waited through 54 sweeps before a successful coupled correction. Add a checkpoint after at most twenty sweeps, try the same isolated Newton correction, and continue the existing full recovery sequence if it fails. The checkpoint is only a seed: adoption still requires the existing specifications and physical convergence gates. Record the final accepted MESH state in the exact-reuse fingerprint after polishing, including active convergence settings. Regression checks require zero-iteration unchanged reuse and invalidate it after a tolerance change. The unchanged steam suite now passes in 125 seconds, including its 240-second timeout and conservation assertions. An experimental PH step change was rejected after a two-phase regression; shared PH and TP solvers remain unchanged. No expected result, tolerance or user iteration cap is relaxed.

Resolved the master task-log conflict by preserving both histories and incorporated master 133bc17 without rewriting the existing PR history. Documentation impact: distillation recovery checkpoints and deferred inactive transport initialization in the distillation and physical-properties guides; regenerate engineering coverage.

Validation of the final repair: 193 tests run, 192 passing and one existing disabled test, with zero failures/errors. Includes slow-tagged distillation, unchanged main steam, Sarir pumparound/side-stripper, Big Hill vacuum sensitivities, cache/mode/ coordinated flow, water-rich phase refinement, PH warm-start policy, oil RVP, pump, Eclipse-fluid and host-feed regressions. The main steam method completes in 151.832 seconds in this combined run. Six edited Java sources/tests compile with --release 8. NeqSim 3.23.0, OpenJDK 17.0.20 and Python 3.12.14. Repeated stable Spotless apply, Spotless check, both all-file hook stages, regenerated engineering-coverage freshness, documentation-search audit, Javadoc and diff checks pass. Hosted CI remains pending on the published repair; the PR stays draft. Notes: Export gas and water close by construction when allocations are the input; judge the model on oil volume and density, gas density, compressor suction flows and temperatures. The untuned EOS gave nearly the same plant-level numbers although Psat error fell from 11 % to 2 %. Shaft power far below measured points to anti-surge recycle, not efficiency; it stays an open item until recycle and vendor maps are modelled. getMolarMass() returns kg/mol, so yields per kmol need a factor 1000. A Souders-Brown K without internals data gave a misleading 3x scrubber load: use an inferred row from the connected compressor flow instead. The gas-cap S and heavy scale sit at their bounds, which is a finding.

2026-10-09: APbo valuation of an undrilled NCS licence (screening)

2026-10-09: APbo valuation of two unnamed NCS opportunities in a producing licence (screening)

2026-10-09: APbo valuation of PL193 Kvitebjorn Nord (screening)

2026-10-09: Early removal of a North Sea oil FPSO - storage, P&A, injection and business case (screening)

2026-10-09: Gas export crossover and compression-stage bypass on a North Sea satellite platform (screening)

2026-10-09: Subsea tie-back to a gas host as a supplement to a platform extension: work process, value, timeline (screening)

2026-10-09: Subsea prospect tie-back screening and relinquishment decision on an NCS subsea host (screening)

2026-10-09: Opportunity screening for an infill sidetrack and two undrilled prospects around a host-limited NCS subsea oil field (screening)

2026-10-09: Reroute of a Midgard inlet separator train to the low-pressure reinjection compression system for low-pressure production of a subsea gas-condensate area (screening)

2026-10-09: Business-level and screening input for a licence with undrilled prospects and an external operator on the NCS (screening)

2026-10-09: Satellite oil discovery development screening and VPbo documentation (NCS subsea host) (screening)

2026-10-09: Prospect tie-back to an NCS subsea host, prepare-for-success and early onboarding screening (screening)

2026-10-09: Partner-operated exploration well on a non-Equinor-operated host, APbo decision support (screening)

2026-10-09: Increased heat recovery from gas-turbine exhaust to cut electrode-boiler power (NCS field centre) (screening)

2026-10-10: Reset of a subsea tie-back extension project (HEP VPbo): design alternatives, design-to-cost and upside (screening)

2026-10-09: Heater solution to enable better control of temperature at Kristin (BRP item, screening)

2026-10-10: VPbo Afrodite PL293 - development solution, timing and host (screening)

2026-10-10: Linnorm Lange development - exploration preparation and host choice (screening)

2026-10-10: Revitalization screening of a depleted HPHT gas-condensate field (drainage points, drilling window, value)

2026-10-10: POL opportunities Greater Horda - APbo valuation of five partner-operated licences (screening)

2026-10-10: POL opportunities Greater Tampen - APbo valuation of four partner-operated licences (screening)

2026-10-10: OFC RC7 Shetland Chalk further development - test planning, drainage strategy and stage-gate pipeline (screening)

2026-10-10: OSF low export pressure - compression stages and gas-lift booster (screening)

2026-10-10: Partner-operated exploration well in a gas-condensate province - APbo screening with two candidate hosts

2026-10-10: Exploration strategy for a near-field cellar target - dedicated well versus sidetrack from a planned producer (APbo screening)

2026-10-10: Exploration strategy for a deeper cellar target under a producing subsea field - pilot in a planned producer versus dedicated well (APbo screening)

2026-10-10: HPHT discovery cluster tied in to a mature gas host - startup shifted to 2031 (Big Room Planning screening)

2026-10-10: Reilly APbo (POL) - Equinor review of a partner-operated exploration well, PL1307 (Big Room Planning screening)

2026-10-10: Iskrem - Prepare for success in exploration (Big Room Planning screening)

2026-10-10 — PR 4283 agent routing and CI repair

Type: G (Workflow) Keywords: agent routing, external skills, HAZOP, well-to-export, PR 4283 Solution: Registered the verified community NCS ownership and shelf-data skills in .github/external-skill-refs.txt; clarified the process-model and safety-depressuring agent descriptions so the existing well-to-export and HAZOP routing regressions pass in a core-only checkout. Documented intentional optional-dependency and file-read exception handling in the Sodir statistics and task-results validators. Notes: Existing routing expectations were retained. No Java or numerical behavior changed. Agent descriptions remain within the 500-character limit.

2026-10-11 - Bacalhau well-to-export model for ProcessPilot

Type: B (Process) Keywords: well-to-export, FPSO, Uleberg fluid tuning, PI historian benchmark, ProcessPilot, bottleneck screening Solution: One ProcessSystem per area in a ProcessModel (wells, separation, LP/MP compression, gas treatment with parallel HP1-HP2-GIC trains, oil, recycle); Barra Velha fluids tuned on the common P/A EOS to Fluid Symphony PVT with one global C1-heavy kij offset; PI multiphase-meter rates because PDM holds no allocation; oil factor and compressor efficiencies calibrated on one window and held out on two. Result: Fiscal oil and injection gas within 3 %, hold-out compressor discharge temperatures within 2.6 K, HP1 driver power is the first limit (about 19 % rate headroom with one HP train); stage-wise flash-gas split not validated because the separator gas meters do not close on the compressed gas. Notes: Tuning quality reported per sample in pvt_tuning_quality. Tooling: Bacalhau lessons added to enterprise-process-notebook-workspace. No NeqSim Java change; GasScrubber classifies dense supercritical gas as liquid (handled in the model).

2026-10-13 — Prepare 3.25.0 and repair Maven Central publication

User requested a new 3.25.0 release from current master, preserving published 3.24.0. Baseline: d27433c40ba52cd6d647462f3ba388f1a7fc8dce, eight commits after v3.24.0. Updated the core, Java 8 and MCP revisions and maintained installation/citation references. Pinned the wrapper to Maven 3.9.16: a clean minimal Sonatype 0.11.0 bundle comparison reproduced local metadata/bookkeeping files with 3.10.0 and their absence with 3.9.16. The comparison used dummy credentials and a loopback-only failed upload; no artifact was published during local validation. Both release profiles now wait for PUBLISHED. Validation: Java getting-started documentation tests (2 passed), direct Spotless check, documentation-search audit (788 Markdown pages and one HTML page), and diff whitespace check. Package qualification and hosted release publication are tracked in the release PR. Documentation impact: installation examples, citation and release build provenance updated.

2026-10-13 — Trace-water flash repair acceptance and cost qualification

Type: E (Feature) Keywords: TPflash, trace water, aqueous, PSflash, pump, PR 4320, conservation, performance Solution: TPflash bounds the existing aqueous repair, avoids duplicate EOS initialization, and validates repaired endpoints before public return. TPflashTraceWaterRepairTest adds public SRK/PR/CPA lifecycle and pump closure checks plus explicit failure/guard contracts. Notes: Local acceptance targets are material balance 1e-10, normalization 1e-12, and log-fugacity residual 1e-8; ordinary TP/PS tolerances are unchanged. Expanded endpoint benchmark records allocation and p95 alongside numerical validity. Synthetic public cases qualify lifecycle behavior, not the unavailable original process snapshot or experimental phase behavior.

2026-10-14 — PR 4320 reservoir compatibility and bounded repair cost

Type: B (Bug fix) Keywords: trace water, TPflash, flow scaling, reservoir, conservation, performance Solution: Corrected cancellation in SystemThermo.setTotalFlowRate by rebuilding positive component inventories. Trace-water gas/aqueous recovery now retains its qualified candidate instead of replaying the ordinary flash; stalled/non-finite repairs stop early. Acceptance tolerances and final failure reporting remain unchanged. Validation: The public reservoir reproducer fails at exact prior head 645e5e6; the two updated/new test classes expose seven failures there. The candidate passes 397 focused and integration tests with no failures/errors (one pre-existing disabled display test), including all previously failing reservoir/well/field classes. Changed Java compiles with --release 8; the complete Maven build and test execution use Java 17. Numerical qualification includes component inventory, normalization, equilibrium, repeated state changes and pump closure. Documentation impact: Flow-setter guide and TP-flash algorithm document the corrected inventory scaling, bounded failure handling and candidate transfer. Exact-head CI and paired full-flash/process timings are recorded in PR 4320; this is not a global stability certificate.

Current-master integration (b0de5165) also passes the expanded regression set, including network topology, well-flow and named-component wax fraction coverage. Both numerical fixes and strict recovery qualification are retained; generated engineering coverage is rebuilt.

2026-10-14 — PR 4320 broad-process regression repair

Type: B (Bug fix) Keywords: flow inventory, cancellation, distillation, VLP, reservoir, performance Solution: Restrict positive inventory rebuilding to downward flow changes whose prospective component or total difference update loses more than 1e-12 relative accuracy. Accurate ordinary updates, upward changes and same-rate updates keep their established arithmetic. The check uses no additional EOS initialization, clone or temporary array. Two-fluid VLP now retains its cloned reference inventory for intensive properties and applies the trial rate only in its existing velocity calculation, avoiding unnecessary initialization at positive near-zero rates. Engineering evidence: The previous reservoir setter produced 1,260,096.07887 kg/hr oil for a requested 1,259,689.92248 kg/hr (0.0322% excess). Correct inventory gives the requested rate and 355.175066 bara after ten annual depletion/injection steps. The regression retains its 0.1 bar pressure tolerance and now checks all four requested rates, each component inventory against integrated production/injection, and constant reservoir volume at every step. Independent audit found maximum relative component imbalance of 1.50e-16 and relative volume error below 1.5e-12. The VLP regression covers positive near-zero rate continuity, reference-flow magnitude invariance and preservation of the source stream. The existing explicit zero-flow boundary is unchanged. Validation: Reproduced ten failures at 2b67ee0; the same 76 affected tests pass on master b0de5165. Final expanded test results, formatting/documentation gates and paired performance measurements are recorded in the PR validation update. No physical acceptance threshold is relaxed. Documentation impact: Updated flow-setting and well-simulation guides and the setter JavaDoc.