ecoportal-api-graphql 2.0.0 → 2.2.1

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 (365) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +397 -14
  3. data/LICENSE +21 -21
  4. data/README.md +24 -24
  5. data/lib/ecoportal/api/common/graphql/auth_service.rb +115 -115
  6. data/lib/ecoportal/api/common/graphql/class_helpers.rb +46 -46
  7. data/lib/ecoportal/api/common/graphql/client.rb +69 -69
  8. data/lib/ecoportal/api/common/graphql/hash_helpers.rb +105 -105
  9. data/lib/ecoportal/api/common/graphql/http_client.rb +85 -2
  10. data/lib/ecoportal/api/common/graphql/model/as_input.rb +54 -54
  11. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +49 -49
  12. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +188 -188
  13. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff.rb +55 -55
  14. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +295 -295
  15. data/lib/ecoportal/api/common/graphql/model/diffable/leaf_diff_service.rb +1 -1
  16. data/lib/ecoportal/api/common/graphql/model.rb +17 -17
  17. data/lib/ecoportal/api/common/graphql/patches.rb +1 -1
  18. data/lib/ecoportal/api/common/graphql/query_integration.rb +45 -45
  19. data/lib/ecoportal/api/common/graphql.rb +16 -16
  20. data/lib/ecoportal/api/common.graphql.rb +8 -8
  21. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  22. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +1 -1
  23. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  24. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  25. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -16
  26. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  27. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  28. data/lib/ecoportal/api/graphql/base/location_node.rb +14 -14
  29. data/lib/ecoportal/api/graphql/base/location_structure/draft/structure.rb +37 -37
  30. data/lib/ecoportal/api/graphql/base/location_structure/draft.rb +93 -93
  31. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -9
  32. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -18
  33. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -29
  34. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +1 -1
  35. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +1 -1
  36. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -23
  37. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -24
  38. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +1 -1
  39. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -8
  40. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -9
  41. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -17
  42. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -26
  43. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -9
  44. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -17
  45. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -9
  46. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -21
  47. data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +51 -0
  48. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -15
  49. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -48
  50. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  51. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -39
  52. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -27
  53. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -30
  54. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -34
  55. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -35
  56. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  57. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -23
  58. data/lib/ecoportal/api/graphql/base/register.rb +1 -1
  59. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  60. data/lib/ecoportal/api/graphql/base/template/change_log_entry.rb +118 -0
  61. data/lib/ecoportal/api/graphql/base/template.rb +2 -0
  62. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  63. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  64. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  65. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -84
  66. data/lib/ecoportal/api/graphql/builder/register.rb +49 -49
  67. data/lib/ecoportal/api/graphql/builder/template.rb +28 -0
  68. data/lib/ecoportal/api/graphql/builder/template_builder.rb +21 -2
  69. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +1 -1
  70. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -23
  71. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -84
  72. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -33
  73. data/lib/ecoportal/api/graphql/compat.rb +17 -17
  74. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -71
  75. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -68
  76. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -60
  77. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -11
  78. data/lib/ecoportal/api/graphql/connection/template_change_log.rb +19 -0
  79. data/lib/ecoportal/api/graphql/connection.rb +1 -0
  80. data/lib/ecoportal/api/graphql/diff/change.rb +7 -2
  81. data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +19 -1
  82. data/lib/ecoportal/api/graphql/diff/version_diff.rb +13 -6
  83. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  84. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  85. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  86. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  87. data/lib/ecoportal/api/graphql/error.rb +12 -12
  88. data/lib/ecoportal/api/graphql/file_upload.rb +10 -10
  89. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  90. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  91. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  92. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  93. data/lib/ecoportal/api/graphql/fragment/page.rb +1 -0
  94. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +4 -2
  95. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -15
  96. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  97. data/lib/ecoportal/api/graphql/fragment/permissions.rb +0 -2
  98. data/lib/ecoportal/api/graphql/fragment/template_change_log.rb +102 -0
  99. data/lib/ecoportal/api/graphql/fragment.rb +1 -0
  100. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  101. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  102. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  103. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  104. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  105. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  106. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  107. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -16
  108. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  109. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  110. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  111. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  112. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  113. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  114. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  115. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  116. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +21 -13
  117. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  118. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  119. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  120. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  121. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -14
  122. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -13
  123. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -13
  124. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -18
  125. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -13
  126. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -13
  127. data/lib/ecoportal/api/graphql/input/page/review_task.rb +27 -14
  128. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -14
  129. data/lib/ecoportal/api/graphql/input/page/update.rb +2 -2
  130. data/lib/ecoportal/api/graphql/input/page.rb +26 -26
  131. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -18
  132. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -16
  133. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +1 -1
  134. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -14
  135. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -18
  136. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -15
  137. data/lib/ecoportal/api/graphql/input/register.rb +13 -13
  138. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  139. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -234
  140. data/lib/ecoportal/api/graphql/input/search_conf.rb +1 -1
  141. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  142. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  143. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -18
  144. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -18
  145. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -18
  146. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -18
  147. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -18
  148. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -18
  149. data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +10 -9
  150. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -18
  151. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -23
  152. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -18
  153. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -18
  154. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -18
  155. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -18
  156. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -18
  157. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -18
  158. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -18
  159. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -18
  160. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -18
  161. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -23
  162. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -18
  163. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -18
  164. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +25 -19
  165. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -18
  166. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -18
  167. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -18
  168. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -18
  169. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -18
  170. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -18
  171. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -18
  172. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -18
  173. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -18
  174. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -18
  175. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +7 -2
  176. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +21 -18
  177. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -19
  178. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -19
  179. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -18
  180. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -18
  181. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -18
  182. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -18
  183. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -18
  184. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -18
  185. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -18
  186. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -22
  187. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -18
  188. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +23 -19
  189. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -18
  190. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -18
  191. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -18
  192. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_basic_settings.rb +7 -2
  193. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_container_uid.rb +1 -1
  194. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -18
  195. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -18
  196. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +28 -24
  197. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +8 -2
  198. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -20
  199. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -24
  200. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +8 -2
  201. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -20
  202. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -25
  203. data/lib/ecoportal/api/graphql/input/workflow_command/manage_copy_page_configuration.rb +47 -0
  204. data/lib/ecoportal/api/graphql/input/workflow_command/move_section_to_stage.rb +33 -0
  205. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -18
  206. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -18
  207. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -18
  208. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -18
  209. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -18
  210. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -18
  211. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -18
  212. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -18
  213. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -18
  214. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -18
  215. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -18
  216. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -18
  217. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -18
  218. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -18
  219. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -18
  220. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -18
  221. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -18
  222. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -18
  223. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -18
  224. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -18
  225. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -18
  226. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -18
  227. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -18
  228. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -18
  229. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -18
  230. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -18
  231. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -18
  232. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -18
  233. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -18
  234. data/lib/ecoportal/api/graphql/input/workflow_command.rb +5 -0
  235. data/lib/ecoportal/api/graphql/interface/base_page.rb +14 -0
  236. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  237. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  238. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  239. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -15
  240. data/lib/ecoportal/api/graphql/logic/base_query.rb +260 -193
  241. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  242. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  243. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  244. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  245. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  246. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  247. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  248. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  249. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -10
  250. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  251. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  252. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  253. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  254. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  255. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  256. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  257. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  258. data/lib/ecoportal/api/graphql/model/organization.rb +9 -0
  259. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -14
  260. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  261. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  262. data/lib/ecoportal/api/graphql/model/page/phased.rb +17 -0
  263. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  264. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -21
  265. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -20
  266. data/lib/ecoportal/api/graphql/model/permissions.rb +6 -0
  267. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -10
  268. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -10
  269. data/lib/ecoportal/api/graphql/model/register.rb +10 -10
  270. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  271. data/lib/ecoportal/api/graphql/model/template/change_log_entry.rb +19 -0
  272. data/lib/ecoportal/api/graphql/model/template.rb +4 -1
  273. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  274. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  275. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  276. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  277. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  278. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +1 -1
  279. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +1 -1
  280. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -13
  281. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  282. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  283. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  284. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  285. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  286. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  287. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  288. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  289. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  290. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  291. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  292. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +1 -1
  293. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -40
  294. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +1 -1
  295. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -50
  296. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +1 -1
  297. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -43
  298. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +1 -1
  299. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +1 -1
  300. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +1 -1
  301. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +1 -1
  302. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -40
  303. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +1 -1
  304. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -40
  305. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -28
  306. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -35
  307. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +1 -1
  308. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -37
  309. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -35
  310. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -15
  311. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -35
  312. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +1 -1
  313. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -35
  314. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -14
  315. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  316. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  317. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  318. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  319. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -12
  320. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  321. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  322. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  323. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +2 -2
  324. data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +2 -2
  325. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  326. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  327. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  328. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  329. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  330. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  331. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  332. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  333. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +1 -1
  334. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -13
  335. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -13
  336. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -13
  337. data/lib/ecoportal/api/graphql/payload/page/draft.rb +1 -1
  338. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +1 -1
  339. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -13
  340. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -13
  341. data/lib/ecoportal/api/graphql/payload/preset_view.rb +1 -1
  342. data/lib/ecoportal/api/graphql/payload/register.rb +1 -1
  343. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  344. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  345. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  346. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  347. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -76
  348. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  349. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -47
  350. data/lib/ecoportal/api/graphql/query/pages.rb +59 -59
  351. data/lib/ecoportal/api/graphql/query/permissions.rb +1 -1
  352. data/lib/ecoportal/api/graphql/query/person_members.rb +76 -0
  353. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +1 -1
  354. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -83
  355. data/lib/ecoportal/api/graphql/query/template_change_log.rb +118 -0
  356. data/lib/ecoportal/api/graphql/query/templates.rb +53 -53
  357. data/lib/ecoportal/api/graphql/query.rb +2 -0
  358. data/lib/ecoportal/api/graphql_version.rb +1 -1
  359. data/lib/ecoportal/api-graphql.rb +10 -10
  360. metadata +11 -8
  361. data/lib/ecoportal/api/common/graphql/CLAUDE.md +0 -36
  362. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +0 -28
  363. data/lib/ecoportal/api/graphql/CLAUDE.md +0 -37
  364. data/lib/ecoportal/api/graphql/base/CLAUDE.md +0 -50
  365. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +0 -65
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e679d934d9305d1926abe7251617eea0e5333c04665672b25f5ad38afb67d9b3
4
- data.tar.gz: 2b8047d56b9af371b71308bcabce23f8e4c4b67d014ce7a4095386fadb1f89f4
3
+ metadata.gz: 128e83d1aa8d0fa5b9e4ce95f8bbd5f8bd4f219ea7d7a94dd18ec31225ac3ce9
4
+ data.tar.gz: 7d79138b320e6ba09221bd79a4c341ef9dc039f4ccf6923567f3f4b36f657c27
5
5
  SHA512:
