gea-program 0.3.0__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gea_program-0.3.0/gea_program.egg-info → gea_program-0.5.0}/PKG-INFO +185 -10
- {gea_program-0.3.0 → gea_program-0.5.0}/README.md +184 -9
- gea_program-0.5.0/gea/BENCH_TEST_PROTOCOL.md +91 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/__init__.py +25 -34
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/__main__.py +456 -61
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/acceptance_tests.py +1197 -97
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/alarm_engine.py +54 -9
- gea_program-0.5.0/gea/bench.py +123 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +1 -1
- gea_program-0.5.0/gea/certificates.py +130 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/cli.py +37 -10
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/client_reports.py +128 -15
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/dashboard.py +110 -4
- gea_program-0.5.0/gea/doctor.py +214 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/downhole_engine.py +70 -163
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/drift_monitor.py +1 -1
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/fat_sat.py +7 -0
- gea_program-0.5.0/gea/files.py +380 -0
- gea_program-0.5.0/gea/gauge_aging.py +61 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/gauge_specs.py +31 -41
- gea_program-0.5.0/gea/help/TESTER_GUIDE.md +163 -0
- gea_program-0.5.0/gea/help/alarms.md +13 -0
- gea_program-0.5.0/gea/help/data-in.md +13 -0
- gea_program-0.5.0/gea/help/doctor.md +13 -0
- gea_program-0.5.0/gea/help/drift.md +13 -0
- gea_program-0.5.0/gea/help/files.md +13 -0
- gea_program-0.5.0/gea/help/instruments.md +13 -0
- gea_program-0.5.0/gea/help/notifications.md +13 -0
- gea_program-0.5.0/gea/help/patches.md +13 -0
- gea_program-0.5.0/gea/help/quality.md +13 -0
- gea_program-0.5.0/gea/help/seismic.md +13 -0
- gea_program-0.5.0/gea/help/site.md +15 -0
- gea_program-0.5.0/gea/help/start.md +13 -0
- gea_program-0.5.0/gea/help/transients.md +13 -0
- gea_program-0.5.0/gea/help/upkeep.md +13 -0
- gea_program-0.5.0/gea/help/well-tests.md +13 -0
- gea_program-0.5.0/gea/helplib.py +167 -0
- gea_program-0.5.0/gea/housekeeping.py +153 -0
- gea_program-0.5.0/gea/loadtest.py +115 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/matplotlib_demo.py +6 -5
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/model_card.py +14 -16
- gea_program-0.5.0/gea/notify.py +348 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/operator_app.py +22 -50
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/ports.py +6 -1
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/qt6_downhole_app.py +12 -32
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/reconciler.py +31 -32
- gea_program-0.5.0/gea/reference/libmseed_steim.provenance.json +20 -0
- gea_program-0.5.0/gea/reference/libmseed_steim1_4096.mseed +0 -0
- gea_program-0.5.0/gea/reference/libmseed_steim2_4096.mseed +0 -0
- gea_program-0.5.0/gea/reference/libmseed_steim2_512.mseed +0 -0
- gea_program-0.5.0/gea/seismic.py +801 -0
- gea_program-0.5.0/gea/seismic_detect.py +298 -0
- gea_program-0.5.0/gea/sensor_swap.py +221 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/service.py +615 -21
- gea_program-0.5.0/gea/service_life.py +116 -0
- gea_program-0.5.0/gea/shut_in.py +201 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/tool_library.py +45 -79
- gea_program-0.5.0/gea/transient.py +247 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/web/app.html +201 -20
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/workspace.py +3 -2
- {gea_program-0.3.0 → gea_program-0.5.0/gea_program.egg-info}/PKG-INFO +185 -10
- {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/SOURCES.txt +33 -2
- {gea_program-0.3.0 → gea_program-0.5.0}/pyproject.toml +2 -2
- gea_program-0.3.0/gea/BENCH_TEST_PROTOCOL.md +0 -96
- gea_program-0.3.0/gea/bench.py +0 -144
- gea_program-0.3.0/gea/case_study.py +0 -228
- gea_program-0.3.0/gea/quartz_hpht_extension.py +0 -152
- gea_program-0.3.0/gea/service_life.py +0 -173
- {gea_program-0.3.0 → gea_program-0.5.0}/LICENSE +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/accuracy_statement.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/blind_harness.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/med_160_sapropels.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/config_versioning.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/correlation.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/deviation.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/earth_model.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/example_register_map.json +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/follower.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/forward_model.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/gamma.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/gravity_reference.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/inverse_engine.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/jobs.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/live_ports.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/modbus.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/mqtt_port.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/opcua_port.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/patches.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/profile_catalog.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/project.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/rock_inventory.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/sample_record.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/sample_well_profile.csv +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/sbom.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/segy.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/shell.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/sla_report.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/store_forward.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/strata_join.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/survey_cmd.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/survey_view.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/telemetry.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/well_assembler.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/well_test_validation.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/wits0.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea/witsml.py +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/dependency_links.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/entry_points.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/requires.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/top_level.txt +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/setup.cfg +0 -0
- {gea_program-0.3.0 → gea_program-0.5.0}/tests/test_acceptance.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gea-program
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
|
|
5
5
|
Author: Daniel T. Murphy
|
|
6
6
|
License: MPL-2.0
|
|
@@ -92,6 +92,14 @@ reaches a client document. Nothing unmeasured is ever reported as met.
|
|
|
92
92
|
- **Survey track** (`earth_model.py`, `strata_join.py`, `inverse_engine.py`,
|
|
93
93
|
`blind_harness.py`, `rock_inventory.py`, `forward_model.py`, ...): strata
|
|
94
94
|
property estimation over a public co-located library, blind-scored on every run.
|
|
95
|
+
- **The second leg - seismic** (`seismic.py`, `seismic_detect.py`): raw seismic
|
|
96
|
+
records in (miniSEED with Steim1/Steim2, SAC, or fetched from any FDSN
|
|
97
|
+
archive - TexNet, EarthScope), Welch spectra, spectrograms and the persistent
|
|
98
|
+
lines above the local floor out, and the detectability test: one station's
|
|
99
|
+
record against a list of known rigs with positions and working windows,
|
|
100
|
+
verdict per rig, the detection radius bracketed between the farthest rig
|
|
101
|
+
heard and the nearest not heard. The decoder is proven against records
|
|
102
|
+
written by libmseed. See *The second leg*.
|
|
95
103
|
|
|
96
104
|
## Quick start
|
|
97
105
|
|
|
@@ -103,11 +111,17 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
|
|
|
103
111
|
gea client-report --report accuracy --out client_report
|
|
104
112
|
gea model-cards --out model_cards
|
|
105
113
|
gea sbom --out sbom
|
|
106
|
-
gea accept # the product gate (
|
|
114
|
+
gea accept # the product gate (246 checks)
|
|
115
|
+
gea help drift # the help library, by the job (15 pages; the same text is on every dashboard page)
|
|
107
116
|
gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
|
|
108
117
|
gea gui # the desktop window (pip install "gea-program[desktop]")
|
|
109
118
|
gea workspace --path C:\site --action init --name "Pad 3" # a site folder
|
|
110
119
|
gea serve --workspace C:\site # the dashboard as the door: http://127.0.0.1:8765/
|
|
120
|
+
gea doctor --workspace C:\site # which code runs, can it serve, with every fix
|
|
121
|
+
gea files --workspace C:\site --action list --root historian # the import roots, detection by content, import, export, packs
|
|
122
|
+
gea transient --file historian.csv --params params.json --out pta # shut-ins and build-up analysis with a band
|
|
123
|
+
gea seismic --action detect --file tx.mseed --station-lat 31.9 --station-lon -102.1 --sources rigs.csv # the second leg: is a known rig in this record?
|
|
124
|
+
gea swaps / gea certificates / gea notify / gea housekeeping / gea loadtest # instruments, notification rules, site upkeep
|
|
111
125
|
```
|
|
112
126
|
|
|
113
127
|
`gea` is the front door (`gea/cli.py`); every other subcommand passes through to
|
|
@@ -186,11 +200,23 @@ alarms and commits configuration; **approver** decides well tests and re-fits;
|
|
|
186
200
|
ranking), Wells (add from a file, the catalogue or a live tag map; each well's
|
|
187
201
|
reports, quality, trends, tests and alarms), Patch panel (supervised sources,
|
|
188
202
|
their state and live values, their maps, live values), Alarms (the wall, acknowledge, definitions), Approvals (one queue),
|
|
203
|
+
Files (the import and export roots an administrator allows, browse with
|
|
204
|
+
detection by content, import into a well, "save to..." on every report, the
|
|
205
|
+
evidence pack, watch folders), Alarms (the wall: acknowledge one or all, shelve
|
|
206
|
+
with a reason and an expiry, unshelve; definitions), Approvals (one queue),
|
|
189
207
|
Configuration (versioned JSON with history, diff and rollback), Reports
|
|
190
208
|
(generate and open every report), Verification (the acceptance suite, FAT/SAT,
|
|
191
209
|
SBOM and the standalone check from the page), Survey (a LAS file in, a strata
|
|
192
|
-
report out), Jobs (every run with its log), Administration (users,
|
|
193
|
-
audit log).
|
|
210
|
+
report out), Jobs (every run with its log), Administration (users, live
|
|
211
|
+
sessions, file roots, schedule, site settings, notifications, audit log). A
|
|
212
|
+
search box in the header spans wells, alarms, reports, jobs, configuration,
|
|
213
|
+
patches and schedules; the navigation shows badge counts (unacknowledged
|
|
214
|
+
alarms, decisions waiting, failed jobs, patches down); Home opens with what
|
|
215
|
+
happened since your last sign-in; every page has a help panel (the Help
|
|
216
|
+
button hides them); every timestamp is shown in your time zone and every
|
|
217
|
+
value in your units (field or SI - "Your preferences", with site defaults
|
|
218
|
+
under Administration); a first-run guide walks a new site through its
|
|
219
|
+
settings, first well, people and first refresh; every page prints cleanly.
|
|
194
220
|
|
|
195
221
|
Every action the page takes is a job: `python -m gea <command>` run by the
|
|
196
222
|
service with its log kept under `jobs/`, so one code path serves the page, the
|
|
@@ -212,16 +238,151 @@ evaluations and change logs), `reports/` (the printed dashboard and every
|
|
|
212
238
|
report), `jobs/` (every run), `records/audit.jsonl`, `users.json`. All of it is
|
|
213
239
|
text: JSON, JSON lines, CSV, Markdown, HTML.
|
|
214
240
|
|
|
241
|
+
### The help library
|
|
242
|
+
|
|
243
|
+
`gea help` lists fifteen pages indexed by the job a reader arrives with -
|
|
244
|
+
start, bring data in, quality rules, drift, well tests, alarms and the month,
|
|
245
|
+
the site, instruments, shut-ins and build-ups, seismic (the second leg),
|
|
246
|
+
patches, files, notifications, which code is running, upkeep. Each page carries four lines and stops: the
|
|
247
|
+
command, what it writes, the one number to check, and what the page will not
|
|
248
|
+
call a measurement. The pages ship inside the package (`gea/help/`), and the
|
|
249
|
+
same text is what `/api/help` serves and what the dashboard shows under every
|
|
250
|
+
heading and under Help, so the terminal and the page cannot drift apart. The
|
|
251
|
+
click-by-click tester guide ships with them: `gea guide`.
|
|
252
|
+
|
|
253
|
+
### Which code is running
|
|
254
|
+
|
|
255
|
+
`gea doctor` answers the question every stale-page report comes down to:
|
|
256
|
+
which Python, which copy of the package, does pip's record match the code
|
|
257
|
+
that runs (an editable checkout or an installed release), is another copy
|
|
258
|
+
shadowing it, is the page present, which dependencies are installed, is a
|
|
259
|
+
newer release on PyPI; with `--workspace` it also checks the site folder, the
|
|
260
|
+
accounts, the patches, a free port and write access. Every finding carries
|
|
261
|
+
its fix. `gea serve` runs the same checks and does not start on a blocking
|
|
262
|
+
finding, so a stale page is never served silently.
|
|
263
|
+
|
|
264
|
+
### Notifications
|
|
265
|
+
|
|
266
|
+
Rules route events to channels: a webhook URL or an SMTP mailbox. Events:
|
|
267
|
+
`alarm.activated` (by priority), `alarm.shelved`, `job.failed`, `patch.down`
|
|
268
|
+
and `patch.up`, `approval.pending`, `file.imported`. A quiet window stops
|
|
269
|
+
repeats of the same key; every attempt and every suppression is in
|
|
270
|
+
`records/notifications.jsonl`; an SMTP password is read from the environment
|
|
271
|
+
variable the channel names, never from the configuration. `gea notify
|
|
272
|
+
--example` prints a configuration to commit as `notifications` (Administration
|
|
273
|
+
has the editor and a "send a test" button per channel).
|
|
274
|
+
|
|
275
|
+
### Instruments and transients
|
|
276
|
+
|
|
277
|
+
A swapped gauge is a new instrument. Record the swap on the well page (or
|
|
278
|
+
confirm one the step detector proposes - it looks for a jump in a gauge's
|
|
279
|
+
offset against its peers, which a process change does not produce) and the
|
|
280
|
+
drift fit restarts at the swap, with the swap printed in the report. File the
|
|
281
|
+
calibration certificate of each instrument (serial, lab, dates, stated
|
|
282
|
+
accuracy; the document is kept and hashed) and its status - VALID, EXPIRING,
|
|
283
|
+
EXPIRED, MISSING - is on the well page, on Home, and beside the measured bias
|
|
284
|
+
in the drift report, so a reader sees whether a bias is inside the
|
|
285
|
+
instrument's own class.
|
|
286
|
+
|
|
287
|
+
Every shut-in in a record (found by the rate channel, the on-stream hours, or
|
|
288
|
+
the pressure signature alone when there is no rate - marked so) gets a
|
|
289
|
+
build-up analysis on the next refresh: Horner slope and p* on a middle-time
|
|
290
|
+
region chosen by the flat Bourdet derivative, wellbore storage, and - once the
|
|
291
|
+
rock and fluid parameters are saved on the well page - kh, k, skin and the
|
|
292
|
+
radius of investigation, each with a 90 % band from a residual bootstrap. The
|
|
293
|
+
Shut-in and Pressure Transient report prints the region and the rule that
|
|
294
|
+
chose it; an analyst can move the region (`gea transient --mtr 2:40`) and the
|
|
295
|
+
result follows. It is the first look every shut-in should get automatically,
|
|
296
|
+
not a replacement for a full interpretation, and it says so.
|
|
297
|
+
|
|
298
|
+
### The second leg
|
|
299
|
+
|
|
300
|
+
The second leg of the program is seismic: the client's site records ground
|
|
301
|
+
motion that conventional processing treats as noise, and in that noise are
|
|
302
|
+
the machinery lines of every rig working within range - mud pumps and their
|
|
303
|
+
harmonics, rotary tables, engines. The leg starts with ingest and one measured
|
|
304
|
+
number, not with a map. `gea seismic` reads the two formats the archives and
|
|
305
|
+
most field recorders write (miniSEED with Steim1/Steim2 and integer/float
|
|
306
|
+
encodings, decided by content; SAC), fetches records from any FDSN web service
|
|
307
|
+
(`--base texnet` for the Texas network TX, `--base iris` for EarthScope), and
|
|
308
|
+
produces the standard spectral products: the Welch PSD, a spectrogram, and
|
|
309
|
+
the lines that persist above a running-median floor in the band where rig
|
|
310
|
+
machinery sits (1-50 Hz by default). The decoder is proven in the acceptance
|
|
311
|
+
suite against records written by libmseed, the format's reference
|
|
312
|
+
implementation (`gea/reference/`).
|
|
313
|
+
|
|
314
|
+
The first number is the detectability test (`--action detect`): one station's
|
|
315
|
+
continuous record, the station's position, and a CSV of known rigs - position
|
|
316
|
+
and working window from a public permit register or the operator's own
|
|
317
|
+
schedule. For every rig that worked alone for enough windows the test
|
|
318
|
+
compares the band power in its windows with the quiet baseline (the windows
|
|
319
|
+
when no listed rig was working) and says DETECTED or NOT_DETECTED, with the
|
|
320
|
+
excess in dB and the lines that belong to those windows and not to the quiet
|
|
321
|
+
ones; a rig that never worked alone is AMBIGUOUS, and a record with no quiet
|
|
322
|
+
hour gets NO_QUIET_BASELINE and no verdict at all. The result is the radius
|
|
323
|
+
bracketed between the farthest rig heard and the nearest not heard - the
|
|
324
|
+
station's measured reach for rigs like those on the list. Everything the leg
|
|
325
|
+
can later claim sits inside that radius. What the test will not call a
|
|
326
|
+
measurement is printed with it: a well's position or track (one station
|
|
327
|
+
detects, it does not locate - locating is the array step that comes after
|
|
328
|
+
this number exists), a radius beyond the farthest listed rig, anything about
|
|
329
|
+
a rig not on the list, and any quantity in physical units until a station's
|
|
330
|
+
response has been applied and named. `--action selftest` runs the test on a
|
|
331
|
+
synthetic scene and labels its output SIMULATION_SELF_TEST.
|
|
332
|
+
|
|
333
|
+
### Before a site goes live
|
|
334
|
+
|
|
335
|
+
`deploy/README.md` is the checklist: keep the service on the loopback
|
|
336
|
+
address and put a TLS proxy in front (`deploy/Caddyfile`,
|
|
337
|
+
`deploy/nginx-gea.conf`), start with `--behind-proxy`. The service itself
|
|
338
|
+
rate-limits sign-ins (five failures lock the name and the address for 15
|
|
339
|
+
minutes, audited), lists and revokes live sessions, sends the security
|
|
340
|
+
headers on every response, and `gea housekeeping --workspace C:\site --apply`
|
|
341
|
+
(schedule it daily from Administration) segments the append-only logs rather
|
|
342
|
+
than truncating them and prunes finished job folders and old recordings. `gea
|
|
343
|
+
loadtest --patches 16 --seconds 60 --with-service` tells you whether the site
|
|
344
|
+
machine carries the patches it will be given, with the page still answering.
|
|
345
|
+
|
|
346
|
+
## The standalone install kit
|
|
347
|
+
|
|
348
|
+
A client site often has no internet and no Python. The kit is one folder
|
|
349
|
+
(and one zip) that carries its own Python, the package and every dependency
|
|
350
|
+
as files, with the scripts a site needs; it installs without a network and
|
|
351
|
+
without administrator rights, and keeps the site's data in a separate
|
|
352
|
+
workspace folder it never deletes.
|
|
353
|
+
|
|
354
|
+
```
|
|
355
|
+
python tools/build_installer.py # dist/gea-program-<version>-win64/ and .zip (needs internet here, none there)
|
|
356
|
+
python tools/build_installer.py --extras live,plotting,xls # a smaller kit without the PyQt6 desktop window
|
|
357
|
+
python tools/build_installer.py --platform linux # a venv-based kit for a Linux site server
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
The kit carries every optional dependency by default - the live ports
|
|
361
|
+
(asyncua, paho-mqtt, pymodbus, pyserial), matplotlib, xlrd and the PyQt6
|
|
362
|
+
desktop window - so `gea sbom` from an installed kit lists all of them as
|
|
363
|
+
installed; and `report-samples/`, one rendered example of every report.
|
|
364
|
+
|
|
365
|
+
At the site: unzip, `install.cmd`, `start-dashboard.cmd`; the browser opens
|
|
366
|
+
`http://127.0.0.1:8765/`. `verify.cmd` runs the acceptance gate from the
|
|
367
|
+
installed kit (the client's own evidence), `register-service.cmd` starts the
|
|
368
|
+
dashboard at logon, `uninstall.cmd` removes the kit and leaves the workspace.
|
|
369
|
+
`SHA256SUMS.txt` lets the site verify the kit after copying it. Every tag
|
|
370
|
+
builds the Windows and Linux kits in CI (`build-installer.yml`), installs
|
|
371
|
+
them the way a client does, runs the gate from the installed kit, and
|
|
372
|
+
attaches the zips to the GitHub release of that tag.
|
|
373
|
+
|
|
215
374
|
## Layout
|
|
216
375
|
|
|
217
376
|
```
|
|
218
377
|
gea/ the package: engines, record layer, reports, monitor, dashboard, cli, shell, acceptance suite,
|
|
219
378
|
workspace, jobs, service, patches and web/app.html (the served dashboard)
|
|
220
379
|
gea/catalog/ 52 public archive entries, each with a provenance file
|
|
380
|
+
gea/reference/ miniSEED records written by libmseed, with their provenance: the decoder's independent reference
|
|
381
|
+
docs/report_samples/ one rendered example of every client report, from this build (tools/render_report_samples.py; SAMPLES.md names each command)
|
|
221
382
|
docs/ TESTER_GUIDE.md, REQUIREMENTS_MATRIX.md (the scope-of-work mirror that shaped the reports), examples/ (port configs),
|
|
222
383
|
SESSION_LOG.md (the working record, session by session),
|
|
223
384
|
commercial/ (pilot proposal, bench readiness, commercial use), HISTORY.md (the ship-by-ship record)
|
|
224
|
-
tools/ standalone_check.py (the self-contained guard
|
|
385
|
+
tools/ standalone_check.py (the self-contained guard; run by ci and ship.ps1), build_installer.py (the kit)
|
|
225
386
|
CHANGELOG.md per-release summary (a tag ships only with its section); SHIP_LOG.md is written by ship.ps1
|
|
226
387
|
tests/ pytest wrapper around the acceptance suite and the standalone check
|
|
227
388
|
```
|
|
@@ -238,10 +399,22 @@ density anchors and Vp ranges with their citations (Telford, Geldart and
|
|
|
238
399
|
Sheriff; Schon). Every catalogue entry under `gea/catalog/` has a provenance
|
|
239
400
|
file naming its public source.
|
|
240
401
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
402
|
+
The gauge aging rate the drift evaluation uses is the instrument's published
|
|
403
|
+
drift specification, read from a cited datasheet (`gea/gauge_specs.py`), with
|
|
404
|
+
nothing added for temperature or pressure - above the rating the rate is
|
|
405
|
+
flagged, not changed. The program carries no aging model of its own, no
|
|
406
|
+
engineering constant that is not a datasheet number, and no claim about a
|
|
407
|
+
gauge beyond what its datasheet says; `tools/standalone_check.py` fails the
|
|
408
|
+
build on the names, phrases and numbers of the model that once stood there.
|
|
409
|
+
The seismic leg is textbook signal processing - Welch's PSD estimate, a
|
|
410
|
+
running-median floor, band power, great-circle distance - and the decoder is
|
|
411
|
+
checked against libmseed; the synthetic scene behind its self-test states its
|
|
412
|
+
own assumptions (body-wave spreading, a Q) and is labelled as a scene, not a
|
|
413
|
+
ground. Two statements the product carries on its own model cards: the datasheet
|
|
414
|
+
rate has no field validation on record against a gauge with a known history
|
|
415
|
+
(`gea bench` is the instrument for it), and five of the fourteen back-tested
|
|
416
|
+
strata quantities are NOT ACCEPTABLE at the 95 % target. Both are printed,
|
|
417
|
+
never claimed otherwise.
|
|
245
418
|
|
|
246
419
|
## Shipping
|
|
247
420
|
|
|
@@ -251,7 +424,9 @@ not exist anywhere, every version in `SHIP_LOG.md` must have its tag, `python -m
|
|
|
251
424
|
accept` must be green, `SHIP_MESSAGE.txt` must start with the tag; then commit, tag,
|
|
252
425
|
push, and the remote tag must be seen before SHIPPED is printed. `CHANGELOG.md` must carry a
|
|
253
426
|
section headed by the tag, and `tools/standalone_check.py` must report no findings. `-DryRun` runs every
|
|
254
|
-
check and changes nothing; `-NoPush` stops after the local tag.
|
|
427
|
+
check and changes nothing; `-NoPush` stops after the local tag. Before the gate, after the bump:
|
|
428
|
+
`python tools/render_report_samples.py` re-renders `docs/report_samples/` from the new build
|
|
429
|
+
(section AM fails on a stale build number).
|
|
255
430
|
|
|
256
431
|
## Publishing to PyPI
|
|
257
432
|
|
|
@@ -53,6 +53,14 @@ reaches a client document. Nothing unmeasured is ever reported as met.
|
|
|
53
53
|
- **Survey track** (`earth_model.py`, `strata_join.py`, `inverse_engine.py`,
|
|
54
54
|
`blind_harness.py`, `rock_inventory.py`, `forward_model.py`, ...): strata
|
|
55
55
|
property estimation over a public co-located library, blind-scored on every run.
|
|
56
|
+
- **The second leg - seismic** (`seismic.py`, `seismic_detect.py`): raw seismic
|
|
57
|
+
records in (miniSEED with Steim1/Steim2, SAC, or fetched from any FDSN
|
|
58
|
+
archive - TexNet, EarthScope), Welch spectra, spectrograms and the persistent
|
|
59
|
+
lines above the local floor out, and the detectability test: one station's
|
|
60
|
+
record against a list of known rigs with positions and working windows,
|
|
61
|
+
verdict per rig, the detection radius bracketed between the farthest rig
|
|
62
|
+
heard and the nearest not heard. The decoder is proven against records
|
|
63
|
+
written by libmseed. See *The second leg*.
|
|
56
64
|
|
|
57
65
|
## Quick start
|
|
58
66
|
|
|
@@ -64,11 +72,17 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
|
|
|
64
72
|
gea client-report --report accuracy --out client_report
|
|
65
73
|
gea model-cards --out model_cards
|
|
66
74
|
gea sbom --out sbom
|
|
67
|
-
gea accept # the product gate (
|
|
75
|
+
gea accept # the product gate (246 checks)
|
|
76
|
+
gea help drift # the help library, by the job (15 pages; the same text is on every dashboard page)
|
|
68
77
|
gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
|
|
69
78
|
gea gui # the desktop window (pip install "gea-program[desktop]")
|
|
70
79
|
gea workspace --path C:\site --action init --name "Pad 3" # a site folder
|
|
71
80
|
gea serve --workspace C:\site # the dashboard as the door: http://127.0.0.1:8765/
|
|
81
|
+
gea doctor --workspace C:\site # which code runs, can it serve, with every fix
|
|
82
|
+
gea files --workspace C:\site --action list --root historian # the import roots, detection by content, import, export, packs
|
|
83
|
+
gea transient --file historian.csv --params params.json --out pta # shut-ins and build-up analysis with a band
|
|
84
|
+
gea seismic --action detect --file tx.mseed --station-lat 31.9 --station-lon -102.1 --sources rigs.csv # the second leg: is a known rig in this record?
|
|
85
|
+
gea swaps / gea certificates / gea notify / gea housekeeping / gea loadtest # instruments, notification rules, site upkeep
|
|
72
86
|
```
|
|
73
87
|
|
|
74
88
|
`gea` is the front door (`gea/cli.py`); every other subcommand passes through to
|
|
@@ -147,11 +161,23 @@ alarms and commits configuration; **approver** decides well tests and re-fits;
|
|
|
147
161
|
ranking), Wells (add from a file, the catalogue or a live tag map; each well's
|
|
148
162
|
reports, quality, trends, tests and alarms), Patch panel (supervised sources,
|
|
149
163
|
their state and live values, their maps, live values), Alarms (the wall, acknowledge, definitions), Approvals (one queue),
|
|
164
|
+
Files (the import and export roots an administrator allows, browse with
|
|
165
|
+
detection by content, import into a well, "save to..." on every report, the
|
|
166
|
+
evidence pack, watch folders), Alarms (the wall: acknowledge one or all, shelve
|
|
167
|
+
with a reason and an expiry, unshelve; definitions), Approvals (one queue),
|
|
150
168
|
Configuration (versioned JSON with history, diff and rollback), Reports
|
|
151
169
|
(generate and open every report), Verification (the acceptance suite, FAT/SAT,
|
|
152
170
|
SBOM and the standalone check from the page), Survey (a LAS file in, a strata
|
|
153
|
-
report out), Jobs (every run with its log), Administration (users,
|
|
154
|
-
audit log).
|
|
171
|
+
report out), Jobs (every run with its log), Administration (users, live
|
|
172
|
+
sessions, file roots, schedule, site settings, notifications, audit log). A
|
|
173
|
+
search box in the header spans wells, alarms, reports, jobs, configuration,
|
|
174
|
+
patches and schedules; the navigation shows badge counts (unacknowledged
|
|
175
|
+
alarms, decisions waiting, failed jobs, patches down); Home opens with what
|
|
176
|
+
happened since your last sign-in; every page has a help panel (the Help
|
|
177
|
+
button hides them); every timestamp is shown in your time zone and every
|
|
178
|
+
value in your units (field or SI - "Your preferences", with site defaults
|
|
179
|
+
under Administration); a first-run guide walks a new site through its
|
|
180
|
+
settings, first well, people and first refresh; every page prints cleanly.
|
|
155
181
|
|
|
156
182
|
Every action the page takes is a job: `python -m gea <command>` run by the
|
|
157
183
|
service with its log kept under `jobs/`, so one code path serves the page, the
|
|
@@ -173,16 +199,151 @@ evaluations and change logs), `reports/` (the printed dashboard and every
|
|
|
173
199
|
report), `jobs/` (every run), `records/audit.jsonl`, `users.json`. All of it is
|
|
174
200
|
text: JSON, JSON lines, CSV, Markdown, HTML.
|
|
175
201
|
|
|
202
|
+
### The help library
|
|
203
|
+
|
|
204
|
+
`gea help` lists fifteen pages indexed by the job a reader arrives with -
|
|
205
|
+
start, bring data in, quality rules, drift, well tests, alarms and the month,
|
|
206
|
+
the site, instruments, shut-ins and build-ups, seismic (the second leg),
|
|
207
|
+
patches, files, notifications, which code is running, upkeep. Each page carries four lines and stops: the
|
|
208
|
+
command, what it writes, the one number to check, and what the page will not
|
|
209
|
+
call a measurement. The pages ship inside the package (`gea/help/`), and the
|
|
210
|
+
same text is what `/api/help` serves and what the dashboard shows under every
|
|
211
|
+
heading and under Help, so the terminal and the page cannot drift apart. The
|
|
212
|
+
click-by-click tester guide ships with them: `gea guide`.
|
|
213
|
+
|
|
214
|
+
### Which code is running
|
|
215
|
+
|
|
216
|
+
`gea doctor` answers the question every stale-page report comes down to:
|
|
217
|
+
which Python, which copy of the package, does pip's record match the code
|
|
218
|
+
that runs (an editable checkout or an installed release), is another copy
|
|
219
|
+
shadowing it, is the page present, which dependencies are installed, is a
|
|
220
|
+
newer release on PyPI; with `--workspace` it also checks the site folder, the
|
|
221
|
+
accounts, the patches, a free port and write access. Every finding carries
|
|
222
|
+
its fix. `gea serve` runs the same checks and does not start on a blocking
|
|
223
|
+
finding, so a stale page is never served silently.
|
|
224
|
+
|
|
225
|
+
### Notifications
|
|
226
|
+
|
|
227
|
+
Rules route events to channels: a webhook URL or an SMTP mailbox. Events:
|
|
228
|
+
`alarm.activated` (by priority), `alarm.shelved`, `job.failed`, `patch.down`
|
|
229
|
+
and `patch.up`, `approval.pending`, `file.imported`. A quiet window stops
|
|
230
|
+
repeats of the same key; every attempt and every suppression is in
|
|
231
|
+
`records/notifications.jsonl`; an SMTP password is read from the environment
|
|
232
|
+
variable the channel names, never from the configuration. `gea notify
|
|
233
|
+
--example` prints a configuration to commit as `notifications` (Administration
|
|
234
|
+
has the editor and a "send a test" button per channel).
|
|
235
|
+
|
|
236
|
+
### Instruments and transients
|
|
237
|
+
|
|
238
|
+
A swapped gauge is a new instrument. Record the swap on the well page (or
|
|
239
|
+
confirm one the step detector proposes - it looks for a jump in a gauge's
|
|
240
|
+
offset against its peers, which a process change does not produce) and the
|
|
241
|
+
drift fit restarts at the swap, with the swap printed in the report. File the
|
|
242
|
+
calibration certificate of each instrument (serial, lab, dates, stated
|
|
243
|
+
accuracy; the document is kept and hashed) and its status - VALID, EXPIRING,
|
|
244
|
+
EXPIRED, MISSING - is on the well page, on Home, and beside the measured bias
|
|
245
|
+
in the drift report, so a reader sees whether a bias is inside the
|
|
246
|
+
instrument's own class.
|
|
247
|
+
|
|
248
|
+
Every shut-in in a record (found by the rate channel, the on-stream hours, or
|
|
249
|
+
the pressure signature alone when there is no rate - marked so) gets a
|
|
250
|
+
build-up analysis on the next refresh: Horner slope and p* on a middle-time
|
|
251
|
+
region chosen by the flat Bourdet derivative, wellbore storage, and - once the
|
|
252
|
+
rock and fluid parameters are saved on the well page - kh, k, skin and the
|
|
253
|
+
radius of investigation, each with a 90 % band from a residual bootstrap. The
|
|
254
|
+
Shut-in and Pressure Transient report prints the region and the rule that
|
|
255
|
+
chose it; an analyst can move the region (`gea transient --mtr 2:40`) and the
|
|
256
|
+
result follows. It is the first look every shut-in should get automatically,
|
|
257
|
+
not a replacement for a full interpretation, and it says so.
|
|
258
|
+
|
|
259
|
+
### The second leg
|
|
260
|
+
|
|
261
|
+
The second leg of the program is seismic: the client's site records ground
|
|
262
|
+
motion that conventional processing treats as noise, and in that noise are
|
|
263
|
+
the machinery lines of every rig working within range - mud pumps and their
|
|
264
|
+
harmonics, rotary tables, engines. The leg starts with ingest and one measured
|
|
265
|
+
number, not with a map. `gea seismic` reads the two formats the archives and
|
|
266
|
+
most field recorders write (miniSEED with Steim1/Steim2 and integer/float
|
|
267
|
+
encodings, decided by content; SAC), fetches records from any FDSN web service
|
|
268
|
+
(`--base texnet` for the Texas network TX, `--base iris` for EarthScope), and
|
|
269
|
+
produces the standard spectral products: the Welch PSD, a spectrogram, and
|
|
270
|
+
the lines that persist above a running-median floor in the band where rig
|
|
271
|
+
machinery sits (1-50 Hz by default). The decoder is proven in the acceptance
|
|
272
|
+
suite against records written by libmseed, the format's reference
|
|
273
|
+
implementation (`gea/reference/`).
|
|
274
|
+
|
|
275
|
+
The first number is the detectability test (`--action detect`): one station's
|
|
276
|
+
continuous record, the station's position, and a CSV of known rigs - position
|
|
277
|
+
and working window from a public permit register or the operator's own
|
|
278
|
+
schedule. For every rig that worked alone for enough windows the test
|
|
279
|
+
compares the band power in its windows with the quiet baseline (the windows
|
|
280
|
+
when no listed rig was working) and says DETECTED or NOT_DETECTED, with the
|
|
281
|
+
excess in dB and the lines that belong to those windows and not to the quiet
|
|
282
|
+
ones; a rig that never worked alone is AMBIGUOUS, and a record with no quiet
|
|
283
|
+
hour gets NO_QUIET_BASELINE and no verdict at all. The result is the radius
|
|
284
|
+
bracketed between the farthest rig heard and the nearest not heard - the
|
|
285
|
+
station's measured reach for rigs like those on the list. Everything the leg
|
|
286
|
+
can later claim sits inside that radius. What the test will not call a
|
|
287
|
+
measurement is printed with it: a well's position or track (one station
|
|
288
|
+
detects, it does not locate - locating is the array step that comes after
|
|
289
|
+
this number exists), a radius beyond the farthest listed rig, anything about
|
|
290
|
+
a rig not on the list, and any quantity in physical units until a station's
|
|
291
|
+
response has been applied and named. `--action selftest` runs the test on a
|
|
292
|
+
synthetic scene and labels its output SIMULATION_SELF_TEST.
|
|
293
|
+
|
|
294
|
+
### Before a site goes live
|
|
295
|
+
|
|
296
|
+
`deploy/README.md` is the checklist: keep the service on the loopback
|
|
297
|
+
address and put a TLS proxy in front (`deploy/Caddyfile`,
|
|
298
|
+
`deploy/nginx-gea.conf`), start with `--behind-proxy`. The service itself
|
|
299
|
+
rate-limits sign-ins (five failures lock the name and the address for 15
|
|
300
|
+
minutes, audited), lists and revokes live sessions, sends the security
|
|
301
|
+
headers on every response, and `gea housekeeping --workspace C:\site --apply`
|
|
302
|
+
(schedule it daily from Administration) segments the append-only logs rather
|
|
303
|
+
than truncating them and prunes finished job folders and old recordings. `gea
|
|
304
|
+
loadtest --patches 16 --seconds 60 --with-service` tells you whether the site
|
|
305
|
+
machine carries the patches it will be given, with the page still answering.
|
|
306
|
+
|
|
307
|
+
## The standalone install kit
|
|
308
|
+
|
|
309
|
+
A client site often has no internet and no Python. The kit is one folder
|
|
310
|
+
(and one zip) that carries its own Python, the package and every dependency
|
|
311
|
+
as files, with the scripts a site needs; it installs without a network and
|
|
312
|
+
without administrator rights, and keeps the site's data in a separate
|
|
313
|
+
workspace folder it never deletes.
|
|
314
|
+
|
|
315
|
+
```
|
|
316
|
+
python tools/build_installer.py # dist/gea-program-<version>-win64/ and .zip (needs internet here, none there)
|
|
317
|
+
python tools/build_installer.py --extras live,plotting,xls # a smaller kit without the PyQt6 desktop window
|
|
318
|
+
python tools/build_installer.py --platform linux # a venv-based kit for a Linux site server
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
The kit carries every optional dependency by default - the live ports
|
|
322
|
+
(asyncua, paho-mqtt, pymodbus, pyserial), matplotlib, xlrd and the PyQt6
|
|
323
|
+
desktop window - so `gea sbom` from an installed kit lists all of them as
|
|
324
|
+
installed; and `report-samples/`, one rendered example of every report.
|
|
325
|
+
|
|
326
|
+
At the site: unzip, `install.cmd`, `start-dashboard.cmd`; the browser opens
|
|
327
|
+
`http://127.0.0.1:8765/`. `verify.cmd` runs the acceptance gate from the
|
|
328
|
+
installed kit (the client's own evidence), `register-service.cmd` starts the
|
|
329
|
+
dashboard at logon, `uninstall.cmd` removes the kit and leaves the workspace.
|
|
330
|
+
`SHA256SUMS.txt` lets the site verify the kit after copying it. Every tag
|
|
331
|
+
builds the Windows and Linux kits in CI (`build-installer.yml`), installs
|
|
332
|
+
them the way a client does, runs the gate from the installed kit, and
|
|
333
|
+
attaches the zips to the GitHub release of that tag.
|
|
334
|
+
|
|
176
335
|
## Layout
|
|
177
336
|
|
|
178
337
|
```
|
|
179
338
|
gea/ the package: engines, record layer, reports, monitor, dashboard, cli, shell, acceptance suite,
|
|
180
339
|
workspace, jobs, service, patches and web/app.html (the served dashboard)
|
|
181
340
|
gea/catalog/ 52 public archive entries, each with a provenance file
|
|
341
|
+
gea/reference/ miniSEED records written by libmseed, with their provenance: the decoder's independent reference
|
|
342
|
+
docs/report_samples/ one rendered example of every client report, from this build (tools/render_report_samples.py; SAMPLES.md names each command)
|
|
182
343
|
docs/ TESTER_GUIDE.md, REQUIREMENTS_MATRIX.md (the scope-of-work mirror that shaped the reports), examples/ (port configs),
|
|
183
344
|
SESSION_LOG.md (the working record, session by session),
|
|
184
345
|
commercial/ (pilot proposal, bench readiness, commercial use), HISTORY.md (the ship-by-ship record)
|
|
185
|
-
tools/ standalone_check.py (the self-contained guard
|
|
346
|
+
tools/ standalone_check.py (the self-contained guard; run by ci and ship.ps1), build_installer.py (the kit)
|
|
186
347
|
CHANGELOG.md per-release summary (a tag ships only with its section); SHIP_LOG.md is written by ship.ps1
|
|
187
348
|
tests/ pytest wrapper around the acceptance suite and the standalone check
|
|
188
349
|
```
|
|
@@ -199,10 +360,22 @@ density anchors and Vp ranges with their citations (Telford, Geldart and
|
|
|
199
360
|
Sheriff; Schon). Every catalogue entry under `gea/catalog/` has a provenance
|
|
200
361
|
file naming its public source.
|
|
201
362
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
363
|
+
The gauge aging rate the drift evaluation uses is the instrument's published
|
|
364
|
+
drift specification, read from a cited datasheet (`gea/gauge_specs.py`), with
|
|
365
|
+
nothing added for temperature or pressure - above the rating the rate is
|
|
366
|
+
flagged, not changed. The program carries no aging model of its own, no
|
|
367
|
+
engineering constant that is not a datasheet number, and no claim about a
|
|
368
|
+
gauge beyond what its datasheet says; `tools/standalone_check.py` fails the
|
|
369
|
+
build on the names, phrases and numbers of the model that once stood there.
|
|
370
|
+
The seismic leg is textbook signal processing - Welch's PSD estimate, a
|
|
371
|
+
running-median floor, band power, great-circle distance - and the decoder is
|
|
372
|
+
checked against libmseed; the synthetic scene behind its self-test states its
|
|
373
|
+
own assumptions (body-wave spreading, a Q) and is labelled as a scene, not a
|
|
374
|
+
ground. Two statements the product carries on its own model cards: the datasheet
|
|
375
|
+
rate has no field validation on record against a gauge with a known history
|
|
376
|
+
(`gea bench` is the instrument for it), and five of the fourteen back-tested
|
|
377
|
+
strata quantities are NOT ACCEPTABLE at the 95 % target. Both are printed,
|
|
378
|
+
never claimed otherwise.
|
|
206
379
|
|
|
207
380
|
## Shipping
|
|
208
381
|
|
|
@@ -212,7 +385,9 @@ not exist anywhere, every version in `SHIP_LOG.md` must have its tag, `python -m
|
|
|
212
385
|
accept` must be green, `SHIP_MESSAGE.txt` must start with the tag; then commit, tag,
|
|
213
386
|
push, and the remote tag must be seen before SHIPPED is printed. `CHANGELOG.md` must carry a
|
|
214
387
|
section headed by the tag, and `tools/standalone_check.py` must report no findings. `-DryRun` runs every
|
|
215
|
-
check and changes nothing; `-NoPush` stops after the local tag.
|
|
388
|
+
check and changes nothing; `-NoPush` stops after the local tag. Before the gate, after the bump:
|
|
389
|
+
`python tools/render_report_samples.py` re-renders `docs/report_samples/` from the new build
|
|
390
|
+
(section AM fails on a stale build number).
|
|
216
391
|
|
|
217
392
|
## Publishing to PyPI
|
|
218
393
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Bench-Test Protocol - Does this gauge drift within its datasheet?
|
|
2
|
+
|
|
3
|
+
The program judges a measured drift trend against one number: the
|
|
4
|
+
instrument's published drift specification (percent of full scale per year,
|
|
5
|
+
from its datasheet). That number is a specification, not a measurement of
|
|
6
|
+
the gauge in your hand. This protocol is the measurement: one gauge, one
|
|
7
|
+
held setpoint, one reference standard, enough weeks, and a verdict written
|
|
8
|
+
down - the bench record the drift report cites as `NONE ON RECORD` until it
|
|
9
|
+
exists.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. What is being tested
|
|
14
|
+
|
|
15
|
+
For a gauge of serial number S with datasheet drift specification D (%FS/yr):
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
measured drift rate (|slope| of the gauge's reading against the reference, at a held setpoint)
|
|
19
|
+
compared with D, with the slope's own standard error
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The outcome is one of four words (section 5). A gauge that drifts faster
|
|
23
|
+
than its datasheet is a finding, not an error.
|
|
24
|
+
|
|
25
|
+
## 2. Apparatus
|
|
26
|
+
|
|
27
|
+
- The gauge under test, with its serial number and its calibration
|
|
28
|
+
certificate id (both go on the record; `gea certificates` files the
|
|
29
|
+
certificate).
|
|
30
|
+
- A temperature-controlled bath or pressure vessel holding a setpoint inside
|
|
31
|
+
the gauge's rating (the rating check applies on the bench too).
|
|
32
|
+
- A reference pressure standard of a class better than the specification
|
|
33
|
+
under test (deadweight tester or transfer standard), logged at the same
|
|
34
|
+
cadence, or at least checked weekly and logged.
|
|
35
|
+
- Logging at one reading per day or better into the program's historian CSV
|
|
36
|
+
format (a timestamp or `time_s` column and one pressure column per
|
|
37
|
+
instrument).
|
|
38
|
+
|
|
39
|
+
## 3. Duration - the program's own rule applies
|
|
40
|
+
|
|
41
|
+
The reconciler refuses trend verdicts below its minimum span
|
|
42
|
+
(`ReconcilerConfig.min_trend_span_years`, the 18-day rule), and the bench
|
|
43
|
+
analysis reads that floor from the same configuration: a shorter record is
|
|
44
|
+
`INSUFFICIENT_SPAN`, no verdict. The protocol asks for **at least 90 days**
|
|
45
|
+
at setpoint; 180 days or more when the specification is tight (a 0.01 %FS/yr
|
|
46
|
+
gauge at 30,000 psi full scale drifts 3 psi in a year - 0.75 psi in 90
|
|
47
|
+
days - so the reference and the logging must resolve tenths of a psi).
|
|
48
|
+
|
|
49
|
+
## 4. Procedure
|
|
50
|
+
|
|
51
|
+
1. File the certificate (`gea certificates --action add ...`) and record the
|
|
52
|
+
serial number.
|
|
53
|
+
2. Install the gauge and the reference at the setpoint; log continuously.
|
|
54
|
+
3. Weekly: verify the setpoint against the reference; do not adjust the gauge
|
|
55
|
+
under test. Log every intervention.
|
|
56
|
+
4. Export the gauge's series and the reference's series as historian CSVs.
|
|
57
|
+
5. Run:
|
|
58
|
+
|
|
59
|
+
gea bench --gauge-csv gauge.csv --reference-csv reference.csv --spec geoq177_30k --serial SN --certificate CERT --out bench_register.jsonl
|
|
60
|
+
|
|
61
|
+
The reference series is subtracted first (the setpoint's own wander is
|
|
62
|
+
not the gauge's drift). `--spec` names the datasheet preset or a JSON
|
|
63
|
+
datasheet of your own.
|
|
64
|
+
6. Keep the record: the JSON line appended to the register carries the fit,
|
|
65
|
+
the band, the datasheet source, the serial, the certificate and the verdict.
|
|
66
|
+
|
|
67
|
+
## 5. Analysis and verdict vocabulary
|
|
68
|
+
|
|
69
|
+
- The slope of the (gauge - reference) series is fitted by least squares;
|
|
70
|
+
its standard error comes from the residuals.
|
|
71
|
+
- A band of k sigma (default 2) is placed around the measured rate.
|
|
72
|
+
- `WITHIN_DATASHEET` - the whole band is at or below the specification.
|
|
73
|
+
- `EXCEEDS_DATASHEET` - the whole band is above the specification: this
|
|
74
|
+
gauge, at these conditions, drifts faster than its datasheet says. A
|
|
75
|
+
first-class outcome.
|
|
76
|
+
- `INSUFFICIENT_SPAN` - shorter than the 18-day floor; no verdict.
|
|
77
|
+
- `INSUFFICIENT_SNR` - the band straddles the specification; a longer span
|
|
78
|
+
or a quieter setpoint is needed; no verdict.
|
|
79
|
+
|
|
80
|
+
`gea bench --selftest` runs the arithmetic on synthetic series and labels
|
|
81
|
+
its output `SIMULATION_SELF_TEST`; it proves nothing about a physical gauge.
|
|
82
|
+
|
|
83
|
+
## 6. What the record changes
|
|
84
|
+
|
|
85
|
+
Nothing in the program's arithmetic changes with a bench result; the
|
|
86
|
+
datasheet rate stays the rate the reports use. What changes is the model
|
|
87
|
+
card's `field validation` line, which can cite the register once a gauge
|
|
88
|
+
with a known history has been run, and the reader's confidence in a
|
|
89
|
+
`DRIFT_CONSISTENT` label on that instrument. An `EXCEEDS_DATASHEET` record
|
|
90
|
+
is the reason to recalibrate, replace or re-rate that gauge, and to file
|
|
91
|
+
the result with its certificate.
|