ecoportal-api-graphql 1.3.17 → 2.0.0

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 (466) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +384 -15
  3. data/LICENSE +21 -21
  4. data/README.md +24 -24
  5. data/lib/ecoportal/api/common/graphql/CLAUDE.md +36 -0
  6. data/lib/ecoportal/api/common/graphql/auth_service.rb +115 -115
  7. data/lib/ecoportal/api/common/graphql/class_helpers.rb +46 -46
  8. data/lib/ecoportal/api/common/graphql/client.rb +69 -69
  9. data/lib/ecoportal/api/common/graphql/hash_helpers.rb +105 -105
  10. data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +28 -0
  11. data/lib/ecoportal/api/common/graphql/model/as_input.rb +54 -54
  12. data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +49 -49
  13. data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +188 -188
  14. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff.rb +55 -55
  15. data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +295 -295
  16. data/lib/ecoportal/api/common/graphql/model/diffable/leaf_diff_service.rb +97 -0
  17. data/lib/ecoportal/api/common/graphql/model/diffable.rb +1 -0
  18. data/lib/ecoportal/api/common/graphql/model.rb +17 -17
  19. data/lib/ecoportal/api/common/graphql/patches.rb +1 -1
  20. data/lib/ecoportal/api/common/graphql/query_integration.rb +45 -45
  21. data/lib/ecoportal/api/common/graphql.rb +16 -16
  22. data/lib/ecoportal/api/common.graphql.rb +8 -8
  23. data/lib/ecoportal/api/graphql/CLAUDE.md +37 -0
  24. data/lib/ecoportal/api/graphql/base/CLAUDE.md +50 -0
  25. data/lib/ecoportal/api/graphql/base/action.rb +1 -1
  26. data/lib/ecoportal/api/graphql/base/action_category.rb +15 -15
  27. data/lib/ecoportal/api/graphql/base/action_event.rb +23 -0
  28. data/lib/ecoportal/api/graphql/base/action_event_page.rb +16 -0
  29. data/lib/ecoportal/api/graphql/base/activity.rb +38 -0
  30. data/lib/ecoportal/api/graphql/base/activity_log.rb +38 -0
  31. data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +13 -8
  32. data/lib/ecoportal/api/graphql/base/auth_log.rb +24 -0
  33. data/lib/ecoportal/api/graphql/base/authorization_result.rb +20 -0
  34. data/lib/ecoportal/api/graphql/base/contractor_entity/member_changes.rb +17 -5
  35. data/lib/ecoportal/api/graphql/base/contractor_entity.rb +24 -24
  36. data/lib/ecoportal/api/graphql/base/date_time.rb +12 -12
  37. data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -16
  38. data/lib/ecoportal/api/graphql/base/field.rb +12 -12
  39. data/lib/ecoportal/api/graphql/base/file_attachment.rb +15 -15
  40. data/lib/ecoportal/api/graphql/base/file_container.rb +12 -4
  41. data/lib/ecoportal/api/graphql/base/location_classification_type.rb +2 -0
  42. data/lib/ecoportal/api/graphql/base/location_node.rb +14 -14
  43. data/lib/ecoportal/api/graphql/base/location_structure/draft/structure.rb +37 -37
  44. data/lib/ecoportal/api/graphql/base/location_structure/draft.rb +93 -93
  45. data/lib/ecoportal/api/graphql/base/location_structure.rb +3 -0
  46. data/lib/ecoportal/api/graphql/base/minimal_dashboard.rb +25 -0
  47. data/lib/ecoportal/api/graphql/base/organization.rb +2 -0
  48. data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -9
  49. data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -18
  50. data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -29
  51. data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +1 -1
  52. data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +25 -2
  53. data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +1 -1
  54. data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -23
  55. data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +46 -7
  56. data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -24
  57. data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +6 -3
  58. data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -8
  59. data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -9
  60. data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +50 -12
  61. data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -17
  62. data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -26
  63. data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -9
  64. data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -17
  65. data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -9
  66. data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -21
  67. data/lib/ecoportal/api/graphql/base/page/data_field.rb +12 -18
  68. data/lib/ecoportal/api/graphql/base/page/phased.rb +15 -15
  69. data/lib/ecoportal/api/graphql/base/page/section.rb +48 -48
  70. data/lib/ecoportal/api/graphql/base/page_info.rb +12 -12
  71. data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -39
  72. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -27
  73. data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -30
  74. data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -34
  75. data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -35
  76. data/lib/ecoportal/api/graphql/base/permissions.rb +15 -0
  77. data/lib/ecoportal/api/graphql/base/person_member.rb +22 -22
  78. data/lib/ecoportal/api/graphql/base/person_member_changelog.rb +23 -0
  79. data/lib/ecoportal/api/graphql/base/preset_view.rb +135 -0
  80. data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -23
  81. data/lib/ecoportal/api/graphql/base/register.rb +6 -1
  82. data/lib/ecoportal/api/graphql/base/resource.rb +13 -13
  83. data/lib/ecoportal/api/graphql/base.rb +9 -0
  84. data/lib/ecoportal/api/graphql/builder/CLAUDE.md +65 -0
  85. data/lib/ecoportal/api/graphql/builder/action.rb +41 -41
  86. data/lib/ecoportal/api/graphql/builder/contractor_entity.rb +10 -0
  87. data/lib/ecoportal/api/graphql/builder/location_structure/draft.rb +64 -64
  88. data/lib/ecoportal/api/graphql/builder/location_structure.rb +40 -40
  89. data/lib/ecoportal/api/graphql/builder/page.rb +0 -16
  90. data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -84
  91. data/lib/ecoportal/api/graphql/builder/register.rb +49 -49
  92. data/lib/ecoportal/api/graphql/builder/template.rb +18 -0
  93. data/lib/ecoportal/api/graphql/compat/filter_translator.rb +1 -1
  94. data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -23
  95. data/lib/ecoportal/api/graphql/compat/pages.rb +7 -2
  96. data/lib/ecoportal/api/graphql/compat/registers.rb +84 -84
  97. data/lib/ecoportal/api/graphql/compat/response.rb +14 -0
  98. data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -33
  99. data/lib/ecoportal/api/graphql/compat.rb +17 -17
  100. data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -71
  101. data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +68 -68
  102. data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -60
  103. data/lib/ecoportal/api/graphql/concerns/threadable.rb +58 -0
  104. data/lib/ecoportal/api/graphql/concerns.rb +1 -0
  105. data/lib/ecoportal/api/graphql/connection/action.rb +1 -1
  106. data/lib/ecoportal/api/graphql/connection/action_category.rb +1 -1
  107. data/lib/ecoportal/api/graphql/connection/activity.rb +11 -0
  108. data/lib/ecoportal/api/graphql/connection/activity_log.rb +11 -0
  109. data/lib/ecoportal/api/graphql/connection/auth_log.rb +11 -0
  110. data/lib/ecoportal/api/graphql/connection/contractor_entity.rb +1 -1
  111. data/lib/ecoportal/api/graphql/connection/minimal_dashboard.rb +11 -0
  112. data/lib/ecoportal/api/graphql/connection/page.rb +1 -1
  113. data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +1 -1
  114. data/lib/ecoportal/api/graphql/connection/person_member.rb +1 -1
  115. data/lib/ecoportal/api/graphql/connection/person_member_changelog.rb +11 -0
  116. data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -11
  117. data/lib/ecoportal/api/graphql/connection/preview_page.rb +1 -1
  118. data/lib/ecoportal/api/graphql/connection.rb +5 -0
  119. data/lib/ecoportal/api/graphql/diff/pairing/signals.rb +21 -1
  120. data/lib/ecoportal/api/graphql/error/locations_error/fetch_nested.rb +51 -51
  121. data/lib/ecoportal/api/graphql/error/locations_error.rb +28 -28
  122. data/lib/ecoportal/api/graphql/error/locations_validation_error.rb +20 -20
  123. data/lib/ecoportal/api/graphql/error/validation_errors.rb +28 -28
  124. data/lib/ecoportal/api/graphql/error.rb +12 -12
  125. data/lib/ecoportal/api/graphql/file_upload/client.rb +198 -139
  126. data/lib/ecoportal/api/graphql/file_upload.rb +10 -10
  127. data/lib/ecoportal/api/graphql/fragment/action.rb +65 -65
  128. data/lib/ecoportal/api/graphql/fragment/action_category.rb +17 -17
  129. data/lib/ecoportal/api/graphql/fragment/activity.rb +84 -0
  130. data/lib/ecoportal/api/graphql/fragment/activity_log.rb +75 -0
  131. data/lib/ecoportal/api/graphql/fragment/auth_log.rb +29 -0
  132. data/lib/ecoportal/api/graphql/fragment/authorization_result.rb +14 -0
  133. data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +20 -20
  134. data/lib/ecoportal/api/graphql/fragment/location_node.rb +1 -0
  135. data/lib/ecoportal/api/graphql/fragment/locations_error.rb +19 -19
  136. data/lib/ecoportal/api/graphql/fragment/minimal_dashboard.rb +31 -0
  137. data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +21 -0
  138. data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -15
  139. data/lib/ecoportal/api/graphql/fragment/pagination.rb +17 -17
  140. data/lib/ecoportal/api/graphql/fragment/permissions.rb +98 -0
  141. data/lib/ecoportal/api/graphql/fragment/person_member_changelog.rb +33 -0
  142. data/lib/ecoportal/api/graphql/fragment.rb +7 -0
  143. data/lib/ecoportal/api/graphql/helpers/locations_tree.rb +41 -41
  144. data/lib/ecoportal/api/graphql/helpers.rb +10 -10
  145. data/lib/ecoportal/api/graphql/input/action/archive.rb +14 -14
  146. data/lib/ecoportal/api/graphql/input/action/create.rb +13 -13
  147. data/lib/ecoportal/api/graphql/input/action/update.rb +12 -0
  148. data/lib/ecoportal/api/graphql/input/action.rb +14 -14
  149. data/lib/ecoportal/api/graphql/input/contractor_entity/create.rb +14 -14
  150. data/lib/ecoportal/api/graphql/input/contractor_entity/destroy.rb +13 -13
  151. data/lib/ecoportal/api/graphql/input/contractor_entity/manager_settings.rb +20 -0
  152. data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +6 -27
  153. data/lib/ecoportal/api/graphql/input/contractor_entity.rb +1 -0
  154. data/lib/ecoportal/api/graphql/input/date_range.rb +16 -0
  155. data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -16
  156. data/lib/ecoportal/api/graphql/input/id_diff.rb +11 -11
  157. data/lib/ecoportal/api/graphql/input/location_structure/apply_commands.rb +2 -2
  158. data/lib/ecoportal/api/graphql/input/location_structure/archive_command.rb +13 -13
  159. data/lib/ecoportal/api/graphql/input/location_structure/delete_command.rb +13 -13
  160. data/lib/ecoportal/api/graphql/input/location_structure/draft/add_commands.rb +2 -2
  161. data/lib/ecoportal/api/graphql/input/location_structure/draft/create.rb +15 -15
  162. data/lib/ecoportal/api/graphql/input/location_structure/draft/delete.rb +15 -15
  163. data/lib/ecoportal/api/graphql/input/location_structure/draft/drop_bad_commands.rb +16 -16
  164. data/lib/ecoportal/api/graphql/input/location_structure/draft/publish.rb +16 -16
  165. data/lib/ecoportal/api/graphql/input/location_structure/draft.rb +19 -19
  166. data/lib/ecoportal/api/graphql/input/location_structure/insert_command.rb +13 -13
  167. data/lib/ecoportal/api/graphql/input/location_structure/move_command.rb +14 -14
  168. data/lib/ecoportal/api/graphql/input/location_structure/reorder_command.rb +13 -13
  169. data/lib/ecoportal/api/graphql/input/location_structure/unarchive_command.rb +13 -13
  170. data/lib/ecoportal/api/graphql/input/location_structure/update_command.rb +6 -2
  171. data/lib/ecoportal/api/graphql/input/location_structure.rb +20 -20
  172. data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -14
  173. data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -13
  174. data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -13
  175. data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -18
  176. data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -13
  177. data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -13
  178. data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -14
  179. data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -14
  180. data/lib/ecoportal/api/graphql/input/page/update.rb +2 -2
  181. data/lib/ecoportal/api/graphql/input/page.rb +26 -26
  182. data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -18
  183. data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -16
  184. data/lib/ecoportal/api/graphql/input/preset_view/update.rb +17 -2
  185. data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -14
  186. data/lib/ecoportal/api/graphql/input/register/create.rb +18 -18
  187. data/lib/ecoportal/api/graphql/input/register/update.rb +15 -15
  188. data/lib/ecoportal/api/graphql/input/register.rb +13 -13
  189. data/lib/ecoportal/api/graphql/input/search.rb +13 -13
  190. data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -234
  191. data/lib/ecoportal/api/graphql/input/search_conf.rb +1 -1
  192. data/lib/ecoportal/api/graphql/input/search_filter.rb +12 -12
  193. data/lib/ecoportal/api/graphql/input/search_sorter.rb +11 -11
  194. data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -18
  195. data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -18
  196. data/lib/ecoportal/api/graphql/input/workflow_command/add_checklist_field_item.rb +19 -0
  197. data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -18
  198. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -18
  199. data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -18
  200. data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -18
  201. data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -18
  202. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -23
  203. data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -18
  204. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -18
  205. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -18
  206. data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -18
  207. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -18
  208. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -18
  209. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -18
  210. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -18
  211. data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -18
  212. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -23
  213. data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -18
  214. data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -18
  215. data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -19
  216. data/lib/ecoportal/api/graphql/input/workflow_command/add_smart_fill_config.rb +23 -0
  217. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +3 -2
  218. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -18
  219. data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -18
  220. data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -18
  221. data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -18
  222. data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -18
  223. data/lib/ecoportal/api/graphql/input/workflow_command/add_viewable_field.rb +45 -0
  224. data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -18
  225. data/lib/ecoportal/api/graphql/input/workflow_command/archive_public_config.rb +19 -0
  226. data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -18
  227. data/lib/ecoportal/api/graphql/input/workflow_command/create_public_config.rb +19 -0
  228. data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -18
  229. data/lib/ecoportal/api/graphql/input/workflow_command/edit_checklist_field_item.rb +19 -0
  230. data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -18
  231. data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -18
  232. data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +12 -2
  233. data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -18
  234. data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -19
  235. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -19
  236. data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -18
  237. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -18
  238. data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -18
  239. data/lib/ecoportal/api/graphql/input/workflow_command/edit_public_config.rb +19 -0
  240. data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -18
  241. data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -18
  242. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -18
  243. data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -18
  244. data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -22
  245. data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -18
  246. data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -19
  247. data/lib/ecoportal/api/graphql/input/workflow_command/edit_smart_fill_config.rb +21 -0
  248. data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -18
  249. data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -18
  250. data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -18
  251. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_advanced_settings.rb +19 -0
  252. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_basic_settings.rb +27 -0
  253. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_container_uid.rb +45 -0
  254. data/lib/ecoportal/api/graphql/input/workflow_command/{edit_page_creator_permissions.rb → edit_template_creator_permissions.rb} +3 -2
  255. data/lib/ecoportal/api/graphql/input/workflow_command/edit_template_descriptions.rb +19 -0
  256. data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -18
  257. data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -18
  258. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/action_list.rb +31 -0
  259. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -24
  260. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +3 -1
  261. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +15 -2
  262. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/file.rb +21 -0
  263. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -20
  264. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +3 -2
  265. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -24
  266. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +27 -3
  267. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +3 -2
  268. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +3 -2
  269. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +3 -2
  270. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -20
  271. data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -25
  272. data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +3 -2
  273. data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -18
  274. data/lib/ecoportal/api/graphql/input/workflow_command/move_viewable_field.rb +33 -0
  275. data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -18
  276. data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -18
  277. data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -18
  278. data/lib/ecoportal/api/graphql/input/workflow_command/remove_checklist_field_item.rb +19 -0
  279. data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -18
  280. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -18
  281. data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -18
  282. data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -18
  283. data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -18
  284. data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -18
  285. data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -18
  286. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -18
  287. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -18
  288. data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -18
  289. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -18
  290. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -18
  291. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -18
  292. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -18
  293. data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -18
  294. data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -18
  295. data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -18
  296. data/lib/ecoportal/api/graphql/input/workflow_command/remove_smart_fill_config.rb +19 -0
  297. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -18
  298. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -18
  299. data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -18
  300. data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -18
  301. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -18
  302. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -18
  303. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -18
  304. data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -18
  305. data/lib/ecoportal/api/graphql/input/workflow_command/remove_viewable_field.rb +21 -0
  306. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +3 -2
  307. data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +3 -2
  308. data/lib/ecoportal/api/graphql/input/workflow_command.rb +43 -5
  309. data/lib/ecoportal/api/graphql/input.rb +1 -0
  310. data/lib/ecoportal/api/graphql/interface/base_page.rb +36 -3
  311. data/lib/ecoportal/api/graphql/interface/location_structure/command.rb +2 -1
  312. data/lib/ecoportal/api/graphql/interface/location_structure/node.rb +43 -43
  313. data/lib/ecoportal/api/graphql/interface/location_structure.rb +14 -14
  314. data/lib/ecoportal/api/graphql/interface.rb +11 -11
  315. data/lib/ecoportal/api/graphql/logic/base_model.rb +15 -15
  316. data/lib/ecoportal/api/graphql/logic/base_query.rb +193 -193
  317. data/lib/ecoportal/api/graphql/logic/connection.rb +17 -0
  318. data/lib/ecoportal/api/graphql/logic/input.rb +127 -0
  319. data/lib/ecoportal/api/graphql/logic/mutation.rb +59 -59
  320. data/lib/ecoportal/api/graphql/logic/payload.rb +42 -42
  321. data/lib/ecoportal/api/graphql/logic/query.rb +23 -23
  322. data/lib/ecoportal/api/graphql/logic/query_array.rb +30 -30
  323. data/lib/ecoportal/api/graphql/logic/query_connection.rb +48 -48
  324. data/lib/ecoportal/api/graphql/logic.rb +18 -18
  325. data/lib/ecoportal/api/graphql/model/account.rb +15 -15
  326. data/lib/ecoportal/api/graphql/model/action.rb +22 -22
  327. data/lib/ecoportal/api/graphql/model/action_event.rb +14 -0
  328. data/lib/ecoportal/api/graphql/model/action_event_page.rb +10 -0
  329. data/lib/ecoportal/api/graphql/model/activity.rb +14 -0
  330. data/lib/ecoportal/api/graphql/model/activity_log.rb +31 -0
  331. data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -10
  332. data/lib/ecoportal/api/graphql/model/auth_log.rb +11 -0
  333. data/lib/ecoportal/api/graphql/model/authorization_result.rb +12 -0
  334. data/lib/ecoportal/api/graphql/model/contractor_entity.rb +12 -12
  335. data/lib/ecoportal/api/graphql/model/field.rb +10 -10
  336. data/lib/ecoportal/api/graphql/model/file_attachment.rb +10 -10
  337. data/lib/ecoportal/api/graphql/model/file_container.rb +11 -11
  338. data/lib/ecoportal/api/graphql/model/location_node.rb +14 -14
  339. data/lib/ecoportal/api/graphql/model/location_structure/draft/structure.rb +15 -15
  340. data/lib/ecoportal/api/graphql/model/location_structure/draft.rb +15 -15
  341. data/lib/ecoportal/api/graphql/model/location_structure.rb +16 -16
  342. data/lib/ecoportal/api/graphql/model/minimal_dashboard.rb +14 -0
  343. data/lib/ecoportal/api/graphql/model/organization.rb +27 -0
  344. data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -14
  345. data/lib/ecoportal/api/graphql/model/page/data_field.rb +12 -12
  346. data/lib/ecoportal/api/graphql/model/page/phased/stage.rb +14 -14
  347. data/lib/ecoportal/api/graphql/model/page/section.rb +12 -12
  348. data/lib/ecoportal/api/graphql/model/page_union.rb +21 -21
  349. data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -20
  350. data/lib/ecoportal/api/graphql/model/permissions.rb +179 -0
  351. data/lib/ecoportal/api/graphql/model/person_member.rb +7 -0
  352. data/lib/ecoportal/api/graphql/model/person_member_changelog.rb +15 -0
  353. data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -10
  354. data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -10
  355. data/lib/ecoportal/api/graphql/model/register.rb +10 -10
  356. data/lib/ecoportal/api/graphql/model/resource.rb +13 -13
  357. data/lib/ecoportal/api/graphql/model/user.rb +14 -14
  358. data/lib/ecoportal/api/graphql/model.rb +9 -0
  359. data/lib/ecoportal/api/graphql/mutation/action/archive.rb +41 -41
  360. data/lib/ecoportal/api/graphql/mutation/action/create.rb +40 -40
  361. data/lib/ecoportal/api/graphql/mutation/action/update.rb +40 -40
  362. data/lib/ecoportal/api/graphql/mutation/action.rb +14 -14
  363. data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +21 -11
  364. data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +26 -11
  365. data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -13
  366. data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +40 -40
  367. data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +40 -40
  368. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +40 -40
  369. data/lib/ecoportal/api/graphql/mutation/contractor_entity/update_manager_settings.rb +37 -0
  370. data/lib/ecoportal/api/graphql/mutation/contractor_entity.rb +1 -0
  371. data/lib/ecoportal/api/graphql/mutation/file_container/upload.rb +78 -0
  372. data/lib/ecoportal/api/graphql/mutation/file_container.rb +15 -0
  373. data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +54 -54
  374. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +55 -55
  375. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +54 -54
  376. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/delete.rb +43 -43
  377. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +56 -56
  378. data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +66 -66
  379. data/lib/ecoportal/api/graphql/mutation/location_structure/draft.rb +18 -18
  380. data/lib/ecoportal/api/graphql/mutation/location_structure.rb +13 -13
  381. data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +1 -1
  382. data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -40
  383. data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +1 -1
  384. data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -50
  385. data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +1 -1
  386. data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -43
  387. data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +1 -1
  388. data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +1 -1
  389. data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +1 -1
  390. data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +1 -1
  391. data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -40
  392. data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +1 -1
  393. data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -40
  394. data/lib/ecoportal/api/graphql/mutation/page.rb +28 -28
  395. data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -35
  396. data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +1 -1
  397. data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -37
  398. data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -35
  399. data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -15
  400. data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -35
  401. data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +1 -1
  402. data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -35
  403. data/lib/ecoportal/api/graphql/mutation/register.rb +14 -14
  404. data/lib/ecoportal/api/graphql/mutation/template/update_related_page.rb +79 -0
  405. data/lib/ecoportal/api/graphql/mutation/template.rb +1 -0
  406. data/lib/ecoportal/api/graphql/mutation.rb +1 -1
  407. data/lib/ecoportal/api/graphql/payload/action/archive.rb +13 -13
  408. data/lib/ecoportal/api/graphql/payload/action/create.rb +13 -13
  409. data/lib/ecoportal/api/graphql/payload/action/update.rb +13 -13
  410. data/lib/ecoportal/api/graphql/payload/action.rb +14 -14
  411. data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -12
  412. data/lib/ecoportal/api/graphql/payload/contractor_entity/create.rb +13 -13
  413. data/lib/ecoportal/api/graphql/payload/contractor_entity/destroy.rb +12 -12
  414. data/lib/ecoportal/api/graphql/payload/contractor_entity/manager_settings.rb +20 -0
  415. data/lib/ecoportal/api/graphql/payload/contractor_entity/update.rb +12 -12
  416. data/lib/ecoportal/api/graphql/payload/contractor_entity.rb +1 -0
  417. data/lib/ecoportal/api/graphql/payload/location_structure/apply_commands.rb +51 -51
  418. data/lib/ecoportal/api/graphql/payload/location_structure/command_execution_result.rb +50 -50
  419. data/lib/ecoportal/api/graphql/payload/location_structure/draft/add_commands.rb +30 -30
  420. data/lib/ecoportal/api/graphql/payload/location_structure/draft/delete.rb +30 -30
  421. data/lib/ecoportal/api/graphql/payload/location_structure/draft/drop_bad_commands.rb +43 -43
  422. data/lib/ecoportal/api/graphql/payload/location_structure/draft/publish.rb +63 -63
  423. data/lib/ecoportal/api/graphql/payload/location_structure/draft.rb +18 -18
  424. data/lib/ecoportal/api/graphql/payload/location_structure.rb +14 -14
  425. data/lib/ecoportal/api/graphql/payload/ok_payload.rb +1 -1
  426. data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -13
  427. data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -13
  428. data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -13
  429. data/lib/ecoportal/api/graphql/payload/page/draft.rb +1 -1
  430. data/lib/ecoportal/api/graphql/payload/page/review_task.rb +1 -1
  431. data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -13
  432. data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -13
  433. data/lib/ecoportal/api/graphql/payload/preset_view.rb +1 -1
  434. data/lib/ecoportal/api/graphql/payload/register.rb +1 -1
  435. data/lib/ecoportal/api/graphql/payload/template/update_related_page.rb +15 -0
  436. data/lib/ecoportal/api/graphql/payload/template.rb +1 -0
  437. data/lib/ecoportal/api/graphql/payload/upload.rb +12 -0
  438. data/lib/ecoportal/api/graphql/payload.rb +1 -0
  439. data/lib/ecoportal/api/graphql/query/action.rb +33 -33
  440. data/lib/ecoportal/api/graphql/query/action_categories.rb +53 -53
  441. data/lib/ecoportal/api/graphql/query/actions.rb +43 -43
  442. data/lib/ecoportal/api/graphql/query/activity_logs.rb +78 -0
  443. data/lib/ecoportal/api/graphql/query/auth_logs.rb +51 -0
  444. data/lib/ecoportal/api/graphql/query/contractor_entities.rb +53 -53
  445. data/lib/ecoportal/api/graphql/query/dashboard_search.rb +57 -0
  446. data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -76
  447. data/lib/ecoportal/api/graphql/query/location_classifications.rb +39 -39
  448. data/lib/ecoportal/api/graphql/query/location_structure.rb +2 -0
  449. data/lib/ecoportal/api/graphql/query/location_structures.rb +2 -0
  450. data/lib/ecoportal/api/graphql/query/page.rb +6 -1
  451. data/lib/ecoportal/api/graphql/query/page_activities.rb +56 -0
  452. data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -47
  453. data/lib/ecoportal/api/graphql/query/pages.rb +59 -59
  454. data/lib/ecoportal/api/graphql/query/permissions.rb +35 -0
  455. data/lib/ecoportal/api/graphql/query/person_member_changelogs.rb +53 -0
  456. data/lib/ecoportal/api/graphql/query/register_preset_views.rb +1 -1
  457. data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -83
  458. data/lib/ecoportal/api/graphql/query/templates.rb +53 -53
  459. data/lib/ecoportal/api/graphql/query.rb +6 -0
  460. data/lib/ecoportal/api/graphql_version.rb +1 -1
  461. data/lib/ecoportal/api-graphql.rb +10 -10
  462. metadata +78 -12
  463. data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +0 -28
  464. data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +0 -36
  465. data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +0 -40
  466. data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e8ab1262f84b1fada9c29cfcaa29ec70f38aa6e8d05762b3bb580ece22910eec