6
- metadata.gz: 6ec6f2792de809534943497a98a74ec012b061778d379bb9f8ac205805cd9a629386c3293ee00e647549564fed5edbbc80e73cf856340922548309b8e9c68435
7
- data.tar.gz: 948f0064aa886e310fc24f78a3919cbccc3b192495c724d86d003e1ff03bd39d2d12b312e82c04ca6626779abd822f9f9914de44b651c4903ba51d275085f7e8
6
+ metadata.gz: 04cb9487e78e2f11b4c71572bc17915570a8638da67df94cfa27f0dfb3400d2c9f67bcaf25ac1b5bb61f86f1884f5af88b3adf961528ef8d3e5567607fcc1140
7
+ data.tar.gz: 3036e3e2295a5a2eb5876e66b145d09f3fd1a96fc174234f77621b0cd553ad2e501dc4d9c1baf74077990d9ed03c77e9bb8c8858cec97005e7dbefbeb05bda45
data/CHANGELOG.md CHANGED
@@ -2,7 +2,391 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [Unreleased]
5
+ ## [2.2.1] - 2026-09-30
6
+
7
+ ### Security
8
+
9
+ - Security republish of `2.2.0` -- backwards-compatible: removes customer and internal identifiers
10
+ from shipped comments and this changelog. Packaging is unchanged: `2.2.0` already shipped only
11
+ allowlisted files (`lib/**/*.rb` plus the named root docs).
12
+
13
+ ### Fixed
14
+
15
+ - **Fixed:** `api.permissions` (`Query::Permissions`) failed against live after the 2026-09-29
16
+ platform release, which removed `Permissions.pageSmartAssistantCanChat` and
17
+ `Permissions.registerAssistantCanChat` (smart-assistant consolidation). `Fragment::Permissions` no
18
+ longer selects them. The model accessors are kept, deprecated, and now always return `nil`, so
19
+ callers do not break. Affects every earlier version, including 2.2.0.
20
+
21
+ ### Added
22
+
23
+ - **Added:** `WorkflowCommand` builder for `moveSectionToStage` (new in the 2026-09-29 live schema):
24
+ `build(:moveSectionToStage, source_stage_id:, target_stage_id:, section_id:, anchorId:, anchorPosition:)`,
25
+ moving an existing section to another stage. `anchorPosition` is validated like the other anchor commands.
26
+
27
+ ## [2.2.0] - 2026-09-02
28
+
29
+ ★ **This release supersedes 2.1.0, which was version-bumped and changelogged on 2026-08-21 but never
30
+ tagged or published** — RubyGems' highest was still 2.0.0. Do not go looking for 2.1.0; it does not
31
+ exist as a gem. Its contents are included below by inheritance (they were already on `main`), and
32
+ 2.2.0 adds what landed after that bump. Publishing the 2.1.0 artifact would have shipped a state
33
+ already superseded by merged `lib/` fixes and required a second release immediately.
34
+
35
+ **Minor, not patch:** `Input::WorkflowCommand::AddSelectFieldOption.build` now REQUIRES a `value:`
36
+ keyword. Under the versioning convention (minor = breaking, patch = compatible) that is breaking,
37
+ even though the omitted argument meant the old call shape was already rejected by the server — a
38
+ caller adapting to this is changing working-looking code.
39
+
40
+ ### Added
41
+
42
+ - `tools/template_yaml/yaml_to_raw_json.py` -- a small, self-contained YAML-to-raw-JSON bridge
43
+ (inlines the BSON-aware `EpLoader`/`load_dump` the retired Python projector used) so a template
44
+ backup YAML attached to a ticket can still be fed to the Ruby CLI, which only ever reads JSON.
45
+ Drops `update_histories` by default (churn neither projector read, and a recurring source of
46
+ corrupted ObjectIds), with `--keep-churn` to keep it.
47
+
48
+
49
+ - **`Page#all_tags` / `Stage#all_tags` read side** (`Model::Page::Phased`, `Base::Page::Phased::Stage`,
50
+ `Interface::BasePage`): the compiled tag set for a page or a single stage, folded client-side from
51
+ the page's `baseTags` and the stage's own tags, with both fetched by the page fragments
52
+ (`Fragment::Page`, `Fragment::Pages::CommonPageUnion`). `Stage#page` now resolves through the
53
+ native `DoubleModel` root reference rather than a hand-rolled back-pointer, and `location_ids`
54
+ is redirected page -> stage accordingly.
55
+
56
+ ★ This code was written on 2026-07-06 and then sat on three unmerged local branches for seven
57
+ weeks. `main` never received it in any form, and no other trace of it exists in history --
58
+ deleting those branches during a sweep would have lost a spec-covered feature permanently. It is
59
+ cherry-picked here onto current `main` rather than merged from the branch: `main` has since
60
+ changed four of the five files involved, so taking the branch's copies wholesale would have
61
+ reverted shipped fixes. That is the stranded-work failure mode this repo has a root-cause note
62
+ about, caught this time only because a branch sweep asked what each unmerged branch actually
63
+ contained.
64
+
65
+ - `tools/template_yaml/forces_walker.rb`: Ruby port of the template projector's `project_forces` /
66
+ `script_identifiers` (P4), classifying each binding as a FIELD or a SECTION target rather than
67
+ conflating the two, and reporting the unread force-level `globalBindings` gap as unverified
68
+ instead of as a finding. Gated by `tools/template_yaml/compare_forces.rb` against the Python IR.
69
+
70
+ - `tools/template_yaml/review.rb` / `update_gate.rb`: Ruby port of the template projector's
71
+ `review` / `update_gate` (P5), refusing a template's bulk update PER TEMPLATE (not per field)
72
+ when no field carries a usable identifier or identifiers are non-unique. Adds a Ruby-only
73
+ `ximport` tooltip guard: fields marked exclude-from-import are counted and protected, never
74
+ treated as overwritable. `Delta.call`'s `reviewer:` seam is now wired to `Review.method(:call)`,
75
+ so `review_findings` appears in the delta payload. Gated by `tools/template_yaml/compare_gate.rb`
76
+ against a customer's 18 templates -- refusal set matches the Python exactly.
77
+
78
+ - `tools/template_yaml/model.rb`: Ruby port of the template projector's `project(doc, source)`
79
+ (P3's IR assembly), composing field and force walks into a compact IR dict with key order
80
+ matching the Python prototype for P8 differential acceptance.
81
+ - `tools/template_yaml/render_markdown.rb`: Ruby port of `render_markdown(model, findings)` (P7),
82
+ rendering a template and its review findings as Markdown with all Python quirks reproduced
83
+ verbatim: the dead `stage` column, escape-then-truncate on `label`, redundant `type` re-split,
84
+ CRLF-to-LF normalization on force scripts, and preserved literals like `'(unnamed)'`,
85
+ `'(no custom script)'`, `'(none)'`.
86
+ - `tools/template_yaml/cli.rb`: Ruby CLI entrypoint matching Python's `main()` (P7), supporting
87
+ single-file and directory modes, `--out`, `--json`, and `--delta` flags. **Input is JSON
88
+ (`*.json`), not YAML**, per Loader's design (see loader.rb header). File writes are LF-only
89
+ on all platforms via binary mode. Directory mode processes `*.json` files alphabetically,
90
+ accumulates an `_index.md` at the end, and leaves earlier files on disk if an error occurs
91
+ mid-run (no transactional cleanup).
92
+
93
+ - `tools/template_yaml/differential_gate.rb`: P8, the template-yaml Ruby port's acceptance gate.
94
+ Regenerates BOTH IRs fresh in one run -- Ruby in-process (`Loader` -> `Model.build` -> `Review`
95
+ -> `UpdateGate`) over the `*.json` corpus, Python via a single batched subprocess (direct
96
+ import of `ep_template_yaml.py`, not its CLI) over the `*.yaml` corpus -- and diffs the ENTIRE
97
+ IR: every template attribute, every field, every force (incl. bindings), every review finding,
98
+ and the `update_gate` refusal set. Live run over a customer's 18 templates: **`P8 GATE: PASS`**,
99
+ 0 unexpected divergences, 12 expected (the six known-corrected ObjectIds, each seen twice --
100
+ once as a field id, once as a binding `reference_id`).
101
+ - `tools/template_yaml/known_divergences.rb`: the six-id whitelist and its `corrupted_id?` rule,
102
+ extracted out of `compare_fields.rb` so P3's gate and the new P8 gate share one definition
103
+ instead of two copies drifting apart.
104
+ - Fixed a Ruby port defect in `review.rb`, found live by the P8 differential run: finding
105
+ `detail` text quoted force/binding/field names with Ruby's `String#inspect` (always
106
+ double-quoted) where the Python source uses `%r` (CPython `repr()`, single-quoted by
107
+ default). Added `Review.py_repr` to reproduce Python's exact quoting.
108
+ - Excluded `patch_ver` and `updated_at` from P8's template-attribute comparison, alongside the
109
+ pre-existing `source_file` exclusion: the `templates_yaml`/`templates_json` fixture corpora
110
+ under `tmp/mns_01_tooltip_update/` are two separate exports pulled two days apart (confirmed
111
+ by file mtime), so these two pass-through fields legitimately disagree -- a corpus-provenance
112
+ artifact, not a port defect. `compare_fields.rb` / `compare_forces.rb`'s existing 0-unexpected
113
+ results already proved field/force content is identical across the two pulls.
114
+
115
+ ### Changed
116
+
117
+ - **Changed** what a failing query prints. `Logic::BaseQuery`'s rescue used to `pp kargs` /
118
+ `pp query_params` / `pp block` to **stdout** on every error. That existed for a real reason —
119
+ graphlient masks the origin, so it was the only way to see which query failed — but it put GraphQL
120
+ variables (page ids, emails, field values) on stdout and into CI logs. Ruby populates `.cause` when
121
+ raising inside a rescue, so the original error keeps the source location `graphql-client`
122
+ deliberately sets: the report now names `err.cause`'s class and **the failing query's own source
123
+ location** on **stderr**, which is more of what the dump was for. Variables are emitted only when
124
+ the client's existing `deep_logging` flag is on; `pp block` is dropped. A blank message (which
125
+ graphlient's `GraphQLError#to_s` can render) is now labelled instead of printing nothing.
126
+ Tracked as Q-43.
127
+
128
+ ### Fixed
129
+
130
+ - **Fixed** `currentOrganization.pageActivities` returning nothing. The wiring in
131
+ `Model::Organization` injected `base_path: ['currentOrganization']`, which overrides the
132
+ `base_path 'currentOrganization.page'` declared by `Query::PageActivities` — so the client
133
+ dug `currentOrganization.activities`, a path the emitted document never contains (the
134
+ inline-fragment `activities` merges into `page`). Added `subpath: 'page'`, plus a spec that
135
+ compares every wired query's declared base_path against the one the wiring injects, so the
136
+ whole class of bug is guarded rather than the one instance. Tracked as Q-13.
137
+
138
+ - **Fixed** `Common::GraphQL::ResponseError` discarding `errors[].extensions`. It now carries the
139
+ raw error entries and exposes `#errors`, `#extensions`, `#codes`, `#details`, `#full_messages`
140
+ and `#unauthorized?`. This is what makes a permission problem distinguishable from a request
141
+ problem in Ruby — the diagnosis a customer integration pack tells customers to perform, which until now no tool
142
+ built on this gem could actually follow. The message still LEADS with the joined server messages
143
+ (existing matchers keep working) and appends `code:` / `details:` after them. `tools/<customer>/cli.rb`
144
+ now reports the server's own classification instead of sniffing the message for `/unauthoriz/i` —
145
+ a sniff that could not tell a policy refusal from a FIELD-level gate. Tracked as Q-27.
146
+
147
+ - **Fixed** `Payload::Kickstand::BulkUpdateJobs` and `BulkUpdateWorkflows` raising `NoMethodError`
148
+ on `#items` and `#errors`. Both called `from_doc`, which is a per-class convention in this gem
149
+ (only 7 classes define one) and does not exist on `Base::Kickstand::Job`/`Workflow` or on
150
+ `Error::ValidationErrors`. Any caller reading the result of a Kickstand bulk update crashed.
151
+ Replaced with the real constructor, `new(doc)`. These two classes had **no spec of any kind** —
152
+ that is why it shipped — so this adds the missing coverage (12 examples over both, shared) as
153
+ well as the guard. Found while mapping the client's failure surface for Q-31.
154
+
155
+ - **Packaging allowlist is now keyed on the full path, not the root directory.** `spec.files`
156
+ previously allowed anything under `lib/` or `exe/`, which packaged five `CLAUDE.md`
157
+ agent-instruction files living inside `lib/` (573 files now ship, down from 578). The
158
+ publish-time gate in `scripts/release_smoke_check.rb` had the same hole -- it exempted `lib/`
159
+ wholesale, so it could not see them by construction. Both now require every packaged path to
160
+ match `lib/**/*.rb`, `exe/*`, or one of the three named root docs, and the rule is pinned by
161
+ `spec/packaging_spec.rb` (15 examples, including one that proves the excluded files remain
162
+ tracked in the repo). No credentials or customer data were ever affected.
163
+
164
+ - **Seven workflow-command input builders were silently discarding arguments the backend accepts.**
165
+ Each builder filters its keyword arguments through an allowlist with `kwargs.slice(*KEYS)`, so a
166
+ key missing from the allowlist is dropped before the request is built: no error, no warning, no
167
+ effect. The mutation succeeds and does nothing.
168
+
169
+ | command | argument restored |
170
+ |---|---|
171
+ | `addSelectFieldOption` | `value` — ★ `required: true` on the backend, so **every call this builder produced was rejected by the server** |
172
+ | `editSelectFieldOption` | `value` |
173
+ | `editFieldConfiguration` | `required`, `hiddenOnReports` |
174
+ | `editTemplateBasicSettings` | `enableCopyPage` |
175
+ | `EditFieldConfiguration::PlainText` | `multiline` |
176
+ | `EditFieldConfiguration::ContractorEntities` | `applyPermissionsToParent` (distinct from `applyAttachedContractorsPermissionsTo`, which was already present) |
177
+ | `editForce` | `lastSyncedAt` |
178
+
179
+ Found by comparing all 123 command-bus inputs against the backend Rails source rather than
180
+ against the gem's stored introspection snapshot — that snapshot is dated 2026-07-30, does not
181
+ show these arguments, and would have confirmed the wrong answer. 104 commands were verified
182
+ clean. Every restored key is now pinned by a spec asserting on the OUTPUT of `build`, and three
183
+ of the affected classes had no spec file at all before this, which is a large part of how the
184
+ drift survived.
185
+
186
+ - **`Diff::Change` and the template-builder options DSL now carry an option's `value`.** Making
187
+ `value` required on `AddSelectFieldOption.build` exposed that two production paths never had one:
188
+ `Builder::TemplateBuilder#emit_options` and `Diff::CommandSynthesizer#option_command`. Neither had
189
+ ever been able to emit a valid `addSelectFieldOption`; the specs that passed were pinning a
190
+ command shape the server rejects. `VersionDiff#index_options` now captures `o['value']` alongside
191
+ label and weight — the field was already being fetched by the page-content fragment and thrown
192
+ away by the diff layer. Where no value is available, both paths **raise** naming the option and
193
+ field: `value` is documented as cast to a number for numeric select fields, so defaulting it to
194
+ the label would silently store wrong data on precisely the scored fields that matter.
195
+
196
+ - Corrected a false comment in `add_field.rb` asserting that a field's `required` flag "cannot be
197
+ persisted through the workflow command bus at all". It can, via `editFieldConfiguration`. A
198
+ comment stating a platform limitation that does not exist is worse than no comment: it stops
199
+ people trying.
200
+
201
+ ### Removed
202
+
203
+ - `tools/template_yaml/ep_template_yaml.py` and `tools/template_yaml/mns_review.py` -- the
204
+ original Python template-backup projector and its cross-template audit. P9 of the template-yaml
205
+ Ruby port: the Ruby port (`model.rb`, `review.rb`, `update_gate.rb`, `render_markdown.rb`,
206
+ `cli.rb`) was proven byte/field-parity-identical to both by the P8 differential gate
207
+ (`differential_gate.rb`, 0 unexpected divergences over 18 live templates) before removal, and
208
+ the last remaining live use case -- a Jira ticket's YAML-only attachment (EPT-1872) -- was
209
+ re-verified against the promoted bridge (`yaml_to_raw_json.py`) with byte-identical
210
+ Python/Ruby deltas. Recoverable in full: `git show
211
+ 0caa6f3d80c6495a9f92132178b9a6a42deb40f5:tools/template_yaml/ep_template_yaml.py` (and the same
212
+ path for `mns_review.py`).
213
+
214
+ ## [2.1.0] - 2026-08-21
215
+
216
+ Everything accumulated on `main` since `v2.0.0` (2026-08-13): 150 commits touching 73 files under
217
+ `lib/`. **Minor, not patch:** the bulk is additive -- new data-field models, the last command-bus
218
+ command, a native people-directory query, template-change-log reading -- and 73 library files is not
219
+ a patch by any honest reading. **Minor, not major:** no surface was removed or reshaped, so `~> 2.0`
220
+ consumers adopt it without a floor change.
221
+
222
+ ★ Why this release exists at all, beyond the contents: a remote clone installs PUBLISHED gems, so
223
+ until this went out none of that work could reach the api runner -- and `main` could not be released
224
+ either, because its version constant still read `2.0.0`, which `rake release:check` correctly refuses
225
+ as already published. Three weeks of library work with no route to a remote is the failure mode this
226
+ closes.
227
+
228
+
229
+ ### Added
230
+
231
+ - **Wired the `manageCopyPageConfiguration` workflow command** (`Input::WorkflowCommand::ManageCopyPageConfiguration`,
232
+ first observed in the live schema 20260819): controls `overridePageCreatorPermissions`,
233
+ `autoIncludeNewContent`, and per-data-field `inclusionSettingsChanges` (`dataFieldId` /
234
+ `include` / `enforce`) for copy-page behaviour. Closes the last gap in the command bus --
235
+ `validate-queries` now reports 106/106 commands wired.
236
+
237
+ - `tools/<customer>/collection.rb` -- a pure-Ruby, stdlib-only read interface over a customer's Postman "ALL
238
+ CASES" master collection (the sibling `ep-api-collections` repo masters it; this gem never
239
+ hand-copies its knowledge). Walks the folder tree, exposes each GraphQL request's full path,
240
+ name, query, parsed variables, and `{{placeholder}}` inventory, with a name/path lookup that
241
+ tolerates a folder-path prefix and raises a named error listing near-matches when nothing
242
+ resolves. `spec/tools/<customer>/collection_sync_spec.rb` pins the webhook-admin and build/update-page
243
+ request paths plus the placeholders the tooling depends on, and fails -- naming exactly what
244
+ disappeared -- if the collection renames or removes one of them; it skips cleanly (not fails)
245
+ when no sibling checkout is present. See `tools/<customer>/README.md`.
246
+
247
+ - `tools/template_yaml/mns_review.py` -- cross-template audit over a directory of IR projections:
248
+ identifier coverage, `templateContainerUid` uniqueness and name plausibility, findings by code,
249
+ authoring-maturity signal, and classification of orphaned force bindings into projector gaps
250
+ versus real defects (checked against the source dumps). First run recorded in
251
+ `tools/template_yaml/reviews/2026-08-09-<customer>-18-templates.md`.
252
+
253
+ - **`tools/<customer>/cli.rb`** -- a Ruby CLI that creates/lists/destroys a customer's webhook
254
+ subscription and verifies the setup read-only, runnable from a support server with nothing
255
+ but `USER_EMAIL`/`USER_PASS` supplied (every other value defaults to a customer UAT org, EU
256
+ instance). `webhook create` is idempotent in practice: it lists first and reports the
257
+ existing subscription instead of creating a duplicate when one already matches the URL and
258
+ template(s). `--dry-run` prints the GraphQL document and variables with no network call.
259
+ Document builders live in `tools/<customer>/webhooks.rb` (`<Customer>Webhooks::Documents`) as pure
260
+ functions, spec'd in `spec/tools/<customer>/webhooks_spec.rb` with no network involved.
261
+
262
+ - **`Query::PersonMembers`** — the GraphQL-native people-directory path over
263
+ `organization.personMembers`, filling the gap flagged in `model/organization.rb`. Salvaged
264
+ from a stranded July branch (`feat/scim-apiv0-adapter-design`) whose SCIM design and
265
+ scaffold were superseded by the `ecoportal-scim` gem's `apiv0-people-adapter` project; this
266
+ query was the only part of it with no equivalent anywhere. ★ It is NOT the SCIM-sourced
267
+ People replacement for the APIv0 retirement — that port lives in `ecoportal-scim`.
268
+ Reuses the existing `Base`/`Model`/`Connection::PersonMember` classes; no new models.
269
+
270
+ - `scripts/release_smoke_check.rb` — pre-push gate for BUILT gem artifacts (any gem in the
271
+ stack): packaging allowlist, byte corruption (`\r\r`, BOM, mixed EOL), and corruption-class
272
+ parse warnings via `ruby -wc`. Proven against real defects: red on eco-helpers 3.2.21
273
+ (shipped `\r\r\n`) and on the first 3.2.22 build (CHANGELOG `\r\r` via autocrlf smudge),
274
+ green on the corrected artifacts. Run it on every `.gem` before `gem push`.
275
+
276
+ - **Template change log now reports WHAT changed**, not only who/when/which-resource. New
277
+ registered fragment `:TemplateChangeLogEntryDetail`, opt-in via
278
+ `api.template.change_log(id:, first:, detail: true)` or
279
+ `&Query::TemplateChangeLog.detail_block`. The default selection is unchanged and still light —
280
+ the common "who touched this template and when" read does not pay for per-type detail.
281
+ `Base::Template::ChangeLogEntry` gains `#changes`, `#changeMessages`, `#detail_kind`
282
+ (`:changes` / `:change_messages` / `:es_changes` / nil) and `#detail?`.
283
+ ★ The three concrete command types report changes in three different shapes, so `#changes`
284
+ returns raw hashes rather than a typed embed that would have to lie about one of them:
285
+ `PagesWorkflowCommandChange.changes` is `{field, from, to}` with STRING values;
286
+ `PagesWorkflowCommandEsChange.changes` has `from`/`to` as `StoredEsFilterType` OBJECTS (only
287
+ `field` is selected, so an ES change names which filter moved, not its before/after);
288
+ `PagesWorkflowCommandChangeMessage` carries pre-rendered `changeMessages` and no field/from/to.
289
+ Branch on `#detail_kind`. ★ Empty readers mean NOT SELECTED, never "nothing changed".
290
+
291
+ - **Template change log (GraphQL-native)** — `Query::TemplateChangeLog` reads the platform's
292
+ per-change audit log for a template: "for template X, who changed what and when", newest first,
293
+ paginated. Reachable as `api.template.change_log(id: template_page_id, first: 50)`, or bare
294
+ (`api.template.change_log.each(id: …)`) for an auto-paginating enumerator.
295
+ Read path: `currentOrganization.page(id:) → template → commands` — `template` is declared on
296
+ `BasePageInterface`, so it is selected through a type condition (selecting on the returned
297
+ `PageUnion` directly is invalid GraphQL). New supporting types:
298
+ `Base::Template::ChangeLogEntry`, `Model::Template::ChangeLogEntry` (adds the `owner` embed —
299
+ WHO changed it), `Connection::TemplateChangeLog`, and the registered fragment
300
+ `:TemplateChangeLogEntry` on the interface `PagesWorkflowCommandInterface`.
301
+ ★ Two access caveats, both silent and both documented on `Base::Template::ChangeLogEntry`:
302
+ (1) the connection is **nil, not empty**, unless the caller satisfies
303
+ `Pages::TemplatePolicy#update_information?` — a read-only account sees no log and no error, so
304
+ never read nil as "nothing changed"; (2) the server scope is `from_template_builder`, so only
305
+ `TEMPLATE_BUILDER`-sourced commands appear — `WORKFLOW_BUILDER` changes to the same page are
306
+ excluded (those are on `Query::PagesWorkflowCommands`).
307
+ ★ Why this beats polling a watermark: a forces run writes with `skip_patch_incr` + `timeless`,
308
+ bumping **neither `patchVer` nor `updatedAt`** — any watermark-polling change tracker is blind to
309
+ force-driven change, whereas the command log is per-change. (Open: whether forces run against
310
+ templates specifically is not confirmed.)
311
+ Also documented in the repo's internal docs.
312
+
313
+ - **New tool `tools/template_yaml/delta.rb`** (P6 of the template-YAML-tooling Ruby port): the
314
+ deterministic before/after difference between two `project()` snapshots, shaped for the Rovo
315
+ delta-verification agent. Field pairing on id-then-identifier (so a REBUILT field -- new id,
316
+ same `description` -- is one `changed` entry rather than an add/remove pair), `TRACKED`-only
317
+ attribute diffing, force diffing by name with binding set-difference, the five-key template
318
+ diff, and the four `not_evaluable` strings reproduced VERBATIM, because the Rovo agent is
319
+ instructed to read that list literally and any wording drift changes what it is told it cannot
320
+ verify. **Verified against the canonical Python on the known pre/post pair (all 7 comparable
321
+ sections identical) and on 9 synthetic scenarios covering every branch -- rebuild, removal,
322
+ untracked-only change, template attributes, force add/remove/script/binding-set-diff, and
323
+ reference-id-only binding moves -- 0 mismatches.**
324
+ - **`Delta::Result` reports what the pairing could not say cleanly** -- colliding pairing keys,
325
+ duplicate force names (only the last is diffed), and rebuild pairings -- rather than returning
326
+ a bare hash the way the Python does. `review_findings` is **omitted** from the payload until a
327
+ reviewer is injected (it re-runs `review()`, which is P5): emitting an empty list there would
328
+ read as "no findings" when the truth is "not checked".
329
+ - **Corrected `P1-CONTRACT.md` section 8.** It claimed `_key` can return `None` and that fields
330
+ with neither id nor description are "filtered out of both snapshots entirely ... invisible to
331
+ `delta` by construction". Verified by running the Python: `'ref:' + ''` is truthy, so the
332
+ `or None` branch is unreachable and `_key` never returns `None`. Those fields are not filtered
333
+ out -- they all collapse onto the single key `'ref:'`, so an unidentified field in `before`
334
+ pairs with an **unrelated** unidentified field in `after` and their differences are reported as
335
+ a change. Not a live defect (every membrane in the JSON export carries a validated hex `_id`),
336
+ but a latent trap; the port reproduces it for parity and warns on it.
337
+
338
+ - **New tools `tools/template_yaml/field_walker.rb` + `tools/template_yaml/compare_fields.rb`**
339
+ (P3 of the template-YAML-tooling Ruby port): enumerates a template's fields in on-screen
340
+ LAYOUT order -- `flow_nodes` by `weight`, then `membrane_ids` / `left_membrane_ids` /
341
+ `right_membrane_ids`, then each id list in stored order -- porting the Python projector's
342
+ `walk_fields` against the contract frozen in `P1-CONTRACT.md`.
343
+ **Verified against the real 18-template customer dump set: 2,714 fields, ids and ordering match the
344
+ Python projector exactly, with 0 unexpected divergences.** The only 6 differences are the
345
+ `ActionsList` ids the Python's YAML path corrupts (a contiguous run of `ActionsList` ids), where
346
+ the Ruby is correct and the Python is not; `compare_fields.rb` whitelists those six BY VALUE,
347
+ so a seventh divergence -- or any ordering defect on that same template -- still fails.
348
+ - **`FieldWalker` distinguishes "no fields" from "could not see the fields"**, which the Python
349
+ cannot: it returns a `Result` carrying the faithful field list plus every membrane it dropped,
350
+ every layout reference it could not resolve, duplicate placements, non-hash nodes and
351
+ defaulted weights, with `#blind?` true exactly when an empty list is untrustworthy. A
352
+ command-bus-built template with no layout, a `SplitSection` with no `dataFields`, and a
353
+ genuinely empty template all return an empty or short list from the Python with no error; they
354
+ are now told apart. Three port-critical quirks are preserved deliberately and covered by
355
+ specs: Python truthiness in the `or` chains (an empty `heading` must fall through to
356
+ `left_heading`, an empty `_type` must stay `''` -- `''` is truthy in Ruby), the STABLE node
357
+ sort (`Array#sort_by` is not stable), and `bool`-is-`int` weights.
358
+
359
+ - **New tools `tools/template_yaml/loader.rb` + `tools/template_yaml/id_guard.rb`** (P2 of the
360
+ template-YAML-tooling Ruby port): loads an ecoPortal template backup dump from its **JSON**
361
+ export -- not the YAML -- and validates every id-shaped value against `/\A[0-9a-f]{24}\z/`,
362
+ raising loudly (template, field path, offending value) rather than letting a bad id through.
363
+ Reading JSON instead of YAML is deliberate: the Python projector's YAML path decodes
364
+ `!ruby/object:BSON::ObjectId` via a step with a silent-failure mode (confirmed unchanged on
365
+ the canonical post-!86 surface in `P1-CONTRACT.md`) that corrupts 6 of 2,432 fields on one
366
+ customer template without affecting counts. The JSON export carries identical data with plain hex
367
+ ids already, so the whole decode-bug class is structurally impossible on this path rather
368
+ than reimplemented. Verified against the real 18-template customer JSON dump set, including the 6
369
+ previously-corrupted `ActionsList` ids on "Yard 5S Site Standard"
370
+ (a contiguous run of `ActionsList` ids), which load and validate correctly.
371
+
372
+ ### Changed
373
+
374
+ - **`ecoportal-api-v2` floor raised to `>= 3.3.5`** (was `>= 3.3.3`). 3.3.5 carries the fix for
375
+ `ClassHelpers#to_time`, whose rescue clause named a constant that does not exist
376
+ (`ArgumentArgument`), so its documented `exception: false` mode raised
377
+ `NameError: uninitialized constant ...ClassHelpers::ArgumentArgument` instead of returning nil.
378
+ This gem inherits that helper through DoubleModel, so any null or object-shaped date reaching a
379
+ `passdate` field hit it. ★ Side benefit: the old floor pointed at **3.3.3, which was yanked**
380
+ for shipping internal repository content to rubygems — a floor should not name a yanked version.
381
+
382
+ ### Fixed
383
+
384
+ - `FieldConfig::CrossReference` could not set `enableCrossRegisterReporting` (Boolean) — the schema
385
+ accepts the key but no builder path could reach it. Closes the last MISSING-key advisory reported
386
+ by `tests/validate_commands.rb` for the `crossReference` byType key.
387
+
388
+ - Stripped UTF-8 BOMs from 58 `lib/` source files (present since early development; harmless
389
+ to Ruby but flagged by the release smoke gate, and byte-noise for every downstream diff).
6
390
 
