gea-program 0.56.0__tar.gz → 0.57.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 (368) hide show
  1. {gea_program-0.56.0/gea_program.egg-info → gea_program-0.57.0}/PKG-INFO +16 -2
  2. {gea_program-0.56.0 → gea_program-0.57.0}/README.md +15 -1
  3. {gea_program-0.56.0 → gea_program-0.57.0}/gea/__init__.py +1 -1
  4. {gea_program-0.56.0 → gea_program-0.57.0}/gea/__main__.py +9 -0
  5. {gea_program-0.56.0 → gea_program-0.57.0}/gea/acceptance_tests.py +162 -0
  6. {gea_program-0.56.0 → gea_program-0.57.0}/gea/cli.py +14 -1
  7. gea_program-0.57.0/gea/help/IT_SECURITY.md +138 -0
  8. {gea_program-0.56.0 → gea_program-0.57.0}/gea/helplib.py +8 -0
  9. {gea_program-0.56.0 → gea_program-0.57.0/gea_program.egg-info}/PKG-INFO +16 -2
  10. {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/SOURCES.txt +1 -0
  11. {gea_program-0.56.0 → gea_program-0.57.0}/pyproject.toml +1 -1
  12. {gea_program-0.56.0 → gea_program-0.57.0}/LICENSE +0 -0
  13. {gea_program-0.56.0 → gea_program-0.57.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  14. {gea_program-0.56.0 → gea_program-0.57.0}/gea/accuracy_statement.py +0 -0
  15. {gea_program-0.56.0 → gea_program-0.57.0}/gea/alarm_engine.py +0 -0
  16. {gea_program-0.56.0 → gea_program-0.57.0}/gea/alerts.py +0 -0
  17. {gea_program-0.56.0 → gea_program-0.57.0}/gea/backup.py +0 -0
  18. {gea_program-0.56.0 → gea_program-0.57.0}/gea/bench.py +0 -0
  19. {gea_program-0.56.0 → gea_program-0.57.0}/gea/blind_harness.py +0 -0
  20. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  21. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  22. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  23. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  24. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  25. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  26. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  27. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  28. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  29. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  30. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  31. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  32. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  33. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  34. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  35. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  36. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  37. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  38. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  39. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  40. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  41. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  42. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  43. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  44. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  45. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  46. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  47. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  48. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  49. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  50. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  51. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  52. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  53. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  54. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  55. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  56. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  57. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  58. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  59. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  60. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  61. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  62. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  63. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  64. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  65. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  66. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  67. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  68. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  69. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  70. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  71. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  72. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  73. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  74. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  75. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  76. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  77. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  78. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  79. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
  80. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  81. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  82. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  83. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  84. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  85. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  86. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  87. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/med_160_sapropels.txt +0 -0
  88. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  89. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  90. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  91. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  92. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  93. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  94. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  95. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  96. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  97. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  98. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  99. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  100. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  101. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  102. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  103. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  104. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  105. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  106. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  107. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  108. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  109. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  110. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  111. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  112. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  113. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  114. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  115. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  116. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  117. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  118. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  119. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  120. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  121. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  122. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  123. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  124. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog_map.py +0 -0
  125. {gea_program-0.56.0 → gea_program-0.57.0}/gea/catalog_register.py +0 -0
  126. {gea_program-0.56.0 → gea_program-0.57.0}/gea/certificates.py +0 -0
  127. {gea_program-0.56.0 → gea_program-0.57.0}/gea/client_reports.py +0 -0
  128. {gea_program-0.56.0 → gea_program-0.57.0}/gea/collision.py +0 -0
  129. {gea_program-0.56.0 → gea_program-0.57.0}/gea/config_versioning.py +0 -0
  130. {gea_program-0.56.0 → gea_program-0.57.0}/gea/conformance.py +0 -0
  131. {gea_program-0.56.0 → gea_program-0.57.0}/gea/control_room.py +0 -0
  132. {gea_program-0.56.0 → gea_program-0.57.0}/gea/correlation.py +0 -0
  133. {gea_program-0.56.0 → gea_program-0.57.0}/gea/dashboard.py +0 -0
  134. {gea_program-0.56.0 → gea_program-0.57.0}/gea/declarations.py +0 -0
  135. {gea_program-0.56.0 → gea_program-0.57.0}/gea/decline.py +0 -0
  136. {gea_program-0.56.0 → gea_program-0.57.0}/gea/deviation.py +0 -0
  137. {gea_program-0.56.0 → gea_program-0.57.0}/gea/dlis.py +0 -0
  138. {gea_program-0.56.0 → gea_program-0.57.0}/gea/dnp3.py +0 -0
  139. {gea_program-0.56.0 → gea_program-0.57.0}/gea/doctor.py +0 -0
  140. {gea_program-0.56.0 → gea_program-0.57.0}/gea/dossier.py +0 -0
  141. {gea_program-0.56.0 → gea_program-0.57.0}/gea/dossier_verify.py +0 -0
  142. {gea_program-0.56.0 → gea_program-0.57.0}/gea/downhole_engine.py +0 -0
  143. {gea_program-0.56.0 → gea_program-0.57.0}/gea/drift_monitor.py +0 -0
  144. {gea_program-0.56.0 → gea_program-0.57.0}/gea/drill_string.py +0 -0
  145. {gea_program-0.56.0 → gea_program-0.57.0}/gea/earth_model.py +0 -0
  146. {gea_program-0.56.0 → gea_program-0.57.0}/gea/economics.py +0 -0
  147. {gea_program-0.56.0 → gea_program-0.57.0}/gea/ed25519.py +0 -0
  148. {gea_program-0.56.0 → gea_program-0.57.0}/gea/edr.py +0 -0
  149. {gea_program-0.56.0 → gea_program-0.57.0}/gea/elevation.py +0 -0
  150. {gea_program-0.56.0 → gea_program-0.57.0}/gea/etp.py +0 -0
  151. {gea_program-0.56.0 → gea_program-0.57.0}/gea/etp12_schemas.json +0 -0
  152. {gea_program-0.56.0 → gea_program-0.57.0}/gea/example_register_map.json +0 -0
  153. {gea_program-0.56.0 → gea_program-0.57.0}/gea/fat_sat.py +0 -0
  154. {gea_program-0.56.0 → gea_program-0.57.0}/gea/files.py +0 -0
  155. {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/README.md +0 -0
  156. {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
  157. {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/comcat_mahoning_1990-2026.txt +0 -0
  158. {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
  159. {gea_program-0.56.0 → gea_program-0.57.0}/gea/fixtures/ne_110m_coastline.json +0 -0
  160. {gea_program-0.56.0 → gea_program-0.57.0}/gea/follower.py +0 -0
  161. {gea_program-0.56.0 → gea_program-0.57.0}/gea/forward_model.py +0 -0
  162. {gea_program-0.56.0 → gea_program-0.57.0}/gea/frac_hits.py +0 -0
  163. {gea_program-0.56.0 → gea_program-0.57.0}/gea/friction_priors.py +0 -0
  164. {gea_program-0.56.0 → gea_program-0.57.0}/gea/gamma.py +0 -0
  165. {gea_program-0.56.0 → gea_program-0.57.0}/gea/gauge_aging.py +0 -0
  166. {gea_program-0.56.0 → gea_program-0.57.0}/gea/gauge_specs.py +0 -0
  167. {gea_program-0.56.0 → gea_program-0.57.0}/gea/geodesy.py +0 -0
  168. {gea_program-0.56.0 → gea_program-0.57.0}/gea/geomag.py +0 -0
  169. {gea_program-0.56.0 → gea_program-0.57.0}/gea/gravity_reference.py +0 -0
  170. {gea_program-0.56.0 → gea_program-0.57.0}/gea/hartip.py +0 -0
  171. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/TESTER_GUIDE.md +0 -0
  172. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/alarms.md +0 -0
  173. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/alerts.md +0 -0
  174. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/audit-update.md +0 -0
  175. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/backup.md +0 -0
  176. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/catalog.md +0 -0
  177. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/charts.md +0 -0
  178. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/collision.md +0 -0
  179. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/company-sign-in.md +0 -0
  180. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/conformance.md +0 -0
  181. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/control-room.md +0 -0
  182. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/data-in.md +0 -0
  183. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/declare.md +0 -0
  184. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/decline.md +0 -0
  185. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/dlis.md +0 -0
  186. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/doctor.md +0 -0
  187. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/dossier.md +0 -0
  188. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/drift.md +0 -0
  189. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/drillstring.md +0 -0
  190. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/economics.md +0 -0
  191. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/edr.md +0 -0
  192. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/etp.md +0 -0
  193. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/field-ports.md +0 -0
  194. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/files.md +0 -0
  195. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/frac-hits.md +0 -0
  196. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/historian.md +0 -0
  197. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/https.md +0 -0
  198. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/instruments.md +0 -0
  199. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/interval.md +0 -0
  200. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/invoice-check.md +0 -0
  201. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/map.md +0 -0
  202. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/month-end.md +0 -0
  203. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/notifications.md +0 -0
  204. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/opseis.md +0 -0
  205. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/osdu.md +0 -0
  206. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/pad-summary.md +0 -0
  207. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/patches.md +0 -0
  208. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/penetrator.md +0 -0
  209. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/plan.md +0 -0
  210. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/pore-pressure.md +0 -0
  211. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/ppdm.md +0 -0
  212. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/quakeml.md +0 -0
  213. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/quality.md +0 -0
  214. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/report-history.md +0 -0
  215. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/rig-time.md +0 -0
  216. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/seedlink.md +0 -0
  217. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/seismic.md +0 -0
  218. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/setup.md +0 -0
  219. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/simulation.md +0 -0
  220. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/site.md +0 -0
  221. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/sites.md +0 -0
  222. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/slip.md +0 -0
  223. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/soak.md +0 -0
  224. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/sra.md +0 -0
  225. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/start.md +0 -0
  226. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/structure.md +0 -0
  227. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/tools.md +0 -0
  228. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/torque-drag.md +0 -0
  229. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/transients.md +0 -0
  230. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/upkeep.md +0 -0
  231. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/vibration.md +0 -0
  232. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/well-report.md +0 -0
  233. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/well-tests.md +0 -0
  234. {gea_program-0.56.0 → gea_program-0.57.0}/gea/help/well3d.md +0 -0
  235. {gea_program-0.56.0 → gea_program-0.57.0}/gea/housekeeping.py +0 -0
  236. {gea_program-0.56.0 → gea_program-0.57.0}/gea/interval.py +0 -0
  237. {gea_program-0.56.0 → gea_program-0.57.0}/gea/inverse_engine.py +0 -0
  238. {gea_program-0.56.0 → gea_program-0.57.0}/gea/invoice_check.py +0 -0
  239. {gea_program-0.56.0 → gea_program-0.57.0}/gea/jobs.py +0 -0
  240. {gea_program-0.56.0 → gea_program-0.57.0}/gea/live_ports.py +0 -0
  241. {gea_program-0.56.0 → gea_program-0.57.0}/gea/loadtest.py +0 -0
  242. {gea_program-0.56.0 → gea_program-0.57.0}/gea/matplotlib_demo.py +0 -0
  243. {gea_program-0.56.0 → gea_program-0.57.0}/gea/modbus.py +0 -0
  244. {gea_program-0.56.0 → gea_program-0.57.0}/gea/modbus_rtu.py +0 -0
  245. {gea_program-0.56.0 → gea_program-0.57.0}/gea/model_card.py +0 -0
  246. {gea_program-0.56.0 → gea_program-0.57.0}/gea/month_end.py +0 -0
  247. {gea_program-0.56.0 → gea_program-0.57.0}/gea/mqtt_port.py +0 -0
  248. {gea_program-0.56.0 → gea_program-0.57.0}/gea/notify.py +0 -0
  249. {gea_program-0.56.0 → gea_program-0.57.0}/gea/oidc.py +0 -0
  250. {gea_program-0.56.0 → gea_program-0.57.0}/gea/oidc_mock.py +0 -0
  251. {gea_program-0.56.0 → gea_program-0.57.0}/gea/op_seismicity.py +0 -0
  252. {gea_program-0.56.0 → gea_program-0.57.0}/gea/opcua_port.py +0 -0
  253. {gea_program-0.56.0 → gea_program-0.57.0}/gea/operator_app.py +0 -0
  254. {gea_program-0.56.0 → gea_program-0.57.0}/gea/osdu.py +0 -0
  255. {gea_program-0.56.0 → gea_program-0.57.0}/gea/pad_summary.py +0 -0
  256. {gea_program-0.56.0 → gea_program-0.57.0}/gea/patches.py +0 -0
  257. {gea_program-0.56.0 → gea_program-0.57.0}/gea/pdf_report.py +0 -0
  258. {gea_program-0.56.0 → gea_program-0.57.0}/gea/penetrator.py +0 -0
  259. {gea_program-0.56.0 → gea_program-0.57.0}/gea/permits.py +0 -0
  260. {gea_program-0.56.0 → gea_program-0.57.0}/gea/piwebapi.py +0 -0
  261. {gea_program-0.56.0 → gea_program-0.57.0}/gea/pore_pressure.py +0 -0
  262. {gea_program-0.56.0 → gea_program-0.57.0}/gea/ports.py +0 -0
  263. {gea_program-0.56.0 → gea_program-0.57.0}/gea/ppdm.py +0 -0
  264. {gea_program-0.56.0 → gea_program-0.57.0}/gea/profile_catalog.py +0 -0
  265. {gea_program-0.56.0 → gea_program-0.57.0}/gea/project.py +0 -0
  266. {gea_program-0.56.0 → gea_program-0.57.0}/gea/qt6_downhole_app.py +0 -0
  267. {gea_program-0.56.0 → gea_program-0.57.0}/gea/quakeml.py +0 -0
  268. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reconciler.py +0 -0
  269. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  270. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  271. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/WMM2025.COF +0 -0
  272. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/eia_henry_hub_daily.csv.gz +0 -0
  273. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/eia_prices.provenance.json +0 -0
  274. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/eia_wti_daily.csv.gz +0 -0
  275. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/iscwsa_rev4_example.json +0 -0
  276. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/iscwsa_rev5_example.json +0 -0
  277. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/l0701_sonic_gr.las.gz +0 -0
  278. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/l0701_sonic_gr.provenance.json +0 -0
  279. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  280. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  281. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  282. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  283. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/mahoning_example.json +0 -0
  284. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/mud_motor_specs.json +0 -0
  285. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/owsg_tool_models.json +0 -0
  286. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/penetrator_ratings.json +0 -0
  287. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/seismicity_protocols.json +0 -0
  288. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/tool_sources.json +0 -0
  289. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/us_outline.json +0 -0
  290. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/us_outline.provenance.json +0 -0
  291. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_3d.provenance.json +0 -0
  292. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_f4_interpretation.las.gz +0 -0
  293. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_f4_logs.provenance.json +0 -0
  294. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_f4_lwd.las.gz +0 -0
  295. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_surfaces.json.gz +0 -0
  296. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-10.xml.gz +0 -0
  297. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-4.xml.gz +0 -0
  298. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-5_12.25in.xml.gz +0 -0
  299. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-5_17.5in.xml.gz +0 -0
  300. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-5_36in.xml.gz +0 -0
  301. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_traj_F-5_8.5in.xml.gz +0 -0
  302. {gea_program-0.56.0 → gea_program-0.57.0}/gea/reference/volve_well_picks.csv.gz +0 -0
  303. {gea_program-0.56.0 → gea_program-0.57.0}/gea/report_history.py +0 -0
  304. {gea_program-0.56.0 → gea_program-0.57.0}/gea/rig_state.py +0 -0
  305. {gea_program-0.56.0 → gea_program-0.57.0}/gea/rock_inventory.py +0 -0
  306. {gea_program-0.56.0 → gea_program-0.57.0}/gea/sample_record.py +0 -0
  307. {gea_program-0.56.0 → gea_program-0.57.0}/gea/sample_well_profile.csv +0 -0
  308. {gea_program-0.56.0 → gea_program-0.57.0}/gea/sbom.py +0 -0
  309. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seedlink.py +0 -0
  310. {gea_program-0.56.0 → gea_program-0.57.0}/gea/segy.py +0 -0
  311. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic.py +0 -0
  312. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_array.py +0 -0
  313. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_assoc.py +0 -0
  314. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_detect.py +0 -0
  315. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_film.py +0 -0
  316. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_harmonic.py +0 -0
  317. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_qc.py +0 -0
  318. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_response.py +0 -0
  319. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_signature.py +0 -0
  320. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_track.py +0 -0
  321. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_uncertainty.py +0 -0
  322. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_unlisted.py +0 -0
  323. {gea_program-0.56.0 → gea_program-0.57.0}/gea/seismic_watch.py +0 -0
  324. {gea_program-0.56.0 → gea_program-0.57.0}/gea/sensor_swap.py +0 -0
  325. {gea_program-0.56.0 → gea_program-0.57.0}/gea/series_cache.py +0 -0
  326. {gea_program-0.56.0 → gea_program-0.57.0}/gea/service.py +0 -0
  327. {gea_program-0.56.0 → gea_program-0.57.0}/gea/service_life.py +0 -0
  328. {gea_program-0.56.0 → gea_program-0.57.0}/gea/setup_checklist.py +0 -0
  329. {gea_program-0.56.0 → gea_program-0.57.0}/gea/shapefile.py +0 -0
  330. {gea_program-0.56.0 → gea_program-0.57.0}/gea/shell.py +0 -0
  331. {gea_program-0.56.0 → gea_program-0.57.0}/gea/shut_in.py +0 -0
  332. {gea_program-0.56.0 → gea_program-0.57.0}/gea/simulation.py +0 -0
  333. {gea_program-0.56.0 → gea_program-0.57.0}/gea/site_map.py +0 -0
  334. {gea_program-0.56.0 → gea_program-0.57.0}/gea/sla_report.py +0 -0
  335. {gea_program-0.56.0 → gea_program-0.57.0}/gea/slip.py +0 -0
  336. {gea_program-0.56.0 → gea_program-0.57.0}/gea/soak.py +0 -0
  337. {gea_program-0.56.0 → gea_program-0.57.0}/gea/sra.py +0 -0
  338. {gea_program-0.56.0 → gea_program-0.57.0}/gea/store_forward.py +0 -0
  339. {gea_program-0.56.0 → gea_program-0.57.0}/gea/strata_join.py +0 -0
  340. {gea_program-0.56.0 → gea_program-0.57.0}/gea/structure.py +0 -0
  341. {gea_program-0.56.0 → gea_program-0.57.0}/gea/supervisor.py +0 -0
  342. {gea_program-0.56.0 → gea_program-0.57.0}/gea/survey_cmd.py +0 -0
  343. {gea_program-0.56.0 → gea_program-0.57.0}/gea/survey_view.py +0 -0
  344. {gea_program-0.56.0 → gea_program-0.57.0}/gea/telemetry.py +0 -0
  345. {gea_program-0.56.0 → gea_program-0.57.0}/gea/tls.py +0 -0
  346. {gea_program-0.56.0 → gea_program-0.57.0}/gea/tool_catalog.py +0 -0
  347. {gea_program-0.56.0 → gea_program-0.57.0}/gea/tool_library.py +0 -0
  348. {gea_program-0.56.0 → gea_program-0.57.0}/gea/tool_taxonomy.py +0 -0
  349. {gea_program-0.56.0 → gea_program-0.57.0}/gea/torque_drag.py +0 -0
  350. {gea_program-0.56.0 → gea_program-0.57.0}/gea/transient.py +0 -0
  351. {gea_program-0.56.0 → gea_program-0.57.0}/gea/vibration.py +0 -0
  352. {gea_program-0.56.0 → gea_program-0.57.0}/gea/web/app.html +0 -0
  353. {gea_program-0.56.0 → gea_program-0.57.0}/gea/well3d.py +0 -0
  354. {gea_program-0.56.0 → gea_program-0.57.0}/gea/well_assembler.py +0 -0
  355. {gea_program-0.56.0 → gea_program-0.57.0}/gea/well_report.py +0 -0
  356. {gea_program-0.56.0 → gea_program-0.57.0}/gea/well_test_validation.py +0 -0
  357. {gea_program-0.56.0 → gea_program-0.57.0}/gea/wellplan.py +0 -0
  358. {gea_program-0.56.0 → gea_program-0.57.0}/gea/wellpos.py +0 -0
  359. {gea_program-0.56.0 → gea_program-0.57.0}/gea/wits0.py +0 -0
  360. {gea_program-0.56.0 → gea_program-0.57.0}/gea/witsml.py +0 -0
  361. {gea_program-0.56.0 → gea_program-0.57.0}/gea/workspace.py +0 -0
  362. {gea_program-0.56.0 → gea_program-0.57.0}/gea/xlsx_read.py +0 -0
  363. {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/dependency_links.txt +0 -0
  364. {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/entry_points.txt +0 -0
  365. {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/requires.txt +0 -0
  366. {gea_program-0.56.0 → gea_program-0.57.0}/gea_program.egg-info/top_level.txt +0 -0
  367. {gea_program-0.56.0 → gea_program-0.57.0}/setup.cfg +0 -0
  368. {gea_program-0.56.0 → gea_program-0.57.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.56.0
3
+ Version: 0.57.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
@@ -1291,6 +1291,19 @@ gea oidc --workspace C:\site --issuer https://login.microsoftonline.com/3f8b2c1d
1291
1291
  Or Administration -> **Company sign-in**. `gea help company-sign-in` has the
1292
1292
  Entra ID app registration step by step.
1293
1293
 
1294
+ ### For an IT department
1295
+
1296
+ `docs/IT_SECURITY.md` (`gea security` prints it from any installation)
1297
+ answers what a reviewer asks before installing: where the data is and every
1298
+ connection the program can make, the one port, HTTPS, company sign-in and
1299
+ roles, the audit log, the bill of materials (`gea sbom`), and how a kit is
1300
+ checked - the build's attestation
1301
+ (`gea-program-0.57.0-win64.zip` checked with
1302
+ `gh attestation verify gea-program-0.57.0-win64.zip -R Daniel8Murphy0007/GEA-Program`)
1303
+ and the file catalog beside the kit's folder, Authenticode-signed once the
1304
+ publisher's certificate is in place. `SECURITY.md` says how to report a
1305
+ vulnerability.
1306
+
1294
1307
  ### Before a site goes live
1295
1308
 
1296
1309
  `deploy/README.md` is the checklist: HTTPS from the service itself (above),
@@ -1422,4 +1435,5 @@ https://pypi.org/project/gea-program/ after the first successful run.
1422
1435
  ## Licence
1423
1436
 
1424
1437
  Mozilla Public License 2.0 (MPL-2.0); see `LICENSE`. Every source file carries the MPL-2.0
1425
- header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy.
1438
+ header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy. The signed kit, its updates and
1439
+ support are a subscription from ENRGYONE (`docs/commercial/COMMERCIAL.md`).
@@ -1252,6 +1252,19 @@ gea oidc --workspace C:\site --issuer https://login.microsoftonline.com/3f8b2c1d
1252
1252
  Or Administration -> **Company sign-in**. `gea help company-sign-in` has the
1253
1253
  Entra ID app registration step by step.
1254
1254
 
1255
+ ### For an IT department
1256
+
1257
+ `docs/IT_SECURITY.md` (`gea security` prints it from any installation)
1258
+ answers what a reviewer asks before installing: where the data is and every
1259
+ connection the program can make, the one port, HTTPS, company sign-in and
1260
+ roles, the audit log, the bill of materials (`gea sbom`), and how a kit is
1261
+ checked - the build's attestation
1262
+ (`gea-program-0.57.0-win64.zip` checked with
1263
+ `gh attestation verify gea-program-0.57.0-win64.zip -R Daniel8Murphy0007/GEA-Program`)
1264
+ and the file catalog beside the kit's folder, Authenticode-signed once the
1265
+ publisher's certificate is in place. `SECURITY.md` says how to report a
1266
+ vulnerability.
1267
+
1255
1268
  ### Before a site goes live
1256
1269
 
1257
1270
  `deploy/README.md` is the checklist: HTTPS from the service itself (above),
@@ -1383,4 +1396,5 @@ https://pypi.org/project/gea-program/ after the first successful run.
1383
1396
  ## Licence
1384
1397
 
1385
1398
  Mozilla Public License 2.0 (MPL-2.0); see `LICENSE`. Every source file carries the MPL-2.0
1386
- header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy.
1399
+ header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy. The signed kit, its updates and
1400
+ support are a subscription from ENRGYONE (`docs/commercial/COMMERCIAL.md`).
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.56.0"
126
+ __version__ = "0.57.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -67,7 +67,16 @@ def _build_config(a):
67
67
  return SimulatorConfig(**kw)
68
68
 
69
69
 
70
+ # the front door's own commands (gea.cli), reached the same way through `python -m gea` - the kit's gea.cmd and
71
+ # gea wrapper run `python -m gea`, and before v0.57 `gea guide`, `gea help` and the rest answered "invalid choice"
72
+ FRONT_ONLY = ('quickstart', 'guide', 'security', 'docs', 'gui', 'help')
73
+
74
+
70
75
  def main(argv=None) -> int:
76
+ _argv = list(sys.argv[1:] if argv is None else argv)
77
+ if _argv and _argv[0] in FRONT_ONLY:
78
+ from .cli import main as _front
79
+ return _front(_argv)
71
80
  ap = argparse.ArgumentParser(prog="gea",
72
81
  description="GEA Downhole Simulator - headless CLI")
73
82
  sub = ap.add_subparsers(dest="cmd", required=True)
@@ -12660,6 +12660,167 @@ def section_cy_company_sign_in(tmp: str) -> None:
12660
12660
  "the help page with the Entra ID steps" + (f" - failed: {failed4}" if failed4 else ""))
12661
12661
 
12662
12662
 
12663
+ def section_cz_it_review(tmp: str) -> None:
12664
+ """Section CZ - what an IT department asks: the security overview ships with the program and agrees with the
12665
+ code it describes (the rounds, the sessions, the lock, the port, TLS, every host the program can reach); `gea
12666
+ security`, `gea guide` and `gea help` answer through `python -m gea` as the kit's launcher runs it; in a checkout,
12667
+ the kit tools zip the kit again with its catalog beside it and tell the site how to check it, and the build
12668
+ workflow attests both kits and signs the catalog only when a certificate is configured."""
12669
+ import importlib.util
12670
+ import json as _json
12671
+ import subprocess as _sp
12672
+ import urllib.parse as _up
12673
+ import zipfile as _zf
12674
+ from . import doctor as DR
12675
+ from . import elevation as EL
12676
+ from . import helplib as H
12677
+ from . import seismic_watch as SW
12678
+ from . import service as SVC
12679
+ from . import tls as TLS
12680
+ pkg = Path(__file__).parent
12681
+ checkout = (pkg.parent / "pyproject.toml").exists() and (pkg.parent / "tools" / "build_installer.py").exists()
12682
+
12683
+ # -- CZ1 the overview, and the code it describes -------------------------------------------------------------------
12684
+ text = H.security_text() or ""
12685
+ docs_copy = pkg.parent / "docs" / "IT_SECURITY.md"
12686
+ same = (not docs_copy.exists()) or docs_copy.read_text(encoding="utf-8") == text
12687
+ flat = " ".join(text.split())
12688
+ with open(Path(pkg, "reference", "eia_prices.provenance.json"), encoding="utf-8") as f:
12689
+ eia_hosts = {_up.urlsplit(s["refresh_url"]).hostname for s in _json.load(f)["series"].values() if s.get("refresh_url")}
12690
+ doctor_src = Path(DR.__file__).read_text(encoding="utf-8")
12691
+ hosts = {_up.urlsplit(EL.EPQS_URL).hostname, _up.urlsplit(SW.QUERY_URL).hostname, _up.urlsplit(SW.FEED_URL).hostname, *eia_hosts}
12692
+ hosts |= {"pypi.org"} if "https://pypi.org/pypi/gea-program/json" in doctor_src else {"(the update check moved)"}
12693
+ facts = {
12694
+ "rounds": f"{SVC.PBKDF2_ROUNDS:,}" in flat,
12695
+ "sessions": f"{SVC.SESSION_HOURS} hours" in flat and "256-bit" in flat,
12696
+ "lock": SVC.LOGIN_MAX_FAILURES == 5 and "five failures" in flat and f"{SVC.LOGIN_LOCK_S // 60} minutes" in flat,
12697
+ "port": "TCP 8765" in flat and "8765" in Path(DR.__file__).read_text(encoding="utf-8"),
12698
+ "tls": "TLS 1.2 minimum" in flat and f"last {TLS.EXPIRING_DAYS} days" in flat,
12699
+ "hosts": all(f"`{h}`" in flat for h in hosts),
12700
+ "no_telemetry": "No telemetry" in flat,
12701
+ }
12702
+ # Python 3.14's argparse formats every help string as the parser is built (help % params) and stops on a bare
12703
+ # "%": v0.54.0's first ship stopped at its gate that way while 3.13 passed. The same check, on any Python.
12704
+ import argparse as _ap
12705
+ import contextlib as _cl
12706
+ import io as _io
12707
+ from . import __main__ as _M
12708
+ bad_help = []
12709
+ _orig_add, _orig_sub = _ap.ArgumentParser.add_argument, _ap._SubParsersAction.add_parser
12710
+ _params = {k_: "x" for k_ in ("prog", "default", "dest", "type", "choices", "metavar", "required", "nargs", "const", "option_strings")}
12711
+
12712
+ def _fmt_ok(h):
12713
+ try:
12714
+ h % _params
12715
+ return True
12716
+ except (ValueError, TypeError, KeyError):
12717
+ return False
12718
+
12719
+ def _add(self, *a_, **k_):
12720
+ h_ = k_.get("help")
12721
+ if isinstance(h_, str) and h_ != _ap.SUPPRESS and not _fmt_ok(h_):
12722
+ bad_help.append(f"{self.prog} {'/'.join(a_)}")
12723
+ return _orig_add(self, *a_, **k_)
12724
+
12725
+ def _sub(self, name, **k_):
12726
+ h_ = k_.get("help")
12727
+ if isinstance(h_, str) and not _fmt_ok(h_):
12728
+ bad_help.append(f"gea {name}")
12729
+ return _orig_sub(self, name, **k_)
12730
+ _ap.ArgumentParser.add_argument, _ap._SubParsersAction.add_parser = _add, _sub
12731
+ try:
12732
+ with _cl.redirect_stdout(_io.StringIO()), _cl.redirect_stderr(_io.StringIO()):
12733
+ try:
12734
+ _M.main(["wells"])
12735
+ except SystemExit:
12736
+ pass
12737
+ finally:
12738
+ _ap.ArgumentParser.add_argument, _ap._SubParsersAction.add_parser = _orig_add, _orig_sub
12739
+ facts["help_strings"] = not bad_help
12740
+ r_sec = _sp.run([sys.executable, "-m", "gea", "security"], capture_output=True, text=True, encoding="utf-8", errors="replace")
12741
+ r_guide = _sp.run([sys.executable, "-m", "gea", "guide"], capture_output=True, text=True, encoding="utf-8", errors="replace")
12742
+ r_help = _sp.run([sys.executable, "-m", "gea", "help", "https"], capture_output=True, text=True, encoding="utf-8", errors="replace")
12743
+ bad = [k for k, v in facts.items() if not v]
12744
+ ok(text.startswith("# GEA-Program for an IT department") and same and not bad
12745
+ and r_sec.returncode == 0 and "GEA-Program for an IT department" in r_sec.stdout
12746
+ and r_guide.returncode == 0 and "HOW TO TEST GEA" in r_guide.stdout and r_help.returncode == 0 and "**The command**" in r_help.stdout,
12747
+ "CZ1 the security overview ships in the package (identical to docs/IT_SECURITY.md) and agrees with the code: the password hashing rounds, the "
12748
+ "session length and token size, the sign-in lock, the one port, the TLS floor and the expiry warning, every host the program can reach "
12749
+ "(ComCat, the elevation service, the price series, PyPI); `python -m gea security`, `guide` and `help` answer as the kit's own launcher "
12750
+ "runs them; every option's help text formats the way Python 3.14 checks it as the parser is built"
12751
+ + (f" - disagrees: {bad}" if bad else "") + (f" - help texts: {bad_help}" if bad_help else ""))
12752
+
12753
+ # -- CZ2 the kit is zipped again with its catalog, and says how to check it ----------------------------------------------
12754
+ if checkout:
12755
+ spec = importlib.util.spec_from_file_location("cz_installer", str(pkg.parent / "tools" / "build_installer.py"))
12756
+ bi = importlib.util.module_from_spec(spec); spec.loader.exec_module(bi)
12757
+ kit = Path(tmp, "cz_kit", "gea-program-9.9.9-win64"); (kit / "python").mkdir(parents=True)
12758
+ (kit / "MANIFEST.json").write_text("{}", encoding="utf-8"); (kit / "python" / "python.exe").write_bytes(b"MZ stand-in")
12759
+ (kit / "SHA256SUMS.txt").write_text("x MANIFEST.json\n", encoding="utf-8")
12760
+ cat = Path(tmp, "cz_kit", "gea-program-9.9.9-win64.cat"); cat.write_bytes(b"0\x82 a catalog stand-in")
12761
+ zp = bi.rezip(kit, [cat])
12762
+ with _zf.ZipFile(zp) as z:
12763
+ names = sorted(z.namelist())
12764
+ cat_back = z.read("gea-program-9.9.9-win64.cat")
12765
+ try:
12766
+ bi.rezip(Path(tmp, "cz_kit"), [])
12767
+ not_kit = "accepted"
12768
+ except SystemExit as e:
12769
+ not_kit = str(e)
12770
+ readme = bi.README.format(version="9.9.9", target="Windows x64", pyline="p", install="i", start="s", verify="v", port="8765",
12771
+ service="sv", stop="st", uninstall="u", workspace="w", check=bi.WIN_CHECK.format(version="9.9.9"))
12772
+ build_src = (pkg.parent / "tools" / "build_installer.py").read_text(encoding="utf-8")
12773
+ c2 = {
12774
+ "rezip": names == ["gea-program-9.9.9-win64.cat", "gea-program-9.9.9-win64/MANIFEST.json", "gea-program-9.9.9-win64/SHA256SUMS.txt",
12775
+ "gea-program-9.9.9-win64/python/python.exe"] and cat_back == cat.read_bytes() and "not a kit folder" in not_kit,
12776
+ "readme": all(x in readme for x in ("gh attestation verify gea-program-9.9.9-win64.zip -R Daniel8Murphy0007/GEA-Program",
12777
+ "Test-FileCatalog -CatalogFilePath .\\gea-program-9.9.9-win64.cat -Path .\\gea-program-9.9.9-win64",
12778
+ "Get-AuthenticodeSignature", "IT_SECURITY.md", "gea help https"))
12779
+ and "368 checks" not in readme and "behind the site's TLS proxy" not in readme,
12780
+ "ships_overview": "docs' / 'IT_SECURITY.md'" in build_src and "kit / 'IT_SECURITY.md'" in build_src,
12781
+ }
12782
+ where = "the checkout's kit tools"
12783
+ else:
12784
+ c2 = {"installed": bool(H.security_text())}
12785
+ where = "an installed copy: the kit tools are checked in the checkout"
12786
+ failed2 = [k for k, v in c2.items() if not v]
12787
+ ok(not failed2,
12788
+ f"CZ2 ({where}) the kit is zipped again from its folder with its file catalog beside the folder, every file kept; a folder that is not a kit "
12789
+ "is refused; the kit's README tells the site how to check the build's attestation and every file against the catalog and its signature, "
12790
+ "and carries the IT overview" + (f" - failed: {failed2}" if failed2 else ""))
12791
+
12792
+ # -- CZ3 the build workflow: attested, signed only with a certificate, never signed in name only ----------------------------
12793
+ wf = pkg.parent / ".github" / "workflows" / "build-installer.yml"
12794
+ if wf.exists():
12795
+ y = wf.read_text(encoding="utf-8")
12796
+ win = y[y.index("windows-kit:"):y.index("linux-kit:")]
12797
+ lin = y[y.index("linux-kit:"):]
12798
+ order = [win.index(s) for s in ("New-FileCatalog", "azure/artifact-signing-action", "signtool", "Test-FileCatalog", "--rezip", "call install.cmd",
12799
+ "attest-build-provenance", "attach-kit.sh")]
12800
+ c3 = {
12801
+ "permissions": "id-token: write" in y and "attestations: write" in y and "contents: write" in y,
12802
+ "attested": "actions/attest-build-provenance" in win and "actions/attest-build-provenance" in lin
12803
+ and "subject-path: dist/gea-program-*-win64.zip" in win and "subject-path: dist/gea-program-*-linux-*.zip" in lin,
12804
+ "conditional": "if: env.ARTIFACT_SIGNING_ACCOUNT != ''" in win and "if: env.ARTIFACT_SIGNING_ACCOUNT == '' && env.SIGNING_PFX_BASE64 != ''" in win
12805
+ and "secrets.ARTIFACT_SIGNING_ACCOUNT" in win and "secrets.SIGNING_PFX_BASE64" in win,
12806
+ "checked": "-CatalogVersion 2.0" in win and "throw 'the catalog does not match the kit'" in win
12807
+ and "throw 'a certificate is configured but the catalog is not validly signed'" in win and "ships unsigned" in win
12808
+ and "Remove-Item $pfx" in win and "/tr http://timestamp" in win and "timestamp-rfc3161" in win,
12809
+ "order": order == sorted(order),
12810
+ "policy": (pkg.parent / "SECURITY.md").exists() and "Report a vulnerability" in " ".join((pkg.parent / "SECURITY.md").read_text(encoding="utf-8").split()),
12811
+ }
12812
+ where3 = "the checkout's workflow"
12813
+ else:
12814
+ c3 = {"installed": True}
12815
+ where3 = "an installed copy: the workflow is checked in the checkout"
12816
+ failed3 = [k for k, v in c3.items() if not v]
12817
+ ok(not failed3,
12818
+ f"CZ3 ({where3}) both kits are attested by the build that made them; the Windows kit's file catalog is made, signed by Azure Artifact "
12819
+ "Signing or a PFX only when its secrets are configured (timestamped; the PFX removed), checked against the kit - a mismatch, or a "
12820
+ "configured certificate that did not sign, stops the build - then zipped beside the kit before the kit is installed and its gate run; "
12821
+ "SECURITY.md says how to report a vulnerability" + (f" - failed: {failed3}" if failed3 else ""))
12822
+
12823
+
12663
12824
  def PR_read_ok(path) -> bool:
12664
12825
  from . import pdf_report as PR
12665
12826
  try:
@@ -12774,6 +12935,7 @@ def main() -> int:
12774
12935
  section_cw_decline(tmp)
12775
12936
  section_cx_https(tmp)
12776
12937
  section_cy_company_sign_in(tmp)
12938
+ section_cz_it_review(tmp)
12777
12939
  if _FAILS:
12778
12940
  print(f"[ACCEPTANCE] {len(_FAILS)} FAILURES ({_PASS} passed):")
12779
12941
  for f in _FAILS:
@@ -10,6 +10,7 @@
10
10
  gea model-cards ... gea store-forward ... gea sla-report ... gea fat-sat ...
11
11
  gea help [topic] the help library, by the job (gea help drift); same text as the dashboard's panels
12
12
  gea guide the click-by-click tester guide
13
+ gea security what an IT department asks before installing, answered (docs/IT_SECURITY.md)
13
14
  gea docs where the catalogue and the reports live on this machine
14
15
  gea gui the desktop window (desktop extra)
15
16
  gea accept the product gate
@@ -23,7 +24,7 @@ import os
23
24
  import sys
24
25
  from pathlib import Path
25
26
 
26
- FRONT = {'quickstart', 'survey', 'guide', 'docs', 'gui', 'help', '-h', '--help'}
27
+ FRONT = {'quickstart', 'survey', 'guide', 'security', 'docs', 'gui', 'help', '-h', '--help'}
27
28
 
28
29
 
29
30
  def _pkg_root() -> Path:
@@ -62,6 +63,16 @@ def cmd_guide(_argv) -> int:
62
63
  return 0
63
64
 
64
65
 
66
+ def cmd_security(_argv) -> int:
67
+ from .helplib import security_text
68
+ text = security_text() # ships inside the package (gea/help/IT_SECURITY.md)
69
+ if text is None:
70
+ print('the security overview is missing from this installation; reinstall: python -m pip install --upgrade --force-reinstall "gea-program[live]"')
71
+ return 2
72
+ print(text)
73
+ return 0
74
+
75
+
65
76
  def cmd_help(argv) -> int:
66
77
  from .helplib import page, index_text, topics
67
78
  if not argv:
@@ -141,6 +152,8 @@ def main(argv=None) -> int:
141
152
  return cmd_survey(rest)
142
153
  if cmd == 'guide':
143
154
  return cmd_guide(rest)
155
+ if cmd == 'security':
156
+ return cmd_security(rest)
144
157
  if cmd == 'docs':
145
158
  return cmd_docs(rest)
146
159
  if cmd == 'gui':
@@ -0,0 +1,138 @@
1
+ # GEA-Program for an IT department
2
+
3
+ What an IT or security reviewer asks before GEA-Program is installed on a
4
+ site machine, answered from what the program does - each answer names the
5
+ command or file that shows it. The program's version is in `MANIFEST.json`
6
+ of the kit and on the control panel's Audit / Update page.
7
+ `gea security` prints this page from any installation of the program.
8
+
9
+ ## What it is
10
+
11
+ One Python package (`gea-program`, MPL-2.0 source on GitHub and PyPI) with
12
+ one required dependency (numpy) and optional extras, delivered for a site as
13
+ a standalone kit: the package, every wheel it needs, the embeddable CPython
14
+ from python.org, and plain launch scripts. It installs into its own folder
15
+ without administrator rights and without network access. It writes nothing
16
+ outside that folder and the site's workspace folder, adds no driver, no
17
+ system service (a per-user scheduled task only if the site runs
18
+ `register-service.cmd`), and no registry keys.
19
+
20
+ `tools/standalone_check.py` (run by the acceptance gate) fails the build if
21
+ any module imports anything outside the standard library, numpy and the
22
+ declared extras.
23
+
24
+ ## Data: where it is and where it goes
25
+
26
+ - **At rest**: everything the program keeps for a site is in the workspace
27
+ folder the site chooses (by default `%LOCALAPPDATA%\GEA-Program\site`):
28
+ the client's files as received, hashed; the derived records; the reports;
29
+ the configuration with its version history; `users.json`; the append-only
30
+ audit log `records\audit.jsonl`. Disk encryption, file-system permissions
31
+ and backup are the site's (`gea backup` writes a verified archive to the
32
+ folder or share the site names - never inside the workspace).
33
+ - **Keys** are in the workspace's `keys\` folder, readable by their owner
34
+ where the file system allows: the site's dossier signing key (Ed25519), the
35
+ HTTPS private key when the program made the certificate, the company
36
+ sign-in client secret when one is kept. None of them is ever put in a
37
+ report, an export, an evidence pack or a signed dossier, or sent by the
38
+ service. The backup copies them with the rest of the workspace: protect
39
+ the backup location accordingly.
40
+ - **Outbound connections** - none at install, none unless the site turns a
41
+ feature on or a person asks:
42
+
43
+ | What | To | When |
44
+ |---|---|---|
45
+ | Earthquake watch | `earthquake.usgs.gov` (ComCat) | while an operation runs, if the site enables it |
46
+ | Elevation look-up | `epqs.nationalmap.gov` | when a person asks for a well's ground elevation |
47
+ | Seismic archives | an FDSN service the site names (e.g. `service.iris.edu`) | when a person fetches station data |
48
+ | Price series refresh | `raw.githubusercontent.com` (the EIA series' public mirror) | when a person refreshes them |
49
+ | Update check | `pypi.org` | when a person runs `gea update --check` or opens Audit / Update |
50
+ | Notifications | the site's own SMTP server or webhook | when the site configures a channel |
51
+ | Company sign-in | the site's identity provider (Entra ID: `login.microsoftonline.com`) | at each company sign-in, if configured |
52
+ | Live data | the site's historian (PI Web API), WITSML store, OPC UA server, MQTT broker, Modbus/DNP3/HART-IP device, SeedLink server | when the site defines a patch for it |
53
+
54
+ No telemetry, no usage reporting, no licence server. Everything else runs
55
+ on the machine.
56
+
57
+ ## Who can reach it
58
+
59
+ - **Port**: one, TCP 8765 by default (`GEA_PORT` / `--port`), bound to
60
+ `127.0.0.1` unless the site starts it with `--host`. Nothing else listens.
61
+ - **Transport**: HTTPS when the workspace has a certificate - the site's own
62
+ (from its certificate authority) or one the program makes (`gea tls`,
63
+ `gea help https`): TLS 1.2 minimum, the session cookie `Secure`,
64
+ `Strict-Transport-Security`, plain HTTP on the same port redirected; a
65
+ certificate in its last 30 days raises an alert; a broken certificate stops
66
+ the start rather than falling back to plain HTTP. Or the site's reverse
67
+ proxy terminates TLS (`deploy/`).
68
+ - **Sign-in**: company accounts by OpenID Connect (Entra ID, Okta, Google,
69
+ Ping, Keycloak, AD FS; authorization code flow with PKCE; the ID token's
70
+ RS256 signature, issuer, audience, expiry and nonce checked;
71
+ `gea help company-sign-in`), and local accounts (PBKDF2-SHA256, 200,000
72
+ rounds, a salt per user; five failures lock the name and the address for
73
+ 15 minutes). Sessions are random 256-bit tokens in `HttpOnly;
74
+ SameSite=Strict` cookies, 12 hours; an administrator sees every live
75
+ session and revokes any.
76
+ - **Roles**: viewer < operator < approver < admin, enforced by the service
77
+ on every request; a company account's role comes from the company's app
78
+ roles or groups at each sign-in.
79
+ - **The page**: every action needs a header a cross-site form cannot set;
80
+ every response carries a Content-Security-Policy (`default-src 'self'`,
81
+ `frame-ancestors 'none'`), `X-Frame-Options: DENY`, `nosniff` and a
82
+ same-origin referrer policy. The page loads nothing from the internet.
83
+
84
+ ## What it records
85
+
86
+ Every action - by a person through the page, by a scheduled job, by the
87
+ command line - is a line in `records\audit.jsonl` with the actor, the time
88
+ and the SHA-256 of its inputs; sign-ins and failures with the address and
89
+ the reason. The log is append-only; `gea housekeeping` segments it, never
90
+ truncates it. A signed dossier carries the audit chain's head and lets
91
+ anyone verify, without GEA, that the reports and the log have not changed
92
+ since it was signed.
93
+
94
+ ## What is installed, and from where
95
+
96
+ - `gea sbom --out C:\site\reports` writes the software bill of materials of
97
+ the running installation (each component's name, version, supplier,
98
+ licence, hash, package URL and relationship, from the installed metadata).
99
+ - The kit's `SHA256SUMS.txt` holds the hash of every file and `MANIFEST.json`
100
+ the wheels and the commit it was built from.
101
+ - **Provenance**: every kit attached to a GitHub release is attested by the
102
+ build that made it (GitHub artifact attestations, Sigstore). Check a
103
+ downloaded kit with the GitHub CLI, for example:
104
+ `gh attestation verify gea-program-0.57.0-win64.zip -R Daniel8Murphy0007/GEA-Program`.
105
+ The PyPI release is published by GitHub's trusted publishing, which
106
+ attaches the publisher's attestations to the files on PyPI.
107
+ - **Code signing (Windows)**: the batch launchers of the kit cannot carry a
108
+ signature of their own, so the kit carries a file catalog beside its
109
+ folder in the zip - `gea-program-0.57.0-win64.cat` for 0.57.0 - holding
110
+ the SHA-256 of every file in the kit. When the publisher's signing
111
+ certificate is in place the catalog is Authenticode-signed:
112
+ `Get-AuthenticodeSignature .\gea-program-0.57.0-win64.cat` shows the
113
+ publisher, and, in the folder the zip was extracted to and before
114
+ `install.cmd` runs,
115
+ `Test-FileCatalog -CatalogFilePath .\gea-program-0.57.0-win64.cat -Path .\gea-program-0.57.0-win64`
116
+ says Valid when no file has changed. An application-control policy
117
+ (App Control for Business / WDAC) can trust the kit by its signed
118
+ catalog. Until the certificate is in place the catalog ships unsigned and
119
+ the build says so. The embeddable Python's own executables are signed by
120
+ the Python Software Foundation.
121
+ - **Updates**: a new kit is installed beside the old one; the workspace is
122
+ found and opened as it is. Nothing updates itself: on a pip installation,
123
+ `gea update` upgrades from PyPI only when a person runs it.
124
+ - **The acceptance gate**: `verify.cmd` runs every check of the program's
125
+ acceptance suite from the installed kit - the site's own evidence that
126
+ this installation does what the release says.
127
+
128
+ ## Reporting a vulnerability
129
+
130
+ See `SECURITY.md`: privately, through the repository's "Report a
131
+ vulnerability" (GitHub private vulnerability reporting) or by email to the
132
+ address there - never in a public issue. A fix or a mitigation ships in a
133
+ release the advisory names.
134
+
135
+ ## Support
136
+
137
+ The source is open (MPL-2.0). The signed kit, its updates and support are a
138
+ subscription from ENRGYONE: see `docs/commercial/COMMERCIAL.md`.
@@ -147,6 +147,14 @@ def index_text() -> str:
147
147
  return '\n'.join(lines)
148
148
 
149
149
 
150
+ def security_text() -> Optional[str]:
151
+ p = os.path.join(HELP_DIR, 'IT_SECURITY.md')
152
+ if not os.path.isfile(p):
153
+ return None
154
+ with open(p, encoding='utf-8') as f:
155
+ return f.read()
156
+
157
+
150
158
  def guide_text() -> Optional[str]:
151
159
  p = os.path.join(HELP_DIR, 'TESTER_GUIDE.md')
152
160
  if not os.path.isfile(p):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gea-program
3
- Version: 0.56.0
3
+ Version: 0.57.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
@@ -1291,6 +1291,19 @@ gea oidc --workspace C:\site --issuer https://login.microsoftonline.com/3f8b2c1d
1291
1291
  Or Administration -> **Company sign-in**. `gea help company-sign-in` has the
1292
1292
  Entra ID app registration step by step.
1293
1293
 
1294
+ ### For an IT department
1295
+
1296
+ `docs/IT_SECURITY.md` (`gea security` prints it from any installation)
1297
+ answers what a reviewer asks before installing: where the data is and every
1298
+ connection the program can make, the one port, HTTPS, company sign-in and
1299
+ roles, the audit log, the bill of materials (`gea sbom`), and how a kit is
1300
+ checked - the build's attestation
1301
+ (`gea-program-0.57.0-win64.zip` checked with
1302
+ `gh attestation verify gea-program-0.57.0-win64.zip -R Daniel8Murphy0007/GEA-Program`)
1303
+ and the file catalog beside the kit's folder, Authenticode-signed once the
1304
+ publisher's certificate is in place. `SECURITY.md` says how to report a
1305
+ vulnerability.
1306
+
1294
1307
  ### Before a site goes live
1295
1308
 
1296
1309
  `deploy/README.md` is the checklist: HTTPS from the service itself (above),
@@ -1422,4 +1435,5 @@ https://pypi.org/project/gea-program/ after the first successful run.
1422
1435
  ## Licence
1423
1436
 
1424
1437
  Mozilla Public License 2.0 (MPL-2.0); see `LICENSE`. Every source file carries the MPL-2.0
1425
- header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy.
1438
+ header (Exhibit A). Copyright (c) 2026 Daniel T. Murphy. The signed kit, its updates and
1439
+ support are a subscription from ENRGYONE (`docs/commercial/COMMERCIAL.md`).
@@ -257,6 +257,7 @@ gea/fixtures/comcat_delaware_basin_2026-09.txt
257
257
  gea/fixtures/comcat_mahoning_1990-2026.txt
258
258
  gea/fixtures/comcat_youngstown_2011-2012.txt
259
259
  gea/fixtures/ne_110m_coastline.json
260
+ gea/help/IT_SECURITY.md
260
261
  gea/help/TESTER_GUIDE.md
261
262
  gea/help/alarms.md
262
263
  gea/help/alerts.md
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "gea-program"
7
- version = "0.56.0"
7
+ version = "0.57.0"
8
8
  description = "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."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
File without changes
File without changes
File without changes
File without changes