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.
Files changed (214) hide show
  1. {gea_program-0.3.0/gea_program.egg-info → gea_program-0.5.0}/PKG-INFO +185 -10
  2. {gea_program-0.3.0 → gea_program-0.5.0}/README.md +184 -9
  3. gea_program-0.5.0/gea/BENCH_TEST_PROTOCOL.md +91 -0
  4. {gea_program-0.3.0 → gea_program-0.5.0}/gea/__init__.py +25 -34
  5. {gea_program-0.3.0 → gea_program-0.5.0}/gea/__main__.py +456 -61
  6. {gea_program-0.3.0 → gea_program-0.5.0}/gea/acceptance_tests.py +1197 -97
  7. {gea_program-0.3.0 → gea_program-0.5.0}/gea/alarm_engine.py +54 -9
  8. gea_program-0.5.0/gea/bench.py +123 -0
  9. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +1 -1
  10. gea_program-0.5.0/gea/certificates.py +130 -0
  11. {gea_program-0.3.0 → gea_program-0.5.0}/gea/cli.py +37 -10
  12. {gea_program-0.3.0 → gea_program-0.5.0}/gea/client_reports.py +128 -15
  13. {gea_program-0.3.0 → gea_program-0.5.0}/gea/dashboard.py +110 -4
  14. gea_program-0.5.0/gea/doctor.py +214 -0
  15. {gea_program-0.3.0 → gea_program-0.5.0}/gea/downhole_engine.py +70 -163
  16. {gea_program-0.3.0 → gea_program-0.5.0}/gea/drift_monitor.py +1 -1
  17. {gea_program-0.3.0 → gea_program-0.5.0}/gea/fat_sat.py +7 -0
  18. gea_program-0.5.0/gea/files.py +380 -0
  19. gea_program-0.5.0/gea/gauge_aging.py +61 -0
  20. {gea_program-0.3.0 → gea_program-0.5.0}/gea/gauge_specs.py +31 -41
  21. gea_program-0.5.0/gea/help/TESTER_GUIDE.md +163 -0
  22. gea_program-0.5.0/gea/help/alarms.md +13 -0
  23. gea_program-0.5.0/gea/help/data-in.md +13 -0
  24. gea_program-0.5.0/gea/help/doctor.md +13 -0
  25. gea_program-0.5.0/gea/help/drift.md +13 -0
  26. gea_program-0.5.0/gea/help/files.md +13 -0
  27. gea_program-0.5.0/gea/help/instruments.md +13 -0
  28. gea_program-0.5.0/gea/help/notifications.md +13 -0
  29. gea_program-0.5.0/gea/help/patches.md +13 -0
  30. gea_program-0.5.0/gea/help/quality.md +13 -0
  31. gea_program-0.5.0/gea/help/seismic.md +13 -0
  32. gea_program-0.5.0/gea/help/site.md +15 -0
  33. gea_program-0.5.0/gea/help/start.md +13 -0
  34. gea_program-0.5.0/gea/help/transients.md +13 -0
  35. gea_program-0.5.0/gea/help/upkeep.md +13 -0
  36. gea_program-0.5.0/gea/help/well-tests.md +13 -0
  37. gea_program-0.5.0/gea/helplib.py +167 -0
  38. gea_program-0.5.0/gea/housekeeping.py +153 -0
  39. gea_program-0.5.0/gea/loadtest.py +115 -0
  40. {gea_program-0.3.0 → gea_program-0.5.0}/gea/matplotlib_demo.py +6 -5
  41. {gea_program-0.3.0 → gea_program-0.5.0}/gea/model_card.py +14 -16
  42. gea_program-0.5.0/gea/notify.py +348 -0
  43. {gea_program-0.3.0 → gea_program-0.5.0}/gea/operator_app.py +22 -50
  44. {gea_program-0.3.0 → gea_program-0.5.0}/gea/ports.py +6 -1
  45. {gea_program-0.3.0 → gea_program-0.5.0}/gea/qt6_downhole_app.py +12 -32
  46. {gea_program-0.3.0 → gea_program-0.5.0}/gea/reconciler.py +31 -32
  47. gea_program-0.5.0/gea/reference/libmseed_steim.provenance.json +20 -0
  48. gea_program-0.5.0/gea/reference/libmseed_steim1_4096.mseed +0 -0
  49. gea_program-0.5.0/gea/reference/libmseed_steim2_4096.mseed +0 -0
  50. gea_program-0.5.0/gea/reference/libmseed_steim2_512.mseed +0 -0
  51. gea_program-0.5.0/gea/seismic.py +801 -0
  52. gea_program-0.5.0/gea/seismic_detect.py +298 -0
  53. gea_program-0.5.0/gea/sensor_swap.py +221 -0
  54. {gea_program-0.3.0 → gea_program-0.5.0}/gea/service.py +615 -21
  55. gea_program-0.5.0/gea/service_life.py +116 -0
  56. gea_program-0.5.0/gea/shut_in.py +201 -0
  57. {gea_program-0.3.0 → gea_program-0.5.0}/gea/tool_library.py +45 -79
  58. gea_program-0.5.0/gea/transient.py +247 -0
  59. {gea_program-0.3.0 → gea_program-0.5.0}/gea/web/app.html +201 -20
  60. {gea_program-0.3.0 → gea_program-0.5.0}/gea/workspace.py +3 -2
  61. {gea_program-0.3.0 → gea_program-0.5.0/gea_program.egg-info}/PKG-INFO +185 -10
  62. {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/SOURCES.txt +33 -2
  63. {gea_program-0.3.0 → gea_program-0.5.0}/pyproject.toml +2 -2
  64. gea_program-0.3.0/gea/BENCH_TEST_PROTOCOL.md +0 -96
  65. gea_program-0.3.0/gea/bench.py +0 -144
  66. gea_program-0.3.0/gea/case_study.py +0 -228
  67. gea_program-0.3.0/gea/quartz_hpht_extension.py +0 -152
  68. gea_program-0.3.0/gea/service_life.py +0 -173
  69. {gea_program-0.3.0 → gea_program-0.5.0}/LICENSE +0 -0
  70. {gea_program-0.3.0 → gea_program-0.5.0}/gea/accuracy_statement.py +0 -0
  71. {gea_program-0.3.0 → gea_program-0.5.0}/gea/blind_harness.py +0 -0
  72. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  73. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  74. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  75. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  76. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  77. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  78. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  79. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  80. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  81. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  82. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  83. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  84. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  85. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  86. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  87. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  88. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  89. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  90. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  91. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  92. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  93. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  94. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  95. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  96. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  97. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  98. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  99. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  100. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  101. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  102. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  103. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  104. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  105. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  106. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  107. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  108. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  109. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  110. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  111. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  112. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  113. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  114. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  115. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  116. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  117. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  118. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  119. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  120. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  121. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  122. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  123. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  124. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  125. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  126. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  127. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  128. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  129. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  130. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  131. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  132. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  133. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  134. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  135. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  136. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  137. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  138. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/med_160_sapropels.txt +0 -0
  139. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  140. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  141. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  142. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  143. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  144. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  145. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  146. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  147. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  148. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  149. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  150. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  151. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  152. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  153. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  154. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  155. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  156. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  157. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  158. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  159. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  160. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  161. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  162. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  163. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  164. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  165. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  166. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  167. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  168. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  169. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  170. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  171. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  172. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  173. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  174. {gea_program-0.3.0 → gea_program-0.5.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  175. {gea_program-0.3.0 → gea_program-0.5.0}/gea/config_versioning.py +0 -0
  176. {gea_program-0.3.0 → gea_program-0.5.0}/gea/correlation.py +0 -0
  177. {gea_program-0.3.0 → gea_program-0.5.0}/gea/deviation.py +0 -0
  178. {gea_program-0.3.0 → gea_program-0.5.0}/gea/earth_model.py +0 -0
  179. {gea_program-0.3.0 → gea_program-0.5.0}/gea/example_register_map.json +0 -0
  180. {gea_program-0.3.0 → gea_program-0.5.0}/gea/follower.py +0 -0
  181. {gea_program-0.3.0 → gea_program-0.5.0}/gea/forward_model.py +0 -0
  182. {gea_program-0.3.0 → gea_program-0.5.0}/gea/gamma.py +0 -0
  183. {gea_program-0.3.0 → gea_program-0.5.0}/gea/gravity_reference.py +0 -0
  184. {gea_program-0.3.0 → gea_program-0.5.0}/gea/inverse_engine.py +0 -0
  185. {gea_program-0.3.0 → gea_program-0.5.0}/gea/jobs.py +0 -0
  186. {gea_program-0.3.0 → gea_program-0.5.0}/gea/live_ports.py +0 -0
  187. {gea_program-0.3.0 → gea_program-0.5.0}/gea/modbus.py +0 -0
  188. {gea_program-0.3.0 → gea_program-0.5.0}/gea/mqtt_port.py +0 -0
  189. {gea_program-0.3.0 → gea_program-0.5.0}/gea/opcua_port.py +0 -0
  190. {gea_program-0.3.0 → gea_program-0.5.0}/gea/patches.py +0 -0
  191. {gea_program-0.3.0 → gea_program-0.5.0}/gea/profile_catalog.py +0 -0
  192. {gea_program-0.3.0 → gea_program-0.5.0}/gea/project.py +0 -0
  193. {gea_program-0.3.0 → gea_program-0.5.0}/gea/rock_inventory.py +0 -0
  194. {gea_program-0.3.0 → gea_program-0.5.0}/gea/sample_record.py +0 -0
  195. {gea_program-0.3.0 → gea_program-0.5.0}/gea/sample_well_profile.csv +0 -0
  196. {gea_program-0.3.0 → gea_program-0.5.0}/gea/sbom.py +0 -0
  197. {gea_program-0.3.0 → gea_program-0.5.0}/gea/segy.py +0 -0
  198. {gea_program-0.3.0 → gea_program-0.5.0}/gea/shell.py +0 -0
  199. {gea_program-0.3.0 → gea_program-0.5.0}/gea/sla_report.py +0 -0
  200. {gea_program-0.3.0 → gea_program-0.5.0}/gea/store_forward.py +0 -0
  201. {gea_program-0.3.0 → gea_program-0.5.0}/gea/strata_join.py +0 -0
  202. {gea_program-0.3.0 → gea_program-0.5.0}/gea/survey_cmd.py +0 -0
  203. {gea_program-0.3.0 → gea_program-0.5.0}/gea/survey_view.py +0 -0
  204. {gea_program-0.3.0 → gea_program-0.5.0}/gea/telemetry.py +0 -0
  205. {gea_program-0.3.0 → gea_program-0.5.0}/gea/well_assembler.py +0 -0
  206. {gea_program-0.3.0 → gea_program-0.5.0}/gea/well_test_validation.py +0 -0
  207. {gea_program-0.3.0 → gea_program-0.5.0}/gea/wits0.py +0 -0
  208. {gea_program-0.3.0 → gea_program-0.5.0}/gea/witsml.py +0 -0
  209. {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/dependency_links.txt +0 -0
  210. {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/entry_points.txt +0 -0
  211. {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/requires.txt +0 -0
  212. {gea_program-0.3.0 → gea_program-0.5.0}/gea_program.egg-info/top_level.txt +0 -0
  213. {gea_program-0.3.0 → gea_program-0.5.0}/setup.cfg +0 -0
  214. {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.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 (199 checks)
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, schedule,
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: imports, text, metadata; run by ci and ship.ps1)
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
- Two statements the product carries on its own model cards: the gauge aging
242
- envelope's lower bound is an engineering model with no field validation on
243
- record, and five of the fourteen back-tested strata quantities are NOT
244
- ACCEPTABLE at the 95 % target. Both are printed, never claimed otherwise.
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 (199 checks)
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, schedule,
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: imports, text, metadata; run by ci and ship.ps1)
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
- Two statements the product carries on its own model cards: the gauge aging
203
- envelope's lower bound is an engineering model with no field validation on
204
- record, and five of the fourteen back-tested strata quantities are NOT
205
- ACCEPTABLE at the 95 % target. Both are printed, never claimed otherwise.
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.