7
391
  ## [2.0.0] - 2026-08-13
8
392
 
@@ -10,8 +394,7 @@ Major release: everything accumulated on `main` since `v1.3.14` — the 2026-07-
10
394
  schema syncs, command-bus completion (105/105 commands), native file upload, and a long run of
11
395
  correctness fixes. **Breaking, but narrowly:** every removed or reshaped surface either targeted
12
396
  a mutation the live schema never had (so it could never have worked) or was a dead accessor with
13
- no consumer — a 2026-07-30 sweep of `eco-helpers`, `integration-training`, `multi_org_api` and
14
- `multi-org-idle` found no consumer of any breaking surface (re-confirmed 2026-08-12). The major
397
+ no consumer — a 2026-07-30 sweep of `eco-helpers` and three internal script repos found no consumer of any breaking surface (re-confirmed 2026-08-12). The major
15
398
  bump is deliberate: consumer repos declare `~> 1.3` (which allows 1.4.x), so a minor would have
16
399
  been adopted silently on the next `bundle update`; 2.0.0 makes adoption a per-repo decision.
17
400
 
@@ -25,7 +408,7 @@ Note: this release does not descend from `v1.3.15`, which shipped from the `rele
25
408
  branch forked at 1.3.14 — do not expect a linear tag history.
26
409
 
27
410
  ★ **The published gem is now `lib/` only.** `spec.files` excluded just `test|spec|features`, so
28
- every top-level directory added since shipped by default — 244 files of internal `.ai-assistance/`
411
+ every top-level directory added since shipped by default — 244 files of internal AI-tooling
29
412
  notes, `docs/` (including the rolling worklog), and `.claude/`. `spec.files` is now an allowlist
30
413
  (`lib/`, `exe/`, README, LICENSE, CHANGELOG), which also drops the package from 959 KB to 195 KB.
31
414
  All 568 `lib/` files are unchanged; nothing outside `lib/` was ever loaded at runtime.
@@ -68,7 +451,7 @@ All 568 `lib/` files are unchanged; nothing outside `lib/` was ever loaded at ru
68
451
  but only one may be published (`active: true`) per organization at a time — publishing another
69
452
  with the same uid unpublishes the incumbent. Previously the value was fetchable from the API but
70
453
  unreachable through the gem (the embed was commented out and no fragment selected it).
71
- Semantics documented in `.ai-assistance/code/ecoPortal_architecture/02_data_model.md`.
454
+ Semantics documented in the repo's internal docs.
72
455
  - **`editTemplateContainerUid` workflow command** — `Input::WorkflowCommand::EditTemplateContainerUid`,
73
456
  registered on the command bus. Unlike its `editTemplate*` siblings it raises on a nil value rather
74
457
  than emitting an empty command (the schema argument is `String!`) and validates the backend's
@@ -96,7 +479,7 @@ All 568 `lib/` files are unchanged; nothing outside `lib/` was ever loaded at ru
96
479
  diff (adds/removes/changes/reorders, bookkeeping noise hidden by default, nil≡empty-container
97
480
  lenience for document-age drift). Detects a foreign id-space and points at
98
481
  `Diff::CrossObjectDiff` instead of emitting a misleading add/remove-everything report.
99
- - Scoping project `.ai-assistance/projects/data-toolset/` — coordination of the data
482
+ - Scoping project the repo's internal docs — coordination of the data
100
483
  import/extract/migration tool-set (legacy imports, template and register metadata table
101
484
  definitions, BI warehouse extracts, spreadsheet and back-end imports, register-to-register and
102
485
  org-to-org migrations, register-revamp mapping and readiness reporting). Capability map C1-C8,
@@ -163,7 +546,7 @@ The web "System Access Logs" page and page "history changelog" are driven by
163
546
 
164
547
  - `ecoportal-api` dependency floor raised to `0.10.17`: inherits the `WithRetry` fix that
165
548
  makes `HTTP::TimeoutError` (connect/read/write timeouts) retryable — previously a single
166
- transient timeout killed whole batch loops (live-confirmed on Farmers, 2026-07-30).
549
+ transient timeout killed whole batch loops (live-confirmed on a customer org, 2026-07-30).
167
550
  - **`graphlient` dependency now points at the published `0.9.0` release** instead of the fork's
168
551
  frozen git branch (`rellampec/graphlient@pre-v0.0.9`). `0.9.0` ships the same DSL/directive
169
552
  work the gem already relied on (`#115` `to_query_string`/`spread`, `#116` directives DSL,