4
- data.tar.gz: 25240f9c150f55a10a55284e647b42c3d96426fedafdc2ac866ada347e3a1794
3
+ metadata.gz: e679d934d9305d1926abe7251617eea0e5333c04665672b25f5ad38afb67d9b3
4
+ data.tar.gz: 2b8047d56b9af371b71308bcabce23f8e4c4b67d014ce7a4095386fadb1f89f4
5
5
  SHA512:
6
- metadata.gz: 89e3340050db60aa9114b595b6d63f7e0d1bfc9aa3c36c273c14fb680ce78573318440a25c35c79b5d8413e668b275837d509572b3c93fceed965458056d6f43
7
- data.tar.gz: bd9641bd8aad69ee8e1db51cda0c59ee46225c913f0fa19ee1ed2834f6ebd58493eb26b77b0ca1170abef1d058ae613f0c4ebb0541adb0f677169def9eeb3a7f
6
+ metadata.gz: 6ec6f2792de809534943497a98a74ec012b061778d379bb9f8ac205805cd9a629386c3293ee00e647549564fed5edbbc80e73cf856340922548309b8e9c68435
7
+ data.tar.gz: 948f0064aa886e310fc24f78a3919cbccc3b192495c724d86d003e1ff03bd39d2d12b312e82c04ca6626779abd822f9f9914de44b651c4903ba51d275085f7e8
data/CHANGELOG.md CHANGED
@@ -2,24 +2,393 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [1.3.17] - 2026-09-30
5
+ ## [Unreleased]
6
+
7
+ ## [2.0.0] - 2026-08-13
8
+
9
+ Major release: everything accumulated on `main` since `v1.3.14` — the 2026-07-13/07-25/07-31
10
+ schema syncs, command-bus completion (105/105 commands), native file upload, and a long run of
11
+ correctness fixes. **Breaking, but narrowly:** every removed or reshaped surface either targeted
12
+ 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
15
+ bump is deliberate: consumer repos declare `~> 1.3` (which allows 1.4.x), so a minor would have
16
+ been adopted silently on the next `bundle update`; 2.0.0 makes adoption a per-repo decision.
17
+
18
+ ★ **What starts WORKING when you adopt this** (silently-broken → live, coming from ≤ 1.3.14):
19
+ the page-level `executeWorkflowCommands` bus, File-field attach writes, `updatePresetView`
20
+ column edits, AI-summary mutations, viewable-field management, Date-field renewals, and
21
+ eco-helpers' `OozeRedirect` force path (always errored before — re-verify on a sandbox org
22
+ before trusting it in a customer run). Review those paths before assuming a no-op upgrade.
23
+
24
+ Note: this release does not descend from `v1.3.15`, which shipped from the `release/1.3.15`
25
+ branch forked at 1.3.14 — do not expect a linear tag history.
26
+
27
+ ★ **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/`
29
+ notes, `docs/` (including the rolling worklog), and `.claude/`. `spec.files` is now an allowlist
30
+ (`lib/`, `exe/`, README, LICENSE, CHANGELOG), which also drops the package from 959 KB to 195 KB.
31
+ All 568 `lib/` files are unchanged; nothing outside `lib/` was ever loaded at runtime.
6
32
 
7
- ### Security
33
+ ### Added
34
+
35
+ - `WorkflowCommandInput` commands: `editTemplateBasicSettings`, `editTemplateAdvancedSettings`,
36
+ `editTemplateCreatorPermissions`, `editTemplateDescriptions`, `createPublicConfig`,
37
+ `editPublicConfig`, `archivePublicConfig`, `addChecklistFieldItem`, `editChecklistFieldItem`,
38
+ `removeChecklistFieldItem`, `addSmartFillConfig`, `editSmartFillConfig`, `removeSmartFillConfig`.
39
+ - `addStage` gained `tags` (create a stage already tagged).
40
+ - `editFieldConfiguration` gained `addActionIds`/`removeActionIds`; `crossReference` gained
41
+ `addReferenceIds`/`removeReferenceIds`; `imageGallery` gained `addImageSourceIds`/`removeImageIds`;
42
+ new `file` by-type field config (`addFileContainerIds`/`removeItemIds`).
43
+ - **The WorkflowCommandInput command bus is now at full coverage: 105/105 commands, 14/14 field-config
44
+ builders, zero dead keys, zero unreachable keys** — verified against the live `20260731` schema.
45
+ Granular template management no longer has holes.
46
+ - **`tests/validate_commands.rb`** — new offline gate, the command-bus sibling of
47
+ `validate_queries.rb`. That gate can only see the documents we *send*; every command travels as a
48
+ member of a `[WorkflowCommandInput!]` **variable**, so unwired commands and stale key allow-lists
49
+ were completely invisible to it. The new script reports unwired commands, dead keys (gem sends,
50
+ schema rejects), orphaned `COMMAND_MAP` entries, missing keys, and byType builder coverage.
51
+ Fails the build on the first three. Wire it into CI next to `validate-queries`.
52
+ - **`addViewableField` / `moveViewableField` / `removeViewableField` commands** — these replaced
53
+ `WorkflowEditFieldConfigurationPeopleInput.addViewableFields`/`removeViewableFields`, which the
54
+ 20260725 drift REMOVED. Between that drift and now, viewable-field management was impossible
55
+ through the gem: the old keys were dead and the new commands were unwired. The replacement also
56
+ adds ordering (`anchorId` + `anchorPosition`) the flat arrays could not express.
57
+ - **`Input::WorkflowCommand::EditFieldConfiguration::ActionList`** — the 14th and last unwired
58
+ `byType` member, so ActionsList field configuration is reachable at last.
59
+ - **`updateRelatedPage` mutation** + payload + `Builder::Template#update_related_page`. The worklog
60
+ carried this as an *ecoportal backend* gap ("the only genuine structural template omission") — that
61
+ was stale, the mutation is in the live schema, so the gap was ours. Related-pages entries could be
62
+ created and destroyed but never edited, forcing destroy+recreate for a title change, which
63
+ discards the entry id.
64
+ - **Cross-version template identity is now readable.** `CommonPageUnion` selects
65
+ `template { templateContainerUid active }`, and `Interface::BasePage` exposes `#template`
66
+ (a read-only `Model::Template::Information`) plus the `#templateContainerUid` shortcut.
67
+ `templateContainerUid` is the template **series** key: many versions may carry the same value,
68
+ but only one may be published (`active: true`) per organization at a time — publishing another
69
+ with the same uid unpublishes the incumbent. Previously the value was fetchable from the API but
70
+ 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`.
72
+ - **`editTemplateContainerUid` workflow command** — `Input::WorkflowCommand::EditTemplateContainerUid`,
73
+ registered on the command bus. Unlike its `editTemplate*` siblings it raises on a nil value rather
74
+ than emitting an empty command (the schema argument is `String!`) and validates the backend's
75
+ `3-20 chars, [a-zA-Z0-9-_.]` format up front.
76
+ - **DataField `description` is now readable.** Added to the `dataFieldInterface` fragment and
77
+ declared `read_only: true` on `Base::Page::DataField`. It is the hidden per-field note that
78
+ integrations reuse as a pseudo external-id on fields. Read-only is deliberate: `description`
79
+ exists on `DataFieldsInterface` but on no member of `DataFieldInput`, so a writable accessor would
80
+ dirty the field and push a key `updatePage` cannot accept — the only writer is the
81
+ `editFieldConfiguration` workflow command, which is confirmed to work on **page instances** as
82
+ well as templates.
83
+ - `tests/page_field_description_update.rb` — scripted read-modify-verify for a single dataField
84
+ `description` on a page instance, with a `--dry-run` mode and a `canRestructure`/`canConfigure`
85
+ pre-flight.
86
+ - **`Diff::Pairing::Signals.genome` now recognises lineage ancestry** (scores `0.9`, just below
87
+ an exact match) when one signature is a strict prefix of the other. Verified live 2026-08-05
88
+ on a same-org restore of a full template backup: a restore re-mints every Mongo id and
89
+ APPENDS one segment to every membrane AND force genome signature (28/28 + 4/4 followed the
90
+ rule, e.g. `ktnrya` → `ktnrya877l`) — equality-only scoring handed the exact cross-object
91
+ case the pairing engine exists for (UAT backup → PROD restore) a `0.0` mismatch. Signatures
92
+ shorter than 4 chars are rejected as ancestry evidence (chance-collision guard).
93
+ - **New manual tool `tests/template_backup_diff.rb`**: loads the platform's template BACKUP
94
+ files (YAML = Mongoid/BSON object dump — loaded via shims, no bson dependency; JSON = same
95
+ document, ids as hex/times as ISO8601), converts YAML→JSON, and produces an id-keyed deep
96
+ diff (adds/removes/changes/reorders, bookkeeping noise hidden by default, nil≡empty-container
97
+ lenience for document-age drift). Detects a foreign id-space and points at
98
+ `Diff::CrossObjectDiff` instead of emitting a misleading add/remove-everything report.
99
+ - Scoping project `.ai-assistance/projects/data-toolset/` — coordination of the data
100
+ import/extract/migration tool-set (legacy imports, template and register metadata table
101
+ definitions, BI warehouse extracts, spreadsheet and back-end imports, register-to-register and
102
+ org-to-org migrations, register-revamp mapping and readiness reporting). Capability map C1-C8,
103
+ verified inventory of existing tooling, the two shared primitives the set is missing (field
104
+ identity across template versions, and a versioned table projection), staged plan through to
105
+ promotion into its own repo, and the open blockers.
106
+
107
+ ### Added (read-model / type layer — additive, non-breaking)
108
+
109
+ - **System access logs:** `Base::AuthLog` / `Model::AuthLog` (+ `Connection::AuthLog`, `:AuthLog`
110
+ fragment) and `Model::Organization#authLogs` (`Query::AuthLogs`).
111
+ - **Changelog history:** `Base::PersonMemberChangelog` / `Model::PersonMemberChangelog`
112
+ (+ `Connection::PersonMemberChangelog`, `:PersonMemberChangelog` fragment),
113
+ `Model::Organization#personMemberChangelogs` (`Query::PersonMemberChangelogs`), and
114
+ `Model::PersonMember#changelogs`.
115
+ - **Dashboards:** `Base::MinimalDashboard` / `Model::MinimalDashboard`
116
+ (+ `Connection::MinimalDashboard`, `:MinimalDashboard` fragment) and
117
+ `Model::Organization#dashboardSearch` (`Query::DashboardSearch`).
118
+ - **Actions:** `Base::ActionEvent` / `Model::ActionEvent` and `Base::ActionEventPage` /
119
+ `Model::ActionEventPage`.
120
+ - **RS/location:** read-only `LocationStructure#generating`/`#aiPrompt`,
121
+ `LocationClassificationType#aiGenerated` (selected in the structure queries + `:LocationNode`
122
+ fragment).
123
+ - **Contractor:** `updateContractorManagerSettings` mutation
124
+ (`Mutation::ContractorEntity::UpdateManagerSettings` + `Input`/`Payload::…::ManagerSettings`,
125
+ exposed as `Builder::ContractorEntity#update_manager_settings`) and read-only
126
+ `Organization#allowContractorAdminsToAddAdmins`.
127
+ - **`Base::AuthorizationResult` / `Model::AuthorizationResult`** (+ `:AuthorizationResult` fragment) —
128
+ the reusable node type behind the schema's many `canXXX: AuthorizationResult` permission fields;
129
+ wired `Model::PersonMember#canManageContractorAdmins`. Unblocks the deferred `Permissions`-parented
130
+ `canXXX` fields (which still await a `Permissions` model).
131
+ - **`Base::Permissions` / `Model::Permissions`** (+ `:Permissions` fragment) — the org-level ability
132
+ set (`Organization.permissions`). Models all **83** `canXXX: AuthorizationResult!` fields as
133
+ `embeds_one` (e.g. `dashboardCanManage`, `locationStructuresCanAiGenerateStructure`,
134
+ `generatedPageFilterCanUseSmartQuery`). Wired `Model::Organization#permissions` (typed embed) plus a
135
+ native `Query::Permissions` (`currentOrganization.permissions`). The `:Permissions` fragment spreads
136
+ `:AuthorizationResult` per field (recursively assembled).
137
+
138
+ ### Added (polymorphic activity feeds — the REAL access-logs & page-history fields)
139
+
140
+ The web "System Access Logs" page and page "history changelog" are driven by
141
+ `currentOrganization.activityLogs` (a UNION) and `page.activities` (an INTERFACE) — NOT the flat
142
+ `authLogs`/`personMemberChangelogs` types. These add the polymorphic read models for the real fields.
143
+
144
+ - **System Access Logs:** `Base::ActivityLog` / `Model::ActivityLog` (+ nested `Model::ActivityLog::Resource`,
145
+ `Connection::ActivityLog`, `:ActivityLog` fragment) over the `ActivityLogUnion` (9 members:
146
+ DashboardAccess/Create/Delete/Update, DeniedDashboardAccess, DeniedPageAccess, FileDownload, PageAccess,
147
+ ScimIntegrationAccess). Models the fields common to all members + `__typename` passthrough; the Dashboard*
148
+ members' `parentResource*` + `resource { isVisible: AuthorizationResult }` are nullable embeds. The
149
+ fragment uses inline fragments per member (spreading `:ActivityLogCommon` on `BaseActivityLogInterface`
150
+ and `:ActivityLogResource` on `BaseDashboardActivityLogInterface`). Exposed as
151
+ `Model::Organization#activityLogs` (`Query::ActivityLogs`) with the full filter set
152
+ (`userIds`, `resourceIds`, `filterSuperusers`, `activityType`, `resourceType: ActivityLogTypesEnum`,
153
+ `source: SourceEnum`, `dateFilter: DateRange`, cursor pagination). New `Input::DateRange`.
154
+ - **Page history / activities:** `Base::Activity` / `Model::Activity` (+ `Connection::Activity`,
155
+ `:Activity` fragment) capturing the `ActivityInterface` common fields (id, `__typename`, priority,
156
+ system, fromPublicTemplate, stageId, categories/subkey, source/user scalars, createdAt/updatedAt,
157
+ personMember, user) across its ~61 concrete types — an unmodelled type still resolves as a plain
158
+ `Model::Activity`. Exposed as `Model::Organization#pageActivities` (`Query::PageActivities`) resolving
159
+ `page(id:).activities(searchConf:, …)`; because `page` returns a `PageUnion`, the connection is selected
160
+ via inline fragments on BasicPage/PhasedPage (`:PageActivities` + `:ActivityConnection` fragments).
8
161
 
