ecoportal-api-graphql 1.3.5 → 1.3.9
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.
- checksums.yaml +4 -4
- data/.ai-assistance/bridge/CLAUDE.md +338 -0
- data/.ai-assistance/bridge/archive/.gitkeep +0 -0
- data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.inbox.md +29 -0
- data/.ai-assistance/bridge/archive/oscar-a1b2c3d-gitlab-mcp-doc-update.outbox.md +18 -0
- data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.inbox.md +42 -0
- data/.ai-assistance/bridge/archive/oscar-c912c25-gemini-design-review.outbox.md +115 -0
- data/.ai-assistance/bridge/context/gemini-review-prompt.txt +48 -0
- data/.ai-assistance/bridge/context/gemini-review-response.md +104 -0
- data/.ai-assistance/bridge/context/project.md +42 -0
- data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
- data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
- data/.ai-assistance/bridge/outbox/request-for-standards-discovery.md +48 -0
- data/.ai-assistance/bridge/queue/.gitkeep +1 -0
- data/.ai-assistance/capabilities/CLAUDE.md +27 -0
- data/.ai-assistance/capabilities/assumptions-log.md +80 -0
- data/.ai-assistance/capabilities/code.md +47 -0
- data/.ai-assistance/capabilities/connectors.md +37 -0
- data/.ai-assistance/capabilities/cowork.md +55 -0
- data/.ai-assistance/code/OVERVIEW.md +155 -0
- data/.ai-assistance/code/data_fields.md +242 -0
- data/.ai-assistance/code/dependencies.md +151 -0
- data/.ai-assistance/code/diff_as_input.md +234 -0
- data/.ai-assistance/code/diff_service_deep_dive.md +192 -0
- data/.ai-assistance/code/ecoPortal_architecture/00_overview_and_index.md +55 -0
- data/.ai-assistance/code/ecoPortal_architecture/01_terminology_dictionary.md +181 -0
- data/.ai-assistance/code/ecoPortal_architecture/02_data_model.md +192 -0
- data/.ai-assistance/code/ecoPortal_architecture/03_api_layers.md +147 -0
- data/.ai-assistance/code/ecoPortal_architecture/04_graphql_queries_mutations.md +277 -0
- data/.ai-assistance/code/ecoPortal_architecture/05_page_workflows.md +200 -0
- data/.ai-assistance/code/ecoPortal_architecture/06_search_and_filters.md +228 -0
- data/.ai-assistance/code/ecoPortal_architecture/07_data_fields.md +197 -0
- data/.ai-assistance/code/ecoPortal_architecture/08_stages_sections.md +243 -0
- data/.ai-assistance/code/ecoPortal_architecture/09_people_contractors_locations.md +196 -0
- data/.ai-assistance/code/ecoPortal_architecture/10_forces_workflow_builder.md +132 -0
- data/.ai-assistance/code/ecoPortal_architecture/11_integration_gems.md +187 -0
- data/.ai-assistance/code/ecoPortal_architecture/12_ai_documentation_sources_gaps.md +236 -0
- data/.ai-assistance/code/ecoPortal_architecture/13_ai_infrastructure.md +183 -0
- data/.ai-assistance/code/ecoportal_schema_reference.md +240 -0
- data/.ai-assistance/code/graphql_domain_knowledge.md +230 -0
- data/.ai-assistance/code/refactoring/datafield-readwrite-shape-asymmetry.md +71 -0
- data/.ai-assistance/code/refactoring/opportunities.md +251 -0
- data/.ai-assistance/code/schema_analysis.md +321 -0
- data/.ai-assistance/code/search_filters.md +868 -0
- data/.ai-assistance/code/spec_coverage.md +73 -0
- data/.ai-assistance/code/workflow-command-guide.md +438 -0
- data/.ai-assistance/code/workflow-space.md +353 -0
- data/.ai-assistance/conventions/CLAUDE.md +30 -0
- data/.ai-assistance/conventions/code-working-tree-protocol.md +199 -0
- data/.ai-assistance/conventions/gitignore-rules.md +42 -0
- data/.ai-assistance/conventions/permission-guidance.md +120 -0
- data/.ai-assistance/integrations/README.md +70 -0
- data/.ai-assistance/integrations/gitkraken-mcp.md +107 -0
- data/.ai-assistance/integrations/gitlab-mcp.md +123 -0
- data/.ai-assistance/integrations/local-git.md +60 -0
- data/.ai-assistance/local_paths.example.md +17 -0
- data/.ai-assistance/projects/TODO.md +97 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/DECISIONS.md +168 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/INTENT.md +60 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/TODO.md +267 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/UPSTREAM.md +53 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/csv-template-pipeline-design.md +102 -0
- data/.ai-assistance/projects/api-v2-to-graphql-migration/notes/cutover-usecase-gap-audit.md +139 -0
- data/.ai-assistance/projects/dynamic-model-generation/INTENT.md +93 -0
- data/.ai-assistance/projects/eco-helpers-compat/INTENT.md +244 -0
- data/.ai-assistance/projects/eco-helpers-compat/MIGRATION_GUIDE.md +266 -0
- data/.ai-assistance/projects/eco-helpers-compat/TODO.md +86 -0
- data/.ai-assistance/projects/ecoportal-api-v2-doublemodel-review/INTENT.md +101 -0
- data/.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md +177 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/DECISIONS.md +161 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/INTENT.md +125 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/RISKS.md +126 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +256 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-06-30-cutover-workflow-deep-review.md +122 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/analysis/2026-07-01-forces-via-workflow-commands-miss-rca.md +148 -0
- data/.ai-assistance/projects/page-model/DECISIONS.md +245 -0
- data/.ai-assistance/projects/page-model/TODO.md +190 -0
- data/.ai-assistance/projects/search-filter-builder/INTENT.md +107 -0
- data/.ai-assistance/projects/search-filter-builder/TODO.md +131 -0
- data/.ai-assistance/projects/template-maintenance/DESIGN.md +134 -0
- data/.ai-assistance/projects/workflow-space/TODO.md +213 -0
- data/.ai-assistance/reinstall-claude-desktop-windows.md +136 -0
- data/.ai-assistance/scripts/CLAUDE.md +150 -0
- data/.ai-assistance/scripts/bridge-init.sh +86 -0
- data/.ai-assistance/scripts/bridge-status.sh +44 -0
- data/.ai-assistance/scripts/capabilities-check.ts +104 -0
- data/.ai-assistance/scripts/check-outbox.sh +43 -0
- data/.ai-assistance/scripts/dep_graph.rb +91 -0
- data/.ai-assistance/scripts/lock-acquire.sh +103 -0
- data/.ai-assistance/scripts/lock-multi.sh +124 -0
- data/.ai-assistance/scripts/lock-queue.sh +94 -0
- data/.ai-assistance/scripts/setup-mcps.test.ts +188 -0
- data/.ai-assistance/scripts/setup-mcps.ts +234 -0
- data/.ai-assistance/scripts/task-complete.ts +74 -0
- data/.ai-assistance/scripts/task-create.ts +75 -0
- data/.ai-assistance/scripts/task-read.ts +125 -0
- data/.ai-assistance/scripts/token-logger.js +220 -0
- data/.ai-assistance/scripts/token-report.ts +158 -0
- data/.ai-assistance/scripts/token-session-start.js +66 -0
- data/.ai-assistance/skills/ai-instructions/SKILL.md +48 -0
- data/.ai-assistance/skills/code-specs/SKILL.md +69 -0
- data/.ai-assistance/skills/corporate-policies/SKILL.md +201 -0
- data/.ai-assistance/skills/dep-graph/SKILL.md +139 -0
- data/.ai-assistance/skills/ep-ai-manager/SKILL.md +417 -0
- data/.ai-assistance/skills/gemini-assist/SKILL.md +63 -0
- data/.ai-assistance/skills/gemini-assist/gemini-mcp-server.js +205 -0
- data/.ai-assistance/skills/gemini-assist/gemini_ask.py +1 -0
- data/.ai-assistance/skills/gemini-assist/gemini_ask.rb +240 -0
- data/.ai-assistance/skills/gemini-assist/prompts/cycle_end_review.txt +25 -0
- data/.ai-assistance/skills/graphql-schema-analysis/SKILL.md +261 -0
- data/.ai-assistance/skills/project-cycle/SKILL.md +177 -0
- data/.ai-assistance/skills/refactor/SKILL.md +62 -0
- data/.ai-assistance/skills/rubocop/SKILL.md +93 -0
- data/.ai-assistance/skills/ruby-scripting/SKILL.md +215 -0
- data/.ai-assistance/skills/spec-generation/SKILL.md +72 -0
- data/.ai-assistance/standards-version.json +21 -0
- data/.ai-assistance/token-budget.json +32 -0
- data/.ai-assistance/version.json +39 -0
- data/.claude/settings.json +146 -0
- data/.env.example +18 -0
- data/.gitattributes +15 -0
- data/.gitignore +13 -0
- data/.rubocop.yml +121 -97
- data/CHANGELOG.md +673 -477
- data/CLAUDE.md +232 -0
- data/Gemfile +30 -6
- data/Rakefile +90 -38
- data/docs/worklog.md +574 -0
- data/ecoportal-api-graphql.gemspec +40 -40
- data/lib/ecoportal/api/common/graphql/CLAUDE.md +36 -0
- data/lib/ecoportal/api/common/graphql/client.rb +1 -1
- data/lib/ecoportal/api/common/graphql/http_client.rb +35 -3
- data/lib/ecoportal/api/common/graphql/model/CLAUDE.md +28 -0
- data/lib/ecoportal/api/common/graphql/model/as_input.rb +8 -5
- data/lib/ecoportal/api/common/graphql/model/diffable/classic_diff_service.rb +3 -1
- data/lib/ecoportal/api/common/graphql/model/diffable/diff_service.rb +31 -23
- data/lib/ecoportal/api/common/graphql/model/diffable/hash_diff_nesting.rb +54 -1
- data/lib/ecoportal/api/graphql/CLAUDE.md +37 -0
- data/lib/ecoportal/api/graphql/base/CLAUDE.md +50 -0
- data/lib/ecoportal/api/graphql/base/ai_summary_version.rb +17 -0
- data/lib/ecoportal/api/graphql/base/delta_result.rb +16 -0
- data/lib/ecoportal/api/graphql/base/force/binding.rb +19 -0
- data/lib/ecoportal/api/graphql/base/force/binding_collection.rb +62 -0
- data/lib/ecoportal/api/graphql/base/force/collection.rb +47 -0
- data/lib/ecoportal/api/graphql/base/force.rb +65 -0
- data/lib/ecoportal/api/graphql/base/kickstand/job.rb +17 -0
- data/lib/ecoportal/api/graphql/base/kickstand/workflow.rb +18 -0
- data/lib/ecoportal/api/graphql/base/kickstand.rb +13 -0
- data/lib/ecoportal/api/graphql/base/page/basic.rb +38 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/actions_list.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/ai_summary.rb +18 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/checklist.rb +29 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +112 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/cross_reference.rb +54 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/date_field.rb +23 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/gauge.rb +19 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/geo.rb +24 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/law.rb +8 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/mailbox.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/number.rb +20 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/people.rb +35 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/plain_text.rb +17 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/rich_text.rb +26 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/select.rb +41 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/signature.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/smart_fill.rb +17 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/table.rb +9 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/tag_field.rb +21 -0
- data/lib/ecoportal/api/graphql/base/page/data_field.rb +137 -12
- data/lib/ecoportal/api/graphql/base/page/phased/stage.rb +68 -14
- data/lib/ecoportal/api/graphql/base/page/phased.rb +1 -0
- data/lib/ecoportal/api/graphql/base/page/section.rb +36 -0
- data/lib/ecoportal/api/graphql/base/page/section_collection.rb +79 -0
- data/lib/ecoportal/api/graphql/base/page.rb +2 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/action_type_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/callback_type.rb +28 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_change.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_change_message.rb +15 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_es_change.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/command_interface.rb +36 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/email_config.rb +18 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/escalation_level.rb +19 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/in_system_config.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/mailbox_field_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operation_interface.rb +39 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/assign_to.rb +27 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/create_page.rb +21 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/operations/send_notification.rb +30 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/people_field_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/recipient_config.rb +34 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/register_field.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/task_config_selection.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/time_delay_config.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/trigger_interface.rb +26 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/triggers/conditional_logic.rb +17 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow/user_selection.rb +16 -0
- data/lib/ecoportal/api/graphql/base/pages_workflow.rb +35 -0
- data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -0
- data/lib/ecoportal/api/graphql/base/preview_page.rb +23 -0
- data/lib/ecoportal/api/graphql/base/register.rb +18 -0
- data/lib/ecoportal/api/graphql/base.rb +11 -0
- data/lib/ecoportal/api/graphql/builder/CLAUDE.md +65 -0
- data/lib/ecoportal/api/graphql/builder/kickstand.rb +73 -0
- data/lib/ecoportal/api/graphql/builder/page.rb +210 -41
- data/lib/ecoportal/api/graphql/builder/register/preset_view.rb +84 -0
- data/lib/ecoportal/api/graphql/builder/register.rb +27 -19
- data/lib/ecoportal/api/graphql/builder/template.rb +80 -0
- data/lib/ecoportal/api/graphql/builder.rb +2 -0
- data/lib/ecoportal/api/graphql/compat/filter_translator.rb +107 -0
- data/lib/ecoportal/api/graphql/compat/page_reference.rb +23 -0
- data/lib/ecoportal/api/graphql/compat/pages.rb +212 -0
- data/lib/ecoportal/api/graphql/compat/registers.rb +84 -0
- data/lib/ecoportal/api/graphql/compat/response.rb +35 -0
- data/lib/ecoportal/api/graphql/compat/search_results.rb +33 -0
- data/lib/ecoportal/api/graphql/compat/stage_collection.rb +70 -0
- data/lib/ecoportal/api/graphql/compat/stage_view.rb +76 -0
- data/lib/ecoportal/api/graphql/compat.rb +17 -0
- data/lib/ecoportal/api/graphql/concerns/data_field_access.rb +71 -0
- data/lib/ecoportal/api/graphql/concerns/deprecation.rb +20 -0
- data/lib/ecoportal/api/graphql/concerns/fragment_definitions.rb +21 -28
- data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -0
- data/lib/ecoportal/api/graphql/concerns/snake_camel_access.rb +60 -0
- data/lib/ecoportal/api/graphql/concerns.rb +4 -0
- data/lib/ecoportal/api/graphql/connection/page.rb +11 -0
- data/lib/ecoportal/api/graphql/connection/pages_workflow_command.rb +13 -0
- data/lib/ecoportal/api/graphql/connection/preset_view.rb +11 -0
- data/lib/ecoportal/api/graphql/connection/preview_page.rb +11 -0
- data/lib/ecoportal/api/graphql/connection.rb +4 -0
- data/lib/ecoportal/api/graphql/file_upload/client.rb +181 -0
- data/lib/ecoportal/api/graphql/file_upload.rb +10 -0
- data/lib/ecoportal/api/graphql/fragment/action.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/action_category.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/contractor_entity.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/force.rb +30 -0
- data/lib/ecoportal/api/graphql/fragment/location_draft.rb +2 -2
- data/lib/ecoportal/api/graphql/fragment/location_node.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/locations_error.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment/page.rb +85 -0
- data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +395 -0
- data/lib/ecoportal/api/graphql/fragment/pages.rb +15 -0
- data/lib/ecoportal/api/graphql/fragment/pages_workflow.rb +172 -0
- data/lib/ecoportal/api/graphql/fragment/pagination.rb +1 -1
- data/lib/ecoportal/api/graphql/fragment.rb +37 -27
- data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +25 -0
- data/lib/ecoportal/api/graphql/input/delta_input.rb +16 -0
- data/lib/ecoportal/api/graphql/input/page/archive.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/build_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/create_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/create_from_template.rb +18 -0
- data/lib/ecoportal/api/graphql/input/page/delete_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/publish_draft.rb +13 -0
- data/lib/ecoportal/api/graphql/input/page/review_task.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/unarchive.rb +14 -0
- data/lib/ecoportal/api/graphql/input/page/update.rb +140 -0
- data/lib/ecoportal/api/graphql/input/page.rb +26 -0
- data/lib/ecoportal/api/graphql/input/preset_view/create.rb +18 -0
- data/lib/ecoportal/api/graphql/input/preset_view/permission.rb +16 -0
- data/lib/ecoportal/api/graphql/input/preset_view/update.rb +16 -0
- data/lib/ecoportal/api/graphql/input/preset_view.rb +14 -0
- data/lib/ecoportal/api/graphql/input/register/create.rb +18 -0
- data/lib/ecoportal/api/graphql/input/register/update.rb +15 -0
- data/lib/ecoportal/api/graphql/input/register.rb +13 -0
- data/lib/ecoportal/api/graphql/input/search_conf/ai_generator.rb +234 -0
- data/lib/ecoportal/api/graphql/input/search_conf.rb +367 -0
- data/lib/ecoportal/api/graphql/input/variable_binding.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_action_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_comment_tagging_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_default_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_gauge_field_stop.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_field_config.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_action_type.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_filter.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_people_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_task_config.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_recipient_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_scheduled_callback_action.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_select_field_option.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_stage_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_task.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_task_assignment_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/add_workflow_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/collapse_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_creator_permissions.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_field_configuration.rb +21 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_gauge_field_stop.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_field_config.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_page.rb +28 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_page_creator_permissions.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_reminder.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_required_sign_offs.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_comment_tagging.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_restrict_task_assignment.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_scheduled_callback.rb +22 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_section_header.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_select_field_option.rb +19 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_task_due.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/edit_trigger.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/expand_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/contractor_entities.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/cross_reference.rb +23 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/date.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/gauge.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/image_gallery.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/location_field.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/people.rb +24 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/plain_text.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/rich_text.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/select.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/signature.rb +20 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/field_config/table.rb +25 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/move_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/move_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_action_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_binding.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_comment_tagging_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_default_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_force.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_gauge_field_stop.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_field_config.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_linked_helper.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_direct_strategy_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_operation_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_action_type.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_filter.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_people_field.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_task_config.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_recipient_user.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_scheduled_callback.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_select_field_option.rb +17 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_stage_tag.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_strategy.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_assignment_user_group.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_due.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/remove_task_priority_level.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/reorder_forces.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command/reorder_section.rb +18 -0
- data/lib/ecoportal/api/graphql/input/workflow_command.rb +251 -0
- data/lib/ecoportal/api/graphql/input.rb +8 -0
- data/lib/ecoportal/api/graphql/interface/base_page.rb +100 -58
- data/lib/ecoportal/api/graphql/interface/location_structure/nodes.rb +27 -28
- data/lib/ecoportal/api/graphql/logic/base_model.rb +2 -0
- data/lib/ecoportal/api/graphql/logic/base_query.rb +45 -2
- data/lib/ecoportal/api/graphql/logic/input.rb +15 -0
- data/lib/ecoportal/api/graphql/model/ai_summary_version.rb +10 -0
- data/lib/ecoportal/api/graphql/model/organization.rb +65 -55
- data/lib/ecoportal/api/graphql/model/page/basic.rb +14 -0
- data/lib/ecoportal/api/graphql/model/page/phased.rb +82 -20
- data/lib/ecoportal/api/graphql/model/page.rb +1 -0
- data/lib/ecoportal/api/graphql/model/page_union.rb +21 -0
- data/lib/ecoportal/api/graphql/model/pages_workflow.rb +20 -0
- data/lib/ecoportal/api/graphql/model/preset_view.rb +10 -0
- data/lib/ecoportal/api/graphql/model/preview_page.rb +10 -0
- data/lib/ecoportal/api/graphql/model/register.rb +10 -0
- data/lib/ecoportal/api/graphql/model.rb +8 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary/generate.rb +45 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary/submit_feedback.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/ai_summary.rb +13 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_jobs.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/bulk_update_workflows.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/fail_job.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/start_job.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/kickstand.rb +18 -0
- data/lib/ecoportal/api/graphql/mutation/location_structure/apply_commands.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/add_commands.rb +2 -2
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/create.rb +2 -2
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/drop_bad_commands.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/location_structure/draft/publish.rb +3 -3
- data/lib/ecoportal/api/graphql/mutation/page/approve_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/archive.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/batch_update_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/build_from_template.rb +50 -0
- data/lib/ecoportal/api/graphql/mutation/page/create_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/create_from_template.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/page/delete_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/execute_force_commands.rb +69 -0
- data/lib/ecoportal/api/graphql/mutation/page/execute_workflow_commands.rb +51 -0
- data/lib/ecoportal/api/graphql/mutation/page/publish_draft.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/reject_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/restart_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/unarchive.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/undo_review_task.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/update.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/page/update_variable_bindings.rb +44 -0
- data/lib/ecoportal/api/graphql/mutation/page.rb +28 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/create.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/destroy.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/permission.rb +37 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view/update.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/preset_view.rb +15 -0
- data/lib/ecoportal/api/graphql/mutation/register/create.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register/destroy.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register/update.rb +35 -0
- data/lib/ecoportal/api/graphql/mutation/register.rb +14 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill/generate.rb +36 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill/submit_feedback.rb +40 -0
- data/lib/ecoportal/api/graphql/mutation/smart_fill.rb +13 -0
- data/lib/ecoportal/api/graphql/mutation/template/create.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/create_related_page.rb +46 -0
- data/lib/ecoportal/api/graphql/mutation/template/destroy_related_page.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template/publish.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/unpublish.rb +39 -0
- data/lib/ecoportal/api/graphql/mutation/template/update.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template/update_information.rb +43 -0
- data/lib/ecoportal/api/graphql/mutation/template.rb +18 -0
- data/lib/ecoportal/api/graphql/mutation.rb +8 -0
- data/lib/ecoportal/api/graphql/payload/ai_summary_generate.rb +12 -0
- data/lib/ecoportal/api/graphql/payload/execute_workflow_commands.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/force_commands.rb +31 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_jobs.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/bulk_update_workflows.rb +36 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/job.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/kickstand/workflow.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/kickstand.rb +15 -0
- data/lib/ecoportal/api/graphql/payload/location_structure/draft/create.rb +33 -34
- data/lib/ecoportal/api/graphql/payload/ok_payload.rb +21 -0
- data/lib/ecoportal/api/graphql/payload/page/archive.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/build_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/create_from_template.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/draft.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/review_task.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/unarchive.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/update.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page/update_variable_bindings.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/page.rb +19 -0
- data/lib/ecoportal/api/graphql/payload/preset_view.rb +11 -0
- data/lib/ecoportal/api/graphql/payload/register.rb +11 -0
- data/lib/ecoportal/api/graphql/payload/template/create.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/create_related_page.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/destroy_related_page.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/publish.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/unpublish.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/update.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template/update_information.rb +13 -0
- data/lib/ecoportal/api/graphql/payload/template.rb +18 -0
- data/lib/ecoportal/api/graphql/payload.rb +11 -0
- data/lib/ecoportal/api/graphql/query/action.rb +1 -1
- data/lib/ecoportal/api/graphql/query/action_categories.rb +1 -1
- data/lib/ecoportal/api/graphql/query/actions.rb +2 -2
- data/lib/ecoportal/api/graphql/query/contractor_entities.rb +1 -1
- data/lib/ecoportal/api/graphql/query/file_upload_signature.rb +76 -0
- data/lib/ecoportal/api/graphql/query/location_structure/draft.rb +2 -2
- data/lib/ecoportal/api/graphql/query/location_structure.rb +1 -1
- data/lib/ecoportal/api/graphql/query/location_structures.rb +1 -1
- data/lib/ecoportal/api/graphql/query/page.rb +45 -0
- data/lib/ecoportal/api/graphql/query/page_delta.rb +47 -0
- data/lib/ecoportal/api/graphql/query/page_with_forces.rb +43 -0
- data/lib/ecoportal/api/graphql/query/pages.rb +59 -0
- data/lib/ecoportal/api/graphql/query/pages_workflow_commands.rb +59 -0
- data/lib/ecoportal/api/graphql/query/register_preset_views.rb +78 -0
- data/lib/ecoportal/api/graphql/query/register_preview_pages.rb +83 -0
- data/lib/ecoportal/api/graphql/query/templates.rb +53 -0
- data/lib/ecoportal/api/graphql/query.rb +11 -0
- data/lib/ecoportal/api/graphql.rb +60 -2
- data/lib/ecoportal/api/graphql_version.rb +5 -5
- data/scripts/auto-worker-scheduler.sh +386 -0
- data/tests/contractor_entity_create.rb +19 -19
- data/tests/contractor_entity_udpate.rb +20 -20
- data/tests/dump_page_model.rb +74 -0
- data/tests/loc_structure_get.rb +1 -2
- data/tests/loc_structure_update.rb +51 -51
- data/tests/loc_structures_get.rb +15 -15
- metadata +436 -5
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Cutover gap audit — 3 use cases on GraphQL (TODO 8.5)
|
|
2
|
+
|
|
3
|
+
## Update — 2026-06-29
|
|
4
|
+
|
|
5
|
+
> Status refresh after the WRITE/value/submit path went **live-green** on `mini`. The full
|
|
6
|
+
> mini automated suite now runs **35/35**. Several items the 2026-06-28 audit listed as gaps
|
|
7
|
+
> or "coded-but-untested" are now RESOLVED and live-validated. History below is preserved;
|
|
8
|
+
> read the per-use-case lines together with this block.
|
|
9
|
+
|
|
10
|
+
**RESOLVED since the 2026-06-28 audit:**
|
|
11
|
+
- **Field value round-trips (TODO 8.1) — DONE & LIVE-GREEN.** PlainText, Number, Select,
|
|
12
|
+
People (`people_ids`), CrossReference (`page_ids`/`reference_ids`) all round-trip
|
|
13
|
+
(set → `updatePage` → re-read → persisted). The P2 "coded-but-untested array writes"
|
|
14
|
+
(People `<<`, CrossRef `add`/`clear`) are now **validated live** — full mini suite 35/35.
|
|
15
|
+
- **`submit!` / stage completion (TODO 8.2) — DONE & LIVE-GREEN.** Root cause of the old
|
|
16
|
+
stuck-stage failure: the stage carries a **review-task config**, so `completePageTask`
|
|
17
|
+
ALONE moves it to "reviewing" and never advances. Fix =
|
|
18
|
+
`updatePage(submit: true, task: { completePageTask: { signOff: true } })` — the inline
|
|
19
|
+
sign-off auto-approves the review and advances the stage. Gem gained sugar:
|
|
20
|
+
`Input::Page::Update.from_model(complete_page_task: { sign_off:, forced_complete:, notes: })`.
|
|
21
|
+
New test `compat_v2/page/submit_signoff_on_create` passes; old `stage_submit` flipped to the
|
|
22
|
+
confirmed call.
|
|
23
|
+
- **Phased write-path identity (was P0 — "the most important gem fix") — RESOLVED & validated**
|
|
24
|
+
via `compat_v2/page/stage_write`: a value set through `stage.components` now persists through
|
|
25
|
+
`updatePage`. The `stage.components` vs flat `page.field_collection` dup'd-doc risk is closed.
|
|
26
|
+
- **`get_by_name(type:)` — DONE** (2026-06-28).
|
|
27
|
+
- **FilterTranslator `text_filter`→`match_filter`, `options_filter`→`one_of`/`none_of` — LANDED**
|
|
28
|
+
(commit 7725f96). Reclassified from a **code gap** to a **validation item**: still needs LIVE
|
|
29
|
+
validation against a real `registers.search` (see 8.3 below). Not a blocker for the translator
|
|
30
|
+
existing.
|
|
31
|
+
|
|
32
|
+
**STILL OUTSTANDING (carry forward):**
|
|
33
|
+
- **BasicPage reads (TODO 8.4)** — `CommonPageUnion` lacks `... on BasicPage { sections }`,
|
|
34
|
+
so basic pages get `corePageData` only. **IN PROGRESS** on branch `cutover/basicpage-sections`.
|
|
35
|
+
- **Live-validate translated text/options filters (TODO 8.3)** — confirm `match_filter` /
|
|
36
|
+
`one_of`/`none_of` against a real `registers.search` on `mini`.
|
|
37
|
+
- **Gem RSpec read-path regression specs (TODO 8.6)** — **IN PROGRESS** on branch
|
|
38
|
+
`cutover/regression-specs-8-6`.
|
|
39
|
+
- **Collection-level write review (TODO 8.7)** — add/remove/reorder fields, multi-section
|
|
40
|
+
identity; deferred from the phased-flatten work.
|
|
41
|
+
- **eco-helpers** — farmers must `include OozeRedirect` (else hits the dead v2 server);
|
|
42
|
+
`submit!` must pass `stageId` + map `force:` → `forced_complete:` (the gem now supports
|
|
43
|
+
`forced_complete:`; eco-helpers draft in progress).
|
|
44
|
+
- **cans dedup rework** — membranes previews carry no field values (customer script).
|
|
45
|
+
- **Release/pin the `pages` branch — HARD PREREQUISITE.** Released 1.3.4 lacks `base/page/`;
|
|
46
|
+
FieldPatches silently no-op against it.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
> Audited 2026-06-28 (background pass). Gem `pages` branch + eco-helpers OozeRedirect.
|
|
51
|
+
> Two compat layers: the **gem** (`Compat::Pages`/`Registers` + native `DataField` DSL) and
|
|
52
|
+
> **eco-helpers `OozeRedirect`** (`FieldPatches.apply!` monkey-patches the gem field classes
|
|
53
|
+
> to add the v2-API methods `select`/`values`/`options`, CrossRef `add`/`clear`/`reference_ids`,
|
|
54
|
+
> dirty `people_ids <<`, `submit!`, and the v2 `===` dispatch). The v2-API field methods come
|
|
55
|
+
> from FieldPatches, NOT the gem. Memory: [[project-apiv2-cutover-usecases]].
|
|
56
|
+
|
|
57
|
+
## Cross-cutting facts (verified)
|
|
58
|
+
- `session.api(version: :oozes)` → `:v2` → **dead v2 server** unless `OozeRedirect#api_v2/apiv2`
|
|
59
|
+
aliases it to `graphql`. Only classes that `include OozeRedirect` get the redirect.
|
|
60
|
+
- `Collection#get_by_name` took **one arg** (no `type:`) — **FIXED 2026-06-28** (added `type:`).
|
|
61
|
+
- **Phased write-path identity risk (HIGH)** — **RESOLVED 2026-06-29** (see Update block).
|
|
62
|
+
*Original concern:* `DataField.new`/`Section.new` `.dup` their raw doc; a phased page builds
|
|
63
|
+
TWO independent `DataField::Collection`s (flat `page.field_collection` vs `Stage#components`
|
|
64
|
+
→ `sections.components`), so mutating a field from `stage.components` might not reach the page
|
|
65
|
+
update payload. *Outcome:* `compat_v2/page/stage_write` confirms a value set via
|
|
66
|
+
`stage.components` now persists through `updatePage`. cans + toocs `with_fields` writes reach
|
|
67
|
+
the payload.
|
|
68
|
+
|
|
69
|
+
## Per-use-case status
|
|
70
|
+
**farmers / supplier_documents** (`Custom::UseCase`, **no OozeRedirect**, no stages):
|
|
71
|
+
- 🔴 `api_v2 = session.api(version: :oozes)` → dead v2 server (no redirect). **Biggest gap** —
|
|
72
|
+
`include OozeRedirect` or switch to `session.api(version: :graphql)`. Despite the old "do
|
|
73
|
+
FIRST / most compat-friendly" note, farmers is the **least ready** (bypasses OozeRedirect).
|
|
74
|
+
- 🟠 `options_filter` → `one_of`/`none_of` now **translated** in FilterTranslator (commit 7725f96);
|
|
75
|
+
needs LIVE validation against a real `registers.search` (8.3).
|
|
76
|
+
- 🔴 Select `.values`/`.select`, CrossRef `.add` — FieldPatches-only; won't load for a
|
|
77
|
+
non-OozeRedirect class → NoMethodError.
|
|
78
|
+
- ✅ (now) `get_by_name(..., type:)` — gem fix landed.
|
|
79
|
+
- ✅ `registers.search` date_filter, `pages.get`/`get_new`/`create`/`update` (flat).
|
|
80
|
+
- ✅ Field value round-trips (PlainText/Number/Select/People/CrossRef) — LIVE-GREEN 2026-06-29.
|
|
81
|
+
|
|
82
|
+
**jamestrong / cans_upsert** (`OozeSamples::TargetOozesUpdateCase`, includes OozeRedirect, phased 'Details'):
|
|
83
|
+
- 🟠 `text_filter` → `match_filter` now **translated** (commit 7725f96); needs LIVE validation (8.3).
|
|
84
|
+
- 🔴 dedup via `page_result.membranes` — previews carry no field values; rework to fetch full
|
|
85
|
+
page per candidate or server-side filter.
|
|
86
|
+
- 🟠 `submit!` sent with no `stageId` (script submits a specific stage) — eco-helpers must pass
|
|
87
|
+
`stageId`; draft in progress. (Stage *completion* mechanics now confirmed — see ✅.)
|
|
88
|
+
- ✅ **phased write-path identity** — RESOLVED 2026-06-29 (`stage.components` writes persist via
|
|
89
|
+
`updatePage`; `compat_v2/page/stage_write`).
|
|
90
|
+
- ✅ `submit!`/stage completion mechanics — confirmed 2026-06-29:
|
|
91
|
+
`updatePage(submit: true, task: { completePageTask: { signOff: true } })` advances a
|
|
92
|
+
review-task stage (`compat_v2/page/submit_signoff_on_create`).
|
|
93
|
+
- ✅ search query, stage lookup, v2 `===` dispatch, PlainText/Number `value=`, Select
|
|
94
|
+
`select`/`values`/`options` (live-validated).
|
|
95
|
+
|
|
96
|
+
**act-gov / toocs_coding** (`OozeSamples::TargetOozesUpdateCase`, includes OozeRedirect, phased 'Coding'):
|
|
97
|
+
- ✅ People `people_ids <<` + CrossRef `add`/`clear` — **VALIDATED LIVE 2026-06-29** (the
|
|
98
|
+
previously-skipped array writes; full mini suite 35/35).
|
|
99
|
+
- 🟠 `submit!(force: true)` — gem now supports `forced_complete:` (via
|
|
100
|
+
`from_model(complete_page_task: { forced_complete: })`); eco-helpers still needs to map
|
|
101
|
+
`force:` → `forced_complete:` and pass `stageId`. Draft in progress.
|
|
102
|
+
- ✅ **phased write-path identity** — RESOLVED 2026-06-29 (same fix as cans; `stage_write`).
|
|
103
|
+
- ✅ v2 `===` (People/CrossRef), CrossRef `reference_ids`/`clear`, stage lookup.
|
|
104
|
+
|
|
105
|
+
## Prioritized remaining work
|
|
106
|
+
|
|
107
|
+
> Re-prioritized 2026-06-29. The old P0 gem blockers (phased write-path identity, value
|
|
108
|
+
> round-trips, submit!/stage advance) are RESOLVED & live-green. What remains is mostly
|
|
109
|
+
> validation, eco-helpers/script wiring, and the release gate.
|
|
110
|
+
|
|
111
|
+
**P0 (blockers):**
|
|
112
|
+
1. **Release/pin `pages`** — released 1.3.4 lacks `base/page/`; FieldPatches silently no-op.
|
|
113
|
+
**HARD PREREQUISITE** for everything downstream.
|
|
114
|
+
2. **farmers** — wire `include OozeRedirect` (or `session.api(version: :graphql)`) so it stops
|
|
115
|
+
hitting the dead v2 server. (script/eco-helpers)
|
|
116
|
+
|
|
117
|
+
**P0 — RESOLVED 2026-06-29 (kept for history):**
|
|
118
|
+
- ✅ **Phased write-path identity** — `stage.components` mutations now reach `updatePage`
|
|
119
|
+
(cans+toocs); validated `compat_v2/page/stage_write`. Was "most important gem fix".
|
|
120
|
+
- ✅ **Field value round-trips (8.1)** — PlainText/Number/Select/People/CrossRef live-green.
|
|
121
|
+
- ✅ **`submit!`/stage completion (8.2)** — review-task stage advances via inline sign-off.
|
|
122
|
+
|
|
123
|
+
**P1 (functional gaps / validation):**
|
|
124
|
+
3. ✅ `Collection#get_by_name(type:)` — DONE 2026-06-28.
|
|
125
|
+
4. ✅ `FilterTranslator`: `text_filter`→`match_filter`, `options_filter`→`one_of`/`none_of`
|
|
126
|
+
— LANDED 2026-06-29 (commit 7725f96). **Now a validation item, not a code gap:** LIVE-validate
|
|
127
|
+
against a real `registers.search` (8.3). `compat/filter_translator.rb`.
|
|
128
|
+
5. **BasicPage reads (8.4)** — add `... on BasicPage { sections }` to `CommonPageUnion`.
|
|
129
|
+
IN PROGRESS on branch `cutover/basicpage-sections`.
|
|
130
|
+
6. **Gem RSpec read-path regression specs (8.6)** — IN PROGRESS on branch
|
|
131
|
+
`cutover/regression-specs-8-6`.
|
|
132
|
+
7. **Collection-level write review (8.7)** — add/remove/reorder fields, multi-section identity.
|
|
133
|
+
8. cans dedup rework (membranes → full-page fetch / server-side filter). (script)
|
|
134
|
+
9. eco-helpers `submit!` — pass `stageId` + map `force:` → `forced_complete:` (gem supports it).
|
|
135
|
+
Draft in progress.
|
|
136
|
+
|
|
137
|
+
**P2 (validate coded-but-untested):** ✅ People `<<` + CrossRef `add`/`clear` array writes
|
|
138
|
+
— VALIDATED LIVE 2026-06-29 (mini suite 35/35). Remaining P2 validation = search filters
|
|
139
|
+
live (8.3, folded into P1#4 above).
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Project: Dynamic / Auto-generated GraphQL Models
|
|
2
|
+
|
|
3
|
+
**Created:** 2026-06-05
|
|
4
|
+
**Status:** idea — not started
|
|
5
|
+
**Depends on:** `ecoportal-api-v2-doublemodel-review` project (DoubleModel must be stable first)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Goal
|
|
10
|
+
|
|
11
|
+
Explore generating the `ecoportal-api-graphql` model layer from the GraphQL schema, rather
|
|
12
|
+
than hand-authoring Ruby classes for every type. Two variants to evaluate:
|
|
13
|
+
|
|
14
|
+
- **Static generation** — run a generator at gem-build time (or as a developer task) that
|
|
15
|
+
produces Ruby source files from schema introspection. Output is committed and readable.
|
|
16
|
+
- **Dynamic generation** — generate model classes at Ruby load time (per execution), from
|
|
17
|
+
the live schema or a cached schema file.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Motivation
|
|
22
|
+
|
|
23
|
+
The current hand-authored model layer requires manual updates whenever the ecoPortal GraphQL
|
|
24
|
+
schema evolves. Auto-generation would eliminate that maintenance burden and make the client
|
|
25
|
+
automatically up to date with the schema.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Hard Constraints
|
|
30
|
+
|
|
31
|
+
These are non-negotiable design requirements, arising from how the `ecoportal-api-*` gem
|
|
32
|
+
family is used in practice:
|
|
33
|
+
|
|
34
|
+
### 1. Transparency to the source of backend issues
|
|
35
|
+
|
|
36
|
+
The `ecoportal-api-*` gems are deliberately designed so that when an ecoPortal backend
|
|
37
|
+
returns an unexpected response, the problem is easy to trace — there is static code to
|
|
38
|
+
read and point to. Integration teams and the engineering team both rely on this to avoid
|
|
39
|
+
prolonged debates about whether a bug is client-side or server-side.
|
|
40
|
+
|
|
41
|
+
Any model generation approach must preserve this traceability. Concretely:
|
|
42
|
+
|
|
43
|
+
- A generated (or dynamically created) model class must produce a log entry (at an
|
|
44
|
+
appropriate level) when it encounters a field it did not expect, or when a field it
|
|
45
|
+
expected is absent from the response.
|
|
46
|
+
- Silent field drops, silent type coercions, and silent diff misses are not acceptable.
|
|
47
|
+
- Where auto-generation is used, there must be a deterministic and inspectable record
|
|
48
|
+
of what was generated and from which schema version — ideally committed source files
|
|
49
|
+
for the static variant, or a structured schema-version log for the dynamic variant.
|
|
50
|
+
|
|
51
|
+
### 2. Integration with `ecoportal-api-v2` DoubleModel
|
|
52
|
+
|
|
53
|
+
The `as_update` / `as_input` diff pipeline relies on the `DoubleModel` contract:
|
|
54
|
+
`doc` (current state), `original_doc` (server-confirmed state), `initial_doc` (state
|
|
55
|
+
at render time). Auto-generated models must honour this contract fully — including
|
|
56
|
+
cascaded diff, `root?` / `read_only?` semantics, and `patch_ver` propagation.
|
|
57
|
+
|
|
58
|
+
This is why this project depends on the DoubleModel review being complete first: the
|
|
59
|
+
contract must be stable and well-specified before we try to generate classes that
|
|
60
|
+
implement it.
|
|
61
|
+
|
|
62
|
+
### 3. Render-to-mutation conversion gap
|
|
63
|
+
|
|
64
|
+
GraphQL schema definitions cannot express how a render model converts to a mutation
|
|
65
|
+
input model. This is a permanent gap in the GraphQL specification. Any model generation
|
|
66
|
+
approach must either:
|
|
67
|
+
- Generate the render model only, leaving mutation input classes hand-authored (acceptable),
|
|
68
|
+
- Or provide a deterministic, scriptable convention for deriving mutation input shapes
|
|
69
|
+
from render models — not an AI-generated approximation.
|
|
70
|
+
|
|
71
|
+
Ad-hoc or AI-generated conversion code is not acceptable as the primary mechanism here,
|
|
72
|
+
because it cannot be deterministically verified.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Open Questions
|
|
77
|
+
|
|
78
|
+
- Static vs dynamic: the dynamic variant is technically more interesting but harder to
|
|
79
|
+
debug when a field silently misroutes a diff. Static generation + commit is more
|
|
80
|
+
transparent. Which is the right default?
|
|
81
|
+
- Can the `DoubleModel` contract be expressed as a generator template robustly enough
|
|
82
|
+
to produce correct `doc` / `original_doc` handling for Array-indexed (CollectionModel)
|
|
83
|
+
paths? This is likely the hardest part.
|
|
84
|
+
- How do we handle schema evolution between gem releases? Version-lock the schema file?
|
|
85
|
+
Validate at load time?
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Out of scope until DoubleModel review is complete
|
|
90
|
+
|
|
91
|
+
Do not begin design or implementation of this project until
|
|
92
|
+
`.ai-assistance/projects/ecoportal-api-v2-doublemodel-review` reaches a stable conclusion
|
|
93
|
+
on the `doc` memoization and sync semantics.
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# Project: eco-helpers GraphQL Compat Layer
|
|
2
|
+
|
|
3
|
+
**Created:** 2026-06-07
|
|
4
|
+
**Status:** Starting — URGENT (APIv2 retires in ~3 weeks)
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Goal
|
|
9
|
+
|
|
10
|
+
Existing eco-helpers scripts work against `ecoportal-api-v2` (REST). They must continue
|
|
11
|
+
to work against `ecoportal-api-graphql` (GraphQL) **without changing one line of script code**
|
|
12
|
+
related to pages.
|
|
13
|
+
|
|
14
|
+
The compat layer wraps `Ecoportal::API::GraphQL` and exposes the same interface that
|
|
15
|
+
eco-helpers scripts currently call against `Ecoportal::API::V2`.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## eco-helpers API Surface (audited 2026-06-07)
|
|
20
|
+
|
|
21
|
+
### Pages
|
|
22
|
+
|
|
23
|
+
| v2 call | Description | GraphQL equivalent |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| `apiv2.pages.get(id)` | Fetch page by ID | `Query::Page.new(client).query(id: id)` |
|
|
26
|
+
| `apiv2.pages.get_new(template_id)` | Build draft from template | `Mutation::Page::BuildFromTemplate` (via `buildPageFromTemplate`) |
|
|
27
|
+
| `apiv2.pages.create(page, from: template_id)` | Create from filled draft | `Mutation::Page::CreateFromTemplate` |
|
|
28
|
+
| `apiv2.pages.update(page)` | Update changed page | `Mutation::Page::Update` with `Input::Page::Update.from_model` |
|
|
29
|
+
| `apiv2.pages.get_body(page)` | Get patch doc of changes | `page.as_update` |
|
|
30
|
+
|
|
31
|
+
### Registers / Search
|
|
32
|
+
|
|
33
|
+
| v2 call | Description | GraphQL equivalent |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `apiv2.registers.search(register_id, opts) { \|r\| }` | Paginated search | `Query::RegisterPreviewPages` (fast/ES) for existence; org search for full data |
|
|
36
|
+
|
|
37
|
+
Search options v2 → GraphQL mapping:
|
|
38
|
+
- `sort: 'created_at'`, `dir: 'asc'` → `SearchConf.new.sort(:created_at, :asc)`
|
|
39
|
+
- `query: text` → `SearchConf.new.query(text)`
|
|
40
|
+
- `filters: [...]` → `SearchConf` with appropriate filter objects
|
|
41
|
+
|
|
42
|
+
### Page object API
|
|
43
|
+
|
|
44
|
+
| v2 accessor | v2 type | GraphQL equivalent |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `.id` | String | `Model::Page::Basic#id` |
|
|
47
|
+
| `.state` | String | `#state` |
|
|
48
|
+
| `.template_id` | String | `#sourceTemplateId` |
|
|
49
|
+
| `.created_at` | String | `#createdAt` |
|
|
50
|
+
| `.updated_at` | String | `#updatedAt` |
|
|
51
|
+
| `.stages?` | Boolean | `#stages.any?` |
|
|
52
|
+
| `.current_stage_id` | String | `Model::Page::Phased#currentStage.id` |
|
|
53
|
+
| `.stages` | Collection | `#stages` |
|
|
54
|
+
| `.stages.get_by_name(name)` | Stage | filtered stages |
|
|
55
|
+
| `.sections` | Collection | stage `.sections` or BasicPage `.sections` |
|
|
56
|
+
| `.components` | Collection | sections → dataFields (APIv2 name for fields) |
|
|
57
|
+
| `.tags` | Array | `#otherTags` (or `#baseTags` for base tags) |
|
|
58
|
+
| `.base_tags` | Array | `#baseTags` |
|
|
59
|
+
| `.external_id` | String | `#externalId` |
|
|
60
|
+
| `.validate` | String or nil | custom validation (not in GraphQL schema) |
|
|
61
|
+
| `page.consolidate!` | void | `page.original_doc = page.doc.dup` (reset dirty tracking) |
|
|
62
|
+
|
|
63
|
+
### Dirty state tracking
|
|
64
|
+
|
|
65
|
+
v2 uses `dirty?(page)` which checks if `patch_doc(page)['page']` is non-empty.
|
|
66
|
+
GraphQL uses `page.as_update` — returns nil if no changes, hash if changed.
|
|
67
|
+
|
|
68
|
+
Equivalence:
|
|
69
|
+
```ruby
|
|
70
|
+
# v2
|
|
71
|
+
dirty?(page)
|
|
72
|
+
# GraphQL compat
|
|
73
|
+
!page.as_update.nil?
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Response objects
|
|
77
|
+
|
|
78
|
+
| v2 | GraphQL |
|
|
79
|
+
|---|---|
|
|
80
|
+
| `response.success?` | `payload.success?` |
|
|
81
|
+
| `response.status` | `payload.error? ? :error : :ok` |
|
|
82
|
+
| `response.body` | `payload.error_doc` |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Design: CompatPages and CompatRegisters
|
|
87
|
+
|
|
88
|
+
Two wrapper objects that expose the v2-compatible interface:
|
|
89
|
+
|
|
90
|
+
```ruby
|
|
91
|
+
module Ecoportal::API::GraphQL::Compat
|
|
92
|
+
class Pages
|
|
93
|
+
def initialize(client); @client = client; end
|
|
94
|
+
def get(id, **kargs) = ...
|
|
95
|
+
def get_new(template_id) = ...
|
|
96
|
+
def create(page, from:) = ...
|
|
97
|
+
def update(page) = ...
|
|
98
|
+
def get_body(page) = page.as_update
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
class Registers
|
|
102
|
+
def initialize(client); @client = client; end
|
|
103
|
+
def search(register_id, options = {}, &block) = ...
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
And on the top-level `Ecoportal::API::GraphQL` class:
|
|
109
|
+
```ruby
|
|
110
|
+
def pages = Compat::Pages.new(client)
|
|
111
|
+
def registers = Compat::Registers.new(client)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Key constraints:**
|
|
115
|
+
- `pages.get` must return an object that responds to all page accessors above
|
|
116
|
+
- `pages.create` must return a reference object with `.page_id` and `.active_stage_id`
|
|
117
|
+
- `page.consolidate!` must reset dirty state
|
|
118
|
+
- `registers.search` must yield results in the same shape as v2 (block with `.id`)
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Architectural Differences: APIv2 vs GraphQL (critical for compat)
|
|
123
|
+
|
|
124
|
+
### Stage rendering and updating
|
|
125
|
+
|
|
126
|
+
**APIv2:** Instance pages (pages with stages) are rendered ONE STAGE PER REQUEST.
|
|
127
|
+
Every `pages.get(id, stage_id:)` call fetches a single stage view. Updating is also
|
|
128
|
+
done per-stage. This is a known limitation.
|
|
129
|
+
|
|
130
|
+
**GraphQL:** Fetches the full page in one request. Can update all stages at once via
|
|
131
|
+
`updatePage`. Can also do stage-specific updates via `stageId` in `UpdatePageInput`.
|
|
132
|
+
|
|
133
|
+
**Implication for compat:**
|
|
134
|
+
- eco-helpers `RegisterUpdate` loops through stages by fetching each one. In GraphQL
|
|
135
|
+
compat, we fetch the full page once and let the script work on a client-side stage view.
|
|
136
|
+
- Stage-specific submit (e.g. close-out stage N to trigger fill-in task on stage N+1)
|
|
137
|
+
STILL requires `stageId` in the GraphQL mutation. The submit trigger (creating/starting
|
|
138
|
+
the next fill-in task) is server-side logic keyed on `stageId`.
|
|
139
|
+
- `Compat::Pages#get(id, stage_id:)` currently ignores `stage_id` — this is a GAP.
|
|
140
|
+
A future improvement: if `stage_id` is provided, filter the returned page to show only
|
|
141
|
+
that stage's fields. But the mutation must still include `stageId`.
|
|
142
|
+
|
|
143
|
+
### Stage permissions
|
|
144
|
+
|
|
145
|
+
**APIv2:** Per-stage permissions enforced at fetch time — requesting a forbidden stage
|
|
146
|
+
returns no data or an error.
|
|
147
|
+
|
|
148
|
+
**GraphQL:** Stage data is included or excluded silently based on permissions — no
|
|
149
|
+
access errors, just reduced data. A stage the user can't access simply won't appear in
|
|
150
|
+
`stages` or `stagesIndex`. (Needs double-check with Engineering.)
|
|
151
|
+
|
|
152
|
+
**Implication:** Scripts that rely on access errors from APIv2 to detect permission
|
|
153
|
+
boundaries may not get the same signal from GraphQL. Scripts should check whether the
|
|
154
|
+
stage they expect is present in the response.
|
|
155
|
+
|
|
156
|
+
### `as_update` usage in eco-helpers
|
|
157
|
+
|
|
158
|
+
`as_update` is called in eco-helpers for two purposes:
|
|
159
|
+
1. **Simulate/dry_run mode:** Print what would change without sending the request.
|
|
160
|
+
2. **Dirty detection:** `dirty?(page)` = `!page.as_update.nil?` (v2 pattern).
|
|
161
|
+
|
|
162
|
+
Our compat `dirty?` already delegates to `as_update` via `PageCompat`. ✓
|
|
163
|
+
|
|
164
|
+
For simulate mode: when `graphql.pages.update(page)` is called in dry_run mode,
|
|
165
|
+
eco-helpers should call `pages.get_body(page)` (= `page.as_update`) and display the
|
|
166
|
+
diff without making the HTTP request.
|
|
167
|
+
|
|
168
|
+
### `add_component` / `add_field` gap
|
|
169
|
+
|
|
170
|
+
APIv2 allows adding NEW fields to a page via `components.add(...)`. In GraphQL,
|
|
171
|
+
`updatePage` has `dataFields: { additions: [DataFieldInput], updates: [...], deletions: [ID] }`.
|
|
172
|
+
We implemented `updates` only. `additions` is not yet supported in the compat layer.
|
|
173
|
+
|
|
174
|
+
**Consequence:** Scripts that call `add_field` or `components.add` will not work yet.
|
|
175
|
+
This is a known gap. Document it for the integration test phase.
|
|
176
|
+
|
|
177
|
+
### `apiv2.pages.create|update` redirect
|
|
178
|
+
|
|
179
|
+
The eco-helpers `Eco::API::Session` manages an `apiv2` object. Redirecting to GraphQL
|
|
180
|
+
requires swapping the `apiv2` session backend without changing scripts. Two approaches:
|
|
181
|
+
|
|
182
|
+
1. **Session-level swap (eco-helpers):** Override `apiv2.pages` and `apiv2.registers`
|
|
183
|
+
in the eco-helpers session to return the GraphQL compat objects. Scripts are unchanged.
|
|
184
|
+
This is the cleanest approach for the 3-week deadline.
|
|
185
|
+
|
|
186
|
+
2. **Proxy class:** Create `Ecoportal::API::GraphQL::V2Proxy` that mimics the full V2
|
|
187
|
+
API surface. Assign this as the session backend when GraphQL mode is active.
|
|
188
|
+
|
|
189
|
+
The GraphQL gem already provides `graphql.pages` and `graphql.registers`. The eco-helpers
|
|
190
|
+
change is only in how the session wires the backend — NOT in the scripts themselves.
|
|
191
|
+
|
|
192
|
+
### Template updates
|
|
193
|
+
|
|
194
|
+
Engineering does NOT want template updates via GraphQL currently — templates are still
|
|
195
|
+
managed via the old AngularJS front-end. Do NOT expose template mutation endpoints from
|
|
196
|
+
the compat layer. `Query::Templates` (read-only list) is fine. Mutations against templates
|
|
197
|
+
should be blocked or at minimum undocumented.
|
|
198
|
+
|
|
199
|
+
### Forces (AngularJS front-end snippets)
|
|
200
|
+
|
|
201
|
+
Forces are embedded front-end code snippets that attach to specific stages based on
|
|
202
|
+
their bindings. They are being REPLACED by the Workflow Builder (see below). Low priority
|
|
203
|
+
for scripting integration. Forces are not queryable/mutable via GraphQL in a meaningful way.
|
|
204
|
+
|
|
205
|
+
### Workflow Builder (in progress, high change velocity)
|
|
206
|
+
|
|
207
|
+
The Workflow Builder (`pagesWorkflow`) allows configuring automated behaviours:
|
|
208
|
+
- Deployed: notifications, auto page creation, task assignments
|
|
209
|
+
- Not yet deployed: conditional field/section workflows (show/hide sections based on
|
|
210
|
+
field values, computed risk ratings, gauge/select interdependencies)
|
|
211
|
+
- Recently refactored (quick fixes via CI/CD for new customers)
|
|
212
|
+
|
|
213
|
+
**Implication for scripting:** Workflow Builder operations are not part of the
|
|
214
|
+
eco-helpers compat scope. However, scripts must be aware that workflow triggers
|
|
215
|
+
(task creation, stage transitions) can fire as side effects of `updatePage`.
|
|
216
|
+
|
|
217
|
+
### DSL location decision (confirmed 2026-06-07)
|
|
218
|
+
|
|
219
|
+
The compat DSL (page accessors, `components`, `stages[name]`, `consolidate!`, etc.)
|
|
220
|
+
sits in `ecoportal-api-graphql` as concerns included on page models. This is correct
|
|
221
|
+
because these are upstream-dependency concerns of this gem.
|
|
222
|
+
|
|
223
|
+
The eco-helpers `OozeBase` / `RegisterUpdate` inheritance chain will transparently
|
|
224
|
+
use the GraphQL-backed models once the session backend is swapped. No script code changes.
|
|
225
|
+
|
|
226
|
+
However: some DSL methods (`add_field`, `add_component`, stage-specific submit) may
|
|
227
|
+
need to live in eco-helpers itself if they cannot be cleanly expressed at the gem level.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Open Questions (Resolved 2026-06-07)
|
|
232
|
+
|
|
233
|
+
1. ✓ Filter format: translated in `Compat::Registers` (date_filter lbound/ubound → gte/lte)
|
|
234
|
+
2. ✓ Components naming: `components` aliased to `field_collection` via `DataFieldAccess`
|
|
235
|
+
3. ✓ `get_new` shape: `buildFromTemplate` returns full page with field IDs via `CommonPageUnion`
|
|
236
|
+
4. ✓ Stage access: `StageCollection` wrapper provides `[]`, `get_by_name`, `ordered`
|
|
237
|
+
5. Script repo access: pending `.claude/settings.json` rules configuration
|
|
238
|
+
|
|
239
|
+
## Remaining Gaps
|
|
240
|
+
|
|
241
|
+
- `stage_id` in `pages.get` currently ignored — stage-specific view not filtered client-side
|
|
242
|
+
- `stageId` in `updatePage` not yet passed through compat — needed for stage submit/close-out
|
|
243
|
+
- `add_field` / `add_component` (dataFields.additions) not implemented
|
|
244
|
+
- Stage-specific permissions may behave differently (silent omission vs error)
|