@@ -286,7 +669,7 @@ The web "System Access Logs" page and page "history changelog" are driven by
286
669
  `people{id}` nodes on both sides), not the raw `peopleIds` key — the backend can return
287
670
  `peopleIds: null` on reads while still populating `people`/`cachedPeople`, so restating an
288
671
  already-attached person id no longer registers as a change. Live-confirmed 2026-07-16
289
- (act-gov TOOCS dry-run reported "Updated 6/6" for a no-op). Mirrors the `CrossReference`
672
+ (a customer dry-run reported "Updated 6/6" for a no-op). Mirrors the `CrossReference`
290
673
  fix for the identical disease; `as_input` now serialises the fallback-aware `people_ids`
291
674
  reader instead of the raw doc key.
292
675
  - `ContractorEntities` field: the reader read the staged write key (`contractors`), which read
@@ -358,7 +741,7 @@ The web "System Access Logs" page and page "history changelog" are driven by
358
741
  **Migrate to:** `editTemplateBasicSettings` (name/icon/settings/counter/tags/folders/creator
359
742
  perms), `editTemplateDescriptions` (`description`), `editTemplateCreatorPermissions` (creator
360
743
  perms). The old `editPage` `addOtherTags`/`removeOtherTags` keys have no `editTemplate*`
361
- equivalent (dropped from schema). No downstream callers existed (eco-helpers / multi_org_api /
744
+ equivalent (dropped from schema). No downstream callers existed (eco-helpers / internal script repos /
362
745
  gem swept) so the removal is clean. See DECISIONS.md in the workflow-space project.
363
746
  - **`Mutation::SmartFill::Generate` / `Mutation::SmartFill::SubmitFeedback` and
364
747
  `Builder::Page#generate_smart_fill` / `#submit_smart_fill_feedback`** (breaking, but dead
@@ -380,13 +763,13 @@ The web "System Access Logs" page and page "history changelog" are driven by
380
763
  to measure coverage — only the QUESTION carries one; its satellites (comment, image, document,
381
764
  recommended action) do not and are not expected to. The denominator is workbook questions
382
765
  (`question_ref`), never the field count; measuring against all fields yields a meaningless ~16%.
383
- - `.ai-assistance/projects/mns-template-lifecycle/WORKBOOK-FIELD-MAPPING.md` — the authoritative
766
+ - the repo's internal docs — the authoritative
384
767
  workbook-to-template contract recovered verbatim from the 2026-08-08 session transcript:
385
768
  `QuestionSetReference` → template_container_id (UI "UNIQUE IDENTIFIER"), `QuestionReference` →
386
769
  field `description` (CONFIRMED), `QuestionInformation` → field tooltip (strip HTML entities),
387
770
  scores ignored, section-vs-stage left ambiguous, plus the template-pairing procedure and the
388
771
  DEV-site targeting note.
389
- - `.ai-assistance/conventions/recovering-prior-context.md` — past sessions are greppable JSONL
772
+ - the repo's internal docs — past sessions are greppable JSONL
390
773
  transcripts on disk (35 sessions, 85 MB); search them before asking the developer something he may
391
774
  already have answered.
392
775
 
@@ -514,7 +897,7 @@ signed-off future decision.)
514
897
  (`external_id`/`id`/`state`) — a spurious path produced term `membranes.external_id.external_id`
515
898
  → 0 results (silent miss → dup-on-upsert). Register FIELD keys still get the nested path.
516
899
  - Verified against the backend filter definitions; catalogued in
517
- `.ai-assistance/code/filter_contract_matrix.md`.
900
+ the repo's internal docs.
518
901
 
519
902
  ### Added
520
903
 
@@ -586,7 +969,7 @@ shapes checked against the live schema dump); the live UAT→PROD round trip is
586
969
  longer exists (fragments are a registry now) → `uninitialized constant … Fragment::… (NameError)` at