9
- - Security republish of `1.3.16` -- backwards-compatible, no code change: removes customer and
10
- internal identifiers from shipped comments and this changelog; stops shipping internal
11
- files (packaging allowlist: only `lib/**/*.rb` plus the named root docs ship, so the internal
12
- `CLAUDE.md` files under `lib/` no longer do).
162
+ ### Changed
13
163
 
14
- ## [1.3.16] - 2026-08-13
164
+ - `ecoportal-api` dependency floor raised to `0.10.17`: inherits the `WithRetry` fix that
165
+ 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).
167
+ - **`graphlient` dependency now points at the published `0.9.0` release** instead of the fork's
168
+ frozen git branch (`rellampec/graphlient@pre-v0.0.9`). `0.9.0` ships the same DSL/directive
169
+ work the gem already relied on (`#115` `to_query_string`/`spread`, `#116` directives DSL,
170
+ `spread(on:)` inline fragments, `fragment(:Name, on:)`, custom scalar registration) — non-breaking,
171
+ since the gem's own usage of these APIs is unchanged. `Gemfile` git override removed;
172
+ `ecoportal-api-graphql.gemspec` bound updated `>= 0.8.0, < 0.9` → `>= 0.9.0, < 0.10`.
173
+
174
+ ### Changed (BREAKING)
175
+
176
+ - `reorderForces` and `reorderSection`: `after`/`before` replaced by `anchorId`/`anchorPosition`.
177
+ - `moveField`: gained `anchorId`/`anchorPosition`.
178
+ - SmartFill removed from `date`/`plainText`/`richText`/`select` field configs — moved to the
179
+ dedicated `*SmartFillConfig` commands above.
180
+ - **AI summary mutations rewired to the fields that actually exist.** Both targeted mutation names
181
+ that are absent from every introspection we hold (2026-07-13 and 2026-07-30), so neither ever
182
+ worked:
183
+ - `Mutation::AiSummary::Generate`: `generateAiSummary(pageId:, stageId:)` →
184
+ **`generatePageSummary(input: GenerateInput!)`**. `#query` now takes `page_id:` / `stage_id:`
185
+ (was `pageId:` / `stageId:`) and wraps them into `input`.
186
+ - `Mutation::AiSummary::SubmitFeedback`: `submitAiSummaryFeedback(aiSummaryVersionId:, sentiment:)`
187
+ → **`submitPageAiSummaryFeedback(input: SubmitFeedbackInput!)`**. `#query` takes
188
+ `ai_summary_version_id:` / `sentiment:`. The enum is `SentimentEnum`, not
189
+ `AiSummarySentimentEnum`, and its values are **`positive` / `negative`** — the class previously
190
+ documented "THUMBS_UP"/"THUMBS_DOWN", which the schema has never accepted. `#query` validates
191
+ the value up front.
192
+ - `Base::AiSummaryVersion` dropped `prompt`, `inputTokens`, `outputTokens`, `totalTokens`,
193
+ `resourceType`, `ratings` — none exist on the type; they always read nil. Real fields:
194
+ `aiSummary`, `alreadyRated`, `createdAt`, `dataFieldLogs`, `generationErrors`, `id`,
195
+ `pagePatchVer`, `status` (the last three complex ones stay unmodelled until verified).
196
+
197
+ _(The `Payload::OkPayload` errors-modelling fix from the same commit is NOT breaking and
198
+ already shipped in 1.3.15 — see that release's section.)_
199
+ - **`FileUpload::Client` reimplemented natively from a captured web upload** (breaking, but the
200
+ old path could not work). The real flow — verified from a HAR of the React frontend on
201
+ 2026-07-30, then cross-checked against the live schema — is three steps, all GraphQL except
202
+ the storage POST:
203
+ 1. `FileSignature` (GraphQL) → presigned policy + credentials
204
+ 2. multipart POST to S3 → `204`; fields in order: `key`, `AWSAccessKeyId`, `policy`,
205
+ `signature`, `content-type`, `x-amz-server-side-encryption`, `file`
206
+ 3. **`uploadFile` (GraphQL)** → the `FileContainer`, whose `id` page mutations consume
207
+
208
+ The previous implementation was a port of `ecoportal-api-v2`'s REST S3 code and did
209
+ `POST /api/v2/<org>/s3/files` + polling. **The platform does not use those endpoints for this
210
+ flow** — there is no register-over-REST and no poll — so the 1.3.15 change that made those
211
+ calls authenticate (`X-ECOPORTAL-API-KEY`) fixed a step that does not exist. No API key is
212
+ needed for file upload at all; `api_key:` on `GraphQL.new` remains available but unused here.
213
+ - **New:** `Mutation::FileContainer::Upload` (`uploadFile`), `Payload::Upload`, and
214
+ `Concerns::Threadable` (bounded concurrency, ported from `ecoportal-api-v2` rather than
215
+ depended on, since that gem is being decommissioned).
216
+ - **New: `#upload_all(paths, threads: 4) { |result| }`** — concurrent multi-file upload with
217
+ per-file error isolation (a single failure never raises out of the batch; each `Result`
218
+ carries its own `error`/`container_id`), presigning **once** per batch, and a `Result` struct
219
+ shaped like v2's `S3::Files::BatchUpload::FileResult`. `threads: 1` runs inline.
220
+ - **New: stage hooks** — `client.on(:signature|:storage|:register) { … }`, chainable, for
221
+ logging/instrumentation/middleware around each step.
222
+ - **Fixed: storage keys no longer collide.** The key is
223
+ `uploads/<userId>/<epoch-ms>-<token>-/<basename>` as the web client builds it; the old
224
+ `upload_prefix + filename` concatenation meant two uploads of `report.pdf` overwrote each
225
+ other in the bucket.
226
+ - **Fixed: `x-amz-server-side-encryption` is read from the policy** (base64 JSON `conditions`)
227
+ instead of being hardcoded to `AES256` — the value now comes from the same source S3 validates
228
+ against, with `AES256` only as a fallback.
229
+ - **Fixed: `Base::FileContainer`** declared `activeVersionId`, which does not exist on the type
230
+ (it is `activeVersion`) and always read nil; `otherTags` was missing, which matters because
231
+ `UploadInput.otherTags` is the only way to tag a container — now exposed as
232
+ `upload(path, tags: […])`.
15
233
 
16
234
  ### Fixed
17
235
 
18
- - Packaging-only republish of `1.3.15` with an allowlisted gemspec (backported from `2.0.0`).
19
- Versions `1.3.9`-`1.3.15` shipped internal repository content (internal AI-tooling project notes,
20
- `docs/worklog.md`, architecture docs) to rubygems.org via the old denylist `spec.files`; they
21
- will be yanked. `1.3.16` is the identical `lib/` code (including the `1.3.15` OozeRedirect
22
- `executeWorkflowCommands` fix) packaged clean, so the `1.x` line keeps a clean latest release.
236
+ - **Cascaded leaf arrays are no longer dropped from `as_update`.** Leaf arrays declared with
237
+ `passarray`/embeds-many (id-lists, tag-lists, config-lists) were invisible to the diff: the
238
+ default `DiffService` strips cascaded keys from the flat classic diff, and `diff_reduce` only
239
+ re-adds children that are a `GraphQL::Model` — an `ArrayModel`/`CollectionModel` is not — so
240
+ the array change was silently discarded and no mutation was issued for it (SYNTHESIS.md 3.1).
241
+ The `DataField`-local `LeafDiffService` is promoted to the common layer
242
+ (`common/graphql/model/diffable/leaf_diff_service.rb`): it keeps cascaded doc keys in the flat
243
+ diff, preserves the flat-diff placeholder for non-model leaf children while still cascading
244
+ into real nested models and dropping `root!` children, and treats a leaf array as an opaque
245
+ full-set replace (no id-keyed nested patch-ops), matching how the write inputs consume these
246
+ arrays. Set as `DIFF_CLASS` on `Interface::BasePage` (covers Basic + Phased), `Base::Register`
247
+ and `Base::PresetView`; `Base::Page::DataField` now references the promoted class with
248
+ identical behaviour. Newly detected: page `otherTags` (full-set replace) and `locations`
249
+ (`[{id:}]` via `location_ids=`), `Register#filterTags`, and `PresetView#fieldConfigurations`.
250
+ - `Base::PresetView` now emits a schema-valid `updatePresetView` input for its column
251
+ configuration. The read model exposes the collection as `fieldConfigurations` (the key the
252
+ API returns), but `UpdatePresetViewInput` calls it `fieldConfigs` **and** takes it as a
253
+ `FieldConfigurationOneToManyInput` — `{ additions:, deletions:, updates: }` — not as the
254
+ read list; both facts are schema-confirmed in the live introspection dump (20260730), where
255
+ the field is also NON_NULL with no default, i.e. required on every call. Emitting the read
256
+ key would be an unknown-argument error and emitting the read list under the write key would
257
+ be a type error, either of which rejects the WHOLE mutation, a `name`-only edit included.
258
+ `#as_input` (and `Input::PresetView::Update.from_model`, which shares the same reshape, so
259
+ the implicit and explicit converter seams agree) now renames the key, computes the
260
+ additions/deletions/updates delta directly from `doc` vs `original_doc` — matching configs on
261
+ their `id` and whitelisting the fields `FieldConfigurationInput` accepts, so the read-only
262
+ `__typename` is dropped — and always sets `fieldConfigs`, using the no-op `{}` when the
263
+ columns did not change. A columns-only change is now sent at all: it was previously dropped
264
+ from the flat diff, so `as_input` returned `nil` and no mutation was issued.
265
+ `Input::PresetView::Update` declared `fieldConfigs` as a `passarray`; it is now a
266
+ `passthrough`, matching the object the schema expects. The create path is unaffected —
267
+ `CreatePresetViewInput.fieldConfigs` is a plain `[FieldConfigurationInput!]!` and
268
+ `Input::PresetView::Create` already used the write key with the right shape.
269
+ - `Base::Page::DataField::FileField` now reads and writes the shape the live API actually
270
+ uses. WRITE: `as_input` emits `file: { id:, items: [ItemInput] }` — live `FileInput` has
271
+ no `fileContainerIds` member, so every File-field write was rejected (live-confirmed
272
+ 2026-08-01 via `pages/file_upload`; the 4-step upload passed, the attach failed). The
273
+ backend applies `items` as full-replace (any existing item id not echoed back is
274
+ destroyed), so kept containers are sent as `{ id: <item_id> }` and new ones as
275
+ `{ fileContainerId: }`. READ: `file_container_ids` now maps `items[].fileContainer.id`
276
+ (the fragment's actual selection, which now also selects the item `id`) instead of a
277
+ `fileContainers` doc key the API never returns — reads always came back empty before.
278
+ BREAKING (dead surface): the `FileField#fileContainers` accessor is gone, replaced by
279
+ `items`; no consumer existed in this gem or eco-helpers, and it could only ever return
280
+ empty against real API responses. `file_container_ids` / `file_container_ids=` keep
281
+ their contract. `ImageGallery` is untouched: its write shape is also invalid, but live
282
+ `ImageInput` attaches via `sourceId` (an `Enzyme::ImageReference::TempImage`, a
283
+ different upload pipeline than file containers) — needs its own design, tracked in the
284
+ DataField shape-asymmetry review.
285
+ - **`People#dirty?`** compares the people-id SET vs `original_doc` (falling back to the
286
+ `people{id}` nodes on both sides), not the raw `peopleIds` key — the backend can return
287
+ `peopleIds: null` on reads while still populating `people`/`cachedPeople`, so restating an
288
+ 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`
290
+ fix for the identical disease; `as_input` now serialises the fallback-aware `people_ids`
291
+ reader instead of the raw doc key.
292
+ - `ContractorEntities` field: the reader read the staged write key (`contractors`), which read
293
+ responses never populate — so it always returned `[]` on a freshly-fetched page — and the
294
+ default leaf diff phantom-dirtied the field the moment any setter ran, even for a no-op
295
+ restatement or a clear on an already-empty field. Now reads `contractorEntities[].id` with
296
+ staged-write preference and compares effective id SETS against `original_doc` in `dirty?`
297
+ (the CrossReference fix template).
298
+ - `Query::Page` now accepts the `CommonPageUnion` document variables (`showHiddenData`,
299
+ `content`, `only_content`, `fields`) as call params, and `Compat::Pages#get` forwards
300
+ them (`pages.get(id, content: false)`). Previously `accepted_params :id` silently
301
+ dropped any override, so the document-level defaults could never be changed.
302
+ This matters for least-privilege accounts: `attachedFiles @include(if: $content)` is
303
+ preauthorized on the `files: download` ability, so an account without that grant could
304
+ not complete **any** page read — found live when the template-tests account
305
+ (`-space graphql_templates`) had every `pages.get` refused while a minimal hand-written
306
+ page query succeeded. `content: false` is the structure-only read (template tooling,
307
+ config audits) and needs no file grant. Defaults are unchanged — no caller impact.
308
+ - **Four `Input::LocationStructure` command bugs are fixed — `add(type, **kwargs)` was broken on
309
+ every path.** `UpdateCommand#name` / `#classificationIds` called a non-existent `super` (plus a
310
+ redundant `nil.empty?` guard), raising `NoMethodError`; both readers now fall back to the stored
311
+ `name` / `classificationIds` so they work with or without a `new*` override. `ApplyCommands` and
312
+ `Draft::AddCommands` mapped the `:reorder` command type through a typo'd `:reoder` key, so
313
+ `add(:reorder, ...)` raised `NameError: uninitialized constant ...::ReoderCommand` — reorder was
314
+ unreachable from either dispatcher. `Interface::LocationStructure::Command#set_values` called the
315
+ 0-arg reader instead of the writer (`#{key}=`), raising `ArgumentError` and breaking the whole
316
+ `#add` path for every command type, not only reorder. Adds `commands_mapping_spec` (18 examples)
317
+ covering all four. Note: the typo symbol `:reoder` is no longer in the dispatch table, so
318
+ `add(:reoder)` now raises `RuntimeError: Unknown command type: 'reoder'` instead of `NameError` —
319
+ not a breaking change, since `:reoder` never resolved to a real class either way.
320
+ - **`FieldConfig::People` sent two keys the server rejects** — `addViewableFields` /
321
+ `removeViewableFields`, removed from the schema in the 20260725 drift. Now dropped, and the six
322
+ keys that drift *added* are reachable: `add`/`removeAllowedUserGroupIds`,
323
+ `attachedPeoplePermissionsEnabled`/`Editable`/`Flags`, `applyAttachedPeoplePermissionsTo`. The
324
+ nested flags hash is filtered to the seven declared flags so a stray key cannot sink the command.
325
+ - **`FieldConfig::Date` could not set renewals** — `createEvent`, `remindMeIn`, `renews`,
326
+ `renewsEvery`, `renewsUnit`, `renewsUntil` were all unreachable. Renewals are how expiry-driven
327
+ registers (certifications, inductions, permits) are configured, so this was a functional hole
328
+ rather than a cosmetic one.
329
+ - **`EditFieldConfiguration` silently dropped `stageId`** — required to disambiguate a field on a
330
+ phased page, which made the builder unusable there; callers had to hand-build the command hash.
331
+ `addPermittedPersonSchemaIds` / `removePermittedPersonSchemaIds` were dropped the same way.
332
+ - **Connection node-type poisoning.** `Logic::Connection` declared `embeds_many :nodes, klass: :node_class`
333
+ on the shared base, so the v2 collection layer memoized the first-resolved node class onto the single
334
+ shared collection — the first connection instantiated in a process poisoned every other connection's
335
+ instance `nodes` typing (e.g. a `MinimalDashboard` connection returning `AuthLog` nodes), corrupting
336
+ `QueryConnection#each` pagination when >1 connection type is used per process. Each subclass now binds
337
+ its own concrete-class collection via the new `Logic::Connection.nodes_of` macro. Regression spec added.
338
+ - `Compat::Response` now validates at construction that its payload honours the response contract
339
+ (`success?`/`error?`/`error_doc`/`item`), raising `ArgumentError` with the missing methods
340
+ otherwise. Closes the duck-typing drift class behind the eco-helpers 3.2.19 KPI-counter
341
+ regression (a non-response object slipping through). +spec `spec/ecoportal/api/graphql/compat/response_spec.rb`.
342
+ - **`main`'s version constant no longer advertises a published release it is not.** `2dad1e4`
343
+ (2026-08-08) set `GRAPQL_VERSION` to `1.3.15` while raising the `ecoportal-api` floor to
344
+ `0.10.17`. But `1.3.15` had already shipped nine days earlier from `release/1.3.15` (tag
345
+ `v1.3.15`, on RubyGems since 2026-07-30), and that tag is **not** an ancestor of `main` — the
346
+ two lines forked at `21516a3` (1.3.14) and `main` has carried ~200 commits of 1.4.0-track work
347
+ since. So `main` was building a materially different tree under a published version number,
348
+ against this repo's "never ship a fix under a published version" convention. The constant was
349
+ restored to `1.3.14` — the last release `main`'s tree actually descends from — until this
350
+ release set it to `2.0.0`. The `0.10.17` floor itself is unaffected and ships with this release.
351
+
352
+ ### Removed (BREAKING)
353
+
354
+ - `WorkflowCommandInput` commands `editPage` and `editPageCreatorPermissions` — removed from the
355
+ live schema (2026-07-13) and now removed from the gem. `WorkflowCommand.build(:editPage, …)` /
356
+ `build(:editPageCreatorPermissions, …)` raise `ArgumentError` (unknown key). The
357
+ `DEPRECATED_KEYS` / `warn_deprecated` machinery on `Input::WorkflowCommand` was removed with them.
358
+ **Migrate to:** `editTemplateBasicSettings` (name/icon/settings/counter/tags/folders/creator
359
+ perms), `editTemplateDescriptions` (`description`), `editTemplateCreatorPermissions` (creator
360
+ perms). The old `editPage` `addOtherTags`/`removeOtherTags` keys have no `editTemplate*`
361
+ equivalent (dropped from schema). No downstream callers existed (eco-helpers / multi_org_api /
362
+ gem swept) so the removal is clean. See DECISIONS.md in the workflow-space project.
363
+ - **`Mutation::SmartFill::Generate` / `Mutation::SmartFill::SubmitFeedback` and
364
+ `Builder::Page#generate_smart_fill` / `#submit_smart_fill_feedback`** (breaking, but dead
365
+ code) — `smartFillGenerate` and `smartFillSubmitFeedback` **do not exist in the schema**, and
366
+ never did: the live mutation list has no `*fill*` mutation at all (checked against both the
367
+ 2026-07-13 and 2026-07-30 introspections). SmartFill exists only as *configuration*
368
+ (`WorkflowCommandInput`'s `add/edit/removeSmartFillConfig`, the `SmartFill*Configuration`
369
+ types) and as a **read** data field — `Base::Page::DataField::SmartFill` is unaffected and
370
+ stays. Nothing could have depended on the removed mutations because they always failed; if
371
+ page-level SmartFill triggering is needed, it has to be added to the platform first.
372
+
373
+ ### Documentation
374
+
375
+ - `ecoPortal_architecture/10_forces_workflow_builder.md`: operational rules for auditing force
376
+ bindings — a binding may target a field OR a section; `globalBindings` is a separate collection;
377
+ a field declaring `global_binding` is present at stage render regardless of its section/stage;
378
+ backup-YAML ObjectIds are binary so a text search for an id proves nothing.
379
+ - `ecoPortal_architecture/07_data_fields.md`: which subset of fields carries an identifier, and how
380
+ to measure coverage — only the QUESTION carries one; its satellites (comment, image, document,
381
+ recommended action) do not and are not expected to. The denominator is workbook questions
382
+ (`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
384
+ workbook-to-template contract recovered verbatim from the 2026-08-08 session transcript:
385
+ `QuestionSetReference` → template_container_id (UI "UNIQUE IDENTIFIER"), `QuestionReference` →
386
+ field `description` (CONFIRMED), `QuestionInformation` → field tooltip (strip HTML entities),
387
+ scores ignored, section-vs-stage left ambiguous, plus the template-pairing procedure and the
388
+ DEV-site targeting note.
389
+ - `.ai-assistance/conventions/recovering-prior-context.md` — past sessions are greppable JSONL
390
+ transcripts on disk (35 sessions, 85 MB); search them before asking the developer something he may
391
+ already have answered.
23
392
 
24
393
  ## [1.3.15] - 2026-07-30
25
394
 
@@ -145,7 +514,7 @@ signed-off future decision.)
145
514
  (`external_id`/`id`/`state`) — a spurious path produced term `membranes.external_id.external_id`
146
515
  → 0 results (silent miss → dup-on-upsert). Register FIELD keys still get the nested path.
147
516
  - Verified against the backend filter definitions; catalogued in
148
- the repo's internal docs.
517
+ `.ai-assistance/code/filter_contract_matrix.md`.
149
518
 
150
519
  ### Added
151
520
 
@@ -217,7 +586,7 @@ shapes checked against the live schema dump); the live UAT→PROD round trip is
217
586
  longer exists (fragments are a registry now) → `uninitialized constant … Fragment::… (NameError)` at
218
587
  render time. Now `spread :Action` / `spread :ContractorEntity`, matching the already-migrated queries.
219
588
  (The sibling breakage in eco-helpers' location-command optimizations is fixed in eco-helpers 3.2.17;
220
- it crashed a customer's live locations sync.)
589
+ it crashed the live act-gov locations sync.)
221
590
  - **Kickstand workflow mutations — bare `DateTime` selection.** `Kickstand::{Start,Stop,Fail}Workflow`
222
591
  selected `startedAt`/`stoppedAt`/`failedAt` bare → "Field must have selections". Now
223
592
  `{ dateTime timeZone }` (same class as the 1.3.10 LocationStructure fix).
@@ -245,7 +614,7 @@ shapes checked against the live schema dump); the live UAT→PROD round trip is
245
614
 
246
615
  ## [1.3.10] - 2026-07-03
247
616
 
248
- Hotfix (backwards-compatible). Resolves a live failure on a customer's users sync.
617
+ Hotfix (backwards-compatible). Resolves a live failure on the Turners & Growers users sync.
249
618
 
250
619
  ### Fixed
251
620
 
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.
@@ -0,0 +1,36 @@
1
+ # common/graphql
2
+
3
+ Shared HTTP transport, authentication, and base model infrastructure used by the gem — nothing here is EcoPortal-domain-specific.
4
+
5
+ ## Contents
6
+
7
+ | File / class | Purpose |
8
+ |---|---|
9
+ | `auth_service.rb` / `AuthService` | OAuth2 password + refresh-token flow; included in both client classes |
10
+ | `client.rb` / `Client` | Graphlient-based GraphQL client (builds bearer-token headers, constructs endpoint URL) |
11
+ | `http_client.rb` / `HttpClient` | Raw HTTP client (extends `Common::Client`); `execute` sends query strings + variables; supports v0–v3 + graphql API version modes |
12
+ | `class_helpers.rb` / `ClassHelpers` | `becomes(klass)` instance casting + `const?` class helper |
13
+ | `hash_helpers.rb` / `HashHelpers` | Deep key transforms (`keys_to_sym_deep`, `deep_dup`, `remove_nil_keys_deep`) — used by diff and input serialisation |
14
+ | `query_integration.rb` / `QueryIntegration` | Class macro `query(:method, query_klass:)` that wires a named query method on `Model::Organization` |
15
+ | `model.rb` / `Model` | Base model class: `DoubleModel` + `Diffable` + `AsInput`; all GraphQL models ultimately inherit this |
16
+ | `patches.rb` | Reserved placeholder (empty) |
17
+ | `model/diffable.rb` | `as_update` / `dirty?` — delegates to `DiffService` |
18
+ | `model/as_input.rb` | `as_input` (instance) and `as_input(hash)` (class method) — converts diff to GraphQL mutation variables |
19
+ | `model/diffable/diff_service.rb` | Main diff engine: flat classic diff + cascaded reduce through nested `GraphQL::Model` objects |
20
+ | `model/diffable/classic_diff_service.rb` | Low-level change-data extraction (compares `curr_doc` vs `prev_doc`) |
21
+ | `model/diffable/hash_diff.rb` | Hash equality / change detection helpers |
22
+ | `model/diffable/hash_diff_nesting.rb` | Nested key path helpers (`dig_set!`, `dig_delete!`, `dig_path?`) |
23
+
24
+ ## Conventions
25
+
26
+ - `Client` is graphlient-based and used for schema introspection; `HttpClient` is the actual request sender used in production (set as `client.http_client`).
27
+ - `HashHelpers` is used as both a module mixin (include) and directly via `HashHelpers.keys_to_sym_deep(...)`.
28
+ - `DiffService` handles the `flat:` flag: `flat: true` does a single-level diff; `flat: false` (default) cascades through nested `GraphQL::Model` objects.
29
+ - Root-class objects (`root!` declared) are excluded from cascaded diffs — they represent independent server entities.
30
+ - `AsInput#as_input(target_class:)` delegates to `Input::X.from_model(self)` when a target class is given.
31
+
32
+ ## Related
33
+
34
+ - `../graphql/logic/base_model.rb` — adds `SnakeCamelAccess` on top of `Common::GraphQL::Model`
35
+ - `../graphql/logic/input.rb` — `Logic::Input` base class built on top of `Model`
36
+ - `../graphql/logic/base_query.rb` — consumes `HttpClient#execute` and `HashHelpers`