587
970
  render time. Now `spread :Action` / `spread :ContractorEntity`, matching the already-migrated queries.
588
971
  (The sibling breakage in eco-helpers' location-command optimizations is fixed in eco-helpers 3.2.17;
589
- it crashed the live act-gov locations sync.)
972
+ it crashed a customer's live locations sync.)
590
973
  - **Kickstand workflow mutations — bare `DateTime` selection.** `Kickstand::{Start,Stop,Fail}Workflow`
591
974
  selected `startedAt`/`stoppedAt`/`failedAt` bare → "Field must have selections". Now
592
975
  `{ dateTime timeZone }` (same class as the 1.3.10 LocationStructure fix).
@@ -614,7 +997,7 @@ shapes checked against the live schema dump); the live UAT→PROD round trip is
614
997
 
615
998
  ## [1.3.10] - 2026-07-03
616
999
 
617
- Hotfix (backwards-compatible). Resolves a live failure on the Turners & Growers users sync.
1000
+ Hotfix (backwards-compatible). Resolves a live failure on a customer's users sync.
618
1001
 
619
1002
  ### Fixed
620
1003
 
data/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2022 ecoPortal
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2022 ecoPortal
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,24 +1,24 @@
1
- # Ecoportal::API::GraphQL
2
-
3
- This is a basic collection of helpers that can be used to interact with the
4
- [ecoPortal](https://www.ecoportal.com) `GraphQL` API
5
-
6
- ## Installation
7
-
8
- Add this line to your application's Gemfile:
9
-
10
- ```ruby
11
- gem 'ecoportal-api-graphql', require: %w[ecoportal/api-graphql]
12
- ```
13
-
14
- And then execute:
15
-
16
- $ bundle
17
-
18
- Or install it yourself as:
19
-
20
- $ gem install ecoportal-api-graphql
21
-
22
- ## Changelog
23
-
24
- See {file:CHANGELOG.md} for a list of changes.
1
+ # Ecoportal::API::GraphQL
2
+
3
+ This is a basic collection of helpers that can be used to interact with the
4
+ [ecoPortal](https://www.ecoportal.com) `GraphQL` API
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'ecoportal-api-graphql', require: %w[ecoportal/api-graphql]
12
+ ```
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install ecoportal-api-graphql
21
+
22
+ ## Changelog
23
+
24
+ See {file:CHANGELOG.md} for a list of changes.