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,161 @@
|
|
|
1
|
+
# Decisions — Ooze → Native GraphQL Migration
|
|
2
|
+
|
|
3
|
+
Seeded with the founding architectural decisions. Append per-case parity results and any
|
|
4
|
+
new decisions as the project executes. Never delete entries — history matters.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## [2026-06-30] Strangler-fig migration, one case at a time
|
|
9
|
+
|
|
10
|
+
**Context:** The ooze use-case stack runs on APIv2 via the `OozeRedirect` runtime shim. We
|
|
11
|
+
need it on native GraphQL, but a big-bang rewrite would (a) risk all live customer scripts
|
|
12
|
+
at once and (b) collide with the in-flight `fix/ooze-redirect-faithful-dryrun` work.
|
|
13
|
+
|
|
14
|
+
**Options considered:**
|
|
15
|
+
1. Big-bang rewrite of the whole ooze tree.
|
|
16
|
+
2. Keep the shim indefinitely.
|
|
17
|
+
3. Strangler-fig: build native classes beside the old ones, migrate one case at a time,
|
|
18
|
+
each parity-gated, retiring shim code incrementally.
|
|
19
|
+
|
|
20
|
+
**Decision:** Option 3 (strangler-fig), sequenced parent-before-child along the inheritance
|
|
21
|
+
tree, gated by the A/B parity harness per case.
|
|
22
|
+
|
|
23
|
+
**Reason:** Incremental, reversible, keeps live scripts working throughout, and lets us
|
|
24
|
+
delete shim code in safe slices instead of one terrifying commit.
|
|
25
|
+
|
|
26
|
+
**Consequences:** Old and new implementations coexist for the duration; the inventory
|
|
27
|
+
partition (Phase 0) is the master schedule; each phase has an explicit parity gate.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## [2026-06-30] Native classes are the REAL implementation — NOT a monkeypatch
|
|
32
|
+
|
|
33
|
+
**Context:** The current approach (`OozeRedirect.included` → `FieldPatches.apply!` +
|
|
34
|
+
`base.prepend(Infrastructure)`) is a monkeypatch: it reopens v2 field classes globally and
|
|
35
|
+
prepends behaviour onto the host case. The developer explicitly corrected the design:
|
|
36
|
+
**do NOT keep reopening/patching classes ("patch at the end of each class").**
|
|
37
|
+
|
|
38
|
+
**Options considered:**
|
|
39
|
+
1. Continue patching: make the GraphQL/samples classes by reopening the OozeSamples classes.
|
|
40
|
+
2. Make the new `graphql/samples/pages/*` classes the canonical implementation; old names
|
|
41
|
+
become thin subclasses/delegators.
|
|
42
|
+
|
|
43
|
+
**Decision:** Option 2. The native `GraphQL::Samples::Pages::*` class holds the real logic.
|
|
44
|
+
`Eco::API::UseCases::OozeSamples::*` names are redefined as thin subclasses (or delegators)
|
|
45
|
+
of the native class.
|
|
46
|
+
|
|
47
|
+
**Reason:** Monkeypatching is what produced the 2026-06-30 KPI/dry-run-loss bug (a patched
|
|
48
|
+
control-flow method silently diverged from the base loop). A real class with an explicit
|
|
49
|
+
loop has one source of truth and is testable in isolation. Subclassing is a stable,
|
|
50
|
+
well-understood compatibility idiom; runtime class reopening is not.
|
|
51
|
+
|
|
52
|
+
**Consequences:** `FieldPatches`' global v2-class reopening (`patch_v2_type_dispatch!`) and
|
|
53
|
+
the GraphQL field `prepend`s become unnecessary — native cases dispatch on GraphQL types
|
|
54
|
+
directly. They are removed as the last case needing them is flipped (Phase 7).
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## [2026-06-30] Preserve the OozeSamples public class names as the BC surface
|
|
59
|
+
|
|
60
|
+
**Context:** Downstream customer scripts subclass/include the public names
|
|
61
|
+
(`OozeSamples::TargetOozesUpdateCase`, `RegisterUpdateCase`, `Helpers::Creatable`,
|
|
62
|
+
`RegisterExportCase`, etc.) and define override points (`process_ooze`, `search`,
|
|
63
|
+
`filters`, `custom_processing`, `excluded_field_hooks`). The include-shim's whole value is
|
|
64
|
+
that scripts change **nothing** today.
|
|
65
|
+
|
|
66
|
+
**Decision:** The public `OozeSamples::*` / `OozeCases::*` names, their `name '...'`
|
|
67
|
+
registrations, `type :other`, class-level `batch_size`/`register_id`, attr_readers, and
|
|
68
|
+
every documented override point are **preserved exactly**. They resolve to the native
|
|
69
|
+
implementation via subclass/delegation.
|
|
70
|
+
|
|
71
|
+
**Reason:** Zero-script-edit is the explicit success criterion. The names are the contract.
|
|
72
|
+
|
|
73
|
+
**Consequences:** Phase 0 must inventory every include/subclass site and override-method
|
|
74
|
+
set so the native classes expose identical surfaces. Any unavoidable script edit is a goal
|
|
75
|
+
regression → log here and confirm with Oscar before proceeding.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## [2026-06-30] Per-case parity gating via the A/B harness before flipping
|
|
80
|
+
|
|
81
|
+
**Context:** Each migrated case changes the execution backend for real customer data. We
|
|
82
|
+
need objective proof of equivalence before flipping the public name.
|
|
83
|
+
|
|
84
|
+
**Decision:** Before flipping any old name to the native class, the case must be
|
|
85
|
+
**parity-proven** against the existing v2 case using the team's A/B parity harness on the
|
|
86
|
+
`mini` test org (read-only parity first, then writes). The recorded result is the gate.
|
|
87
|
+
|
|
88
|
+
**Reference:** memory `project-parity-test-plan` — all-21-DataField-type template in `mini`,
|
|
89
|
+
(1) A/B standalone harness (e.g. `mini/graphql_parity/`) reading/writing through both
|
|
90
|
+
`ecoportal-api-v2` and `Ecoportal::API::GraphQL` + `Compat::Pages`, diffed by the field
|
|
91
|
+
matrix; (2) eco-helpers session-backend swap re-running a real script unchanged. Also
|
|
92
|
+
`.ai-assistance/projects/eco-helpers-compat/`.
|
|
93
|
+
|
|
94
|
+
**Reason:** The 21-type field matrix gives a concrete pass/fail spec; the live-script swap
|
|
95
|
+
proves the production path. Cheaper than discovering divergence in a customer run.
|
|
96
|
+
|
|
97
|
+
**Consequences:** Phase 0 captures v2 baselines (the "A" side); the harness must exist
|
|
98
|
+
before Phase 2 (built in Phase 0 if not). Each phase records its parity result as a dated
|
|
99
|
+
entry in this log.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## [2026-06-30] Sequence: RegisterUpdateCase + Creatable, then TargetOozesUpdateCase, first
|
|
104
|
+
|
|
105
|
+
**Context:** Two cases are already exercised in the live cutover: act-gov TOOCS coding
|
|
106
|
+
(`TargetOozesUpdateCase`) and jamestrong CANS upsert (`RegisterUpdateCase` +
|
|
107
|
+
`Helpers::Creatable`). `TargetOozesUpdateCase` **inherits** `RegisterUpdateCase`.
|
|
108
|
+
|
|
109
|
+
**Decision:** Migrate the native register base + `Creatable` first (Phase 2, CANS), then
|
|
110
|
+
`TargetOozesUpdateCase` (Phase 3, TOOCS), because the child cannot be native until its
|
|
111
|
+
parent is.
|
|
112
|
+
|
|
113
|
+
**Reason:** Highest live value, and the inheritance order forces parent-first. These two
|
|
114
|
+
also surface the full KPI/queue/dedup/dry-run/submit machinery, de-risking later cases.
|
|
115
|
+
|
|
116
|
+
**Consequences:** Phase 1 (shared concerns) must land first so both cases stay thin.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## [2026-06-30] Forces-dependent cases are HELD pending a Phase 0 live readiness test (not assumed-blocked)
|
|
121
|
+
|
|
122
|
+
**Context (corrected 2026-06-30):** the GraphQL force endpoint is NOT read-only or missing —
|
|
123
|
+
the gem ships both `Query::PageWithForces` (read) AND `Mutation::Page::ExecuteForceCommands`
|
|
124
|
+
→ `executeWorkflowCommands` (write: `editForce`/`addBinding`/`removeBinding`/`removeForce`).
|
|
125
|
+
What is unconfirmed: `OozeRedirect.force_support?` is hard-wired `false`, and a (possibly stale)
|
|
126
|
+
`ooze_redirect.rb` comment claims `PageWithForces` fails schema validation / backend "in
|
|
127
|
+
progress". `ooze_redirect.rb` lists ~50% of all ooze cases as force-dependent.
|
|
128
|
+
|
|
129
|
+
**Decision:** Do NOT assume forces are blocked. Phase 0 **live-tests** read + a no-op write
|
|
130
|
+
against a real org. If it passes, forces are IN scope and those cases migrate normally. If it
|
|
131
|
+
fails, they are partitioned **"migratable now"** vs **"blocked on forces"** and stay on the v2
|
|
132
|
+
path; `force_compat.rb` / the v2 fallback is retained **only** for that holdout until the
|
|
133
|
+
endpoint is fixed.
|
|
134
|
+
|
|
135
|
+
**Blocked-on-forces seed list (from `ooze_redirect.rb`):** act-gov (5× `20240130_act_*`,
|
|
136
|
+
`rearrage_page_sites`), briscoes (`remove_induction_sections`, `310524_Briscoes_Remove_Tasks`),
|
|
137
|
+
chorus (4× `audit_update`), hcc (`update_enterprise_risk`), lic (`update_life_cycle_force`),
|
|
138
|
+
mitre10 (`rich_text_update`, `update_location_force`, `updating_template`), npdc
|
|
139
|
+
(`contractor_title_force`, `risk_titile_force`, `fix_title_syncing`, `reminder_date_fields`,
|
|
140
|
+
`10092024_NPDC_CP_Add_Force`), profile-group (`int_training_review`,
|
|
141
|
+
`20231026_profile_wellness`), turners-growers (`event_changes`, `inj_cost_calc`,
|
|
142
|
+
`remove_line_force`), twg (`hide_attached_risks`, `add_new_force`).
|
|
143
|
+
|
|
144
|
+
**Reason:** No endpoint = no native path. Forcing it would either break or require fetching
|
|
145
|
+
via the broken force query for every case (the exact trap `force_support?` guards against).
|
|
146
|
+
|
|
147
|
+
**Consequences:** This is a **hard external dependency**. The project completes "Phase 7"
|
|
148
|
+
with the forces holdout explicitly documented, not deleted. Track the endpoint's arrival as
|
|
149
|
+
the trigger for the follow-up forces-migration project.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Per-case parity results (append as completed)
|
|
154
|
+
|
|
155
|
+
<!-- Template:
|
|
156
|
+
## [DATE] Parity result — <CaseName>
|
|
157
|
+
**Harness run:** <link/path to A/B output, e.g. baselines/<case>.txt vs native run>
|
|
158
|
+
**Field matrix:** <pass/fail per relevant DataField type>
|
|
159
|
+
**Live script re-run:** <org/script, unchanged? parity?>
|
|
160
|
+
**Decision:** flip / hold / fix-first
|
|
161
|
+
-->
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Project: Ooze Use-Cases → Native GraphQL Migration (strangler-fig)
|
|
2
|
+
|
|
3
|
+
**Created:** 2026-06-30
|
|
4
|
+
**Status:** active
|
|
5
|
+
**Primary repo:** `eco-helpers` (`C:\ruby_scripts\git\eco-helpers`)
|
|
6
|
+
**Companion repo:** `ecoportal-api-graphql` (`C:\ruby_scripts\git\ecoportal-api-graphql`)
|
|
7
|
+
**Branch (eco-helpers):** `feature/ooze-graphql-native-migration` (cut from current `fix/ooze-redirect-faithful-dryrun` once that merges)
|
|
8
|
+
**Target branch:** `master` (eco-helpers) / `main` (gem)
|
|
9
|
+
|
|
10
|
+
> **Why this plan lives in the gem repo:** `eco-helpers` has no `.ai-assistance/projects/`
|
|
11
|
+
> folder. The team's project-cycle structure is hosted in `ecoportal-api-graphql`
|
|
12
|
+
> (alongside the related `eco-helpers-compat` project), so this plan is committed here
|
|
13
|
+
> for continuity. **The code work, however, is almost entirely in `eco-helpers`.**
|
|
14
|
+
> Cross-reference: `.ai-assistance/projects/eco-helpers-compat/` (the compat layer this
|
|
15
|
+
> migration eventually retires the *shim half* of).
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Goal
|
|
20
|
+
|
|
21
|
+
Migrate the eco-helpers **ooze use-case stack** off the transitional APIv2 `OozeRedirect`
|
|
22
|
+
monkeypatch shim and onto **native GraphQL use-case classes**, incrementally, one case at a
|
|
23
|
+
time, using a strangler-fig approach.
|
|
24
|
+
|
|
25
|
+
The new native implementations live under
|
|
26
|
+
`lib/eco/api/usecases/graphql/samples/pages/*` (cases) and
|
|
27
|
+
`lib/eco/api/usecases/graphql/helpers/pages/*` (shared concerns). The **existing public
|
|
28
|
+
class names** under `Eco::API::UseCases::OozeSamples::*` are preserved as the
|
|
29
|
+
backwards-compatibility surface — they become thin subclasses / delegators of the native
|
|
30
|
+
classes. Downstream customer scripts keep working with **zero edits**, exactly as the
|
|
31
|
+
include-shim achieves today.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Motivation
|
|
36
|
+
|
|
37
|
+
### The shim is fragile and lossy
|
|
38
|
+
|
|
39
|
+
`OozeRedirect` (`lib/eco/api/usecases/graphql/compat/ooze_redirect.rb` +
|
|
40
|
+
`ooze_redirect/{dirty_array,field_patches,force_compat}.rb`) is a **runtime monkeypatch**:
|
|
41
|
+
|
|
42
|
+
- `OozeRedirect.included(base)` calls `FieldPatches.apply!`, which **reopens** v2 field
|
|
43
|
+
classes (`PlainTextField`, `SelectionField`, `ReferenceField`, `PeopleField`,
|
|
44
|
+
`NumberField`) to make `===` / `is_a?` lie, and `prepend`s anonymous modules onto the
|
|
45
|
+
GraphQL field classes (`Base::Page::DataField::{People,CrossReference,Select}`) and
|
|
46
|
+
`Interface::BasePage`. These patches are **global, process-wide, and order-sensitive**.
|
|
47
|
+
- It then `base.prepend(Infrastructure)` to override instance methods on the host case.
|
|
48
|
+
|
|
49
|
+
**The recent bug (2026-06-30, captured in memory `session-handoff-ooze-redirect-dryrun`):**
|
|
50
|
+
an earlier version of the shim's `Infrastructure` module **replaced whole control-flow
|
|
51
|
+
methods** (`with_each_entry`, `update_ooze`, and wrapped `process_ooze`) rather than
|
|
52
|
+
adapting only the leaf v2 operations. Effects observed on the act-gov (toocs) and
|
|
53
|
+
jamestrong (cans) `-simulate` runs:
|
|
54
|
+
|
|
55
|
+
- KPI counters (Search / Retrieved / Updated / Created) all read **0** — the base loop's
|
|
56
|
+
increments were bypassed.
|
|
57
|
+
- The dry-run diff **never printed** — the compat `process_ooze` did `return if simulate?`
|
|
58
|
+
with no feedback, and the base `display_patch` / `backup_patch!` / `dirty?` read
|
|
59
|
+
`patch_doc(ooze)['page']` while the gem's `Compat::Pages#get_body` returned a **flat**
|
|
60
|
+
`as_update` (no `'page'` key) → `"No changes to update"` misfired.
|
|
61
|
+
|
|
62
|
+
That bug was patched on `fix/ooze-redirect-faithful-dryrun` by **slimming the shim back to
|
|
63
|
+
leaf adaptations and reusing the base loop** (gem: `get_body` → `{ 'page' => as_update }`
|
|
64
|
+
and `update` folds captured submit flags; eco-helpers: removed the control-flow overrides).
|
|
65
|
+
But the episode proves the structural point: **a monkeypatch that has to second-guess the
|
|
66
|
+
host class's control flow is intrinsically dangerous.** Every future change to the
|
|
67
|
+
OozeSamples base loop risks silently re-breaking the redirect, and vice-versa.
|
|
68
|
+
|
|
69
|
+
### Native classes are the durable answer
|
|
70
|
+
|
|
71
|
+
Making the **GraphQL samples the real implementation** — with their own explicit loop, KPI
|
|
72
|
+
tracking, dry-run feedback, and field access — removes the need to patch v2 classes or
|
|
73
|
+
intercept the host's control flow at all. The old names survive purely as a compatibility
|
|
74
|
+
veneer (subclass / delegate), which is a stable, well-understood Ruby idiom.
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Scope
|
|
79
|
+
|
|
80
|
+
### In scope
|
|
81
|
+
|
|
82
|
+
- New native GraphQL use-case classes under `lib/eco/api/usecases/graphql/samples/pages/*`,
|
|
83
|
+
mirroring the OozeSamples case tree (the **migratable-now** subset — see Risks).
|
|
84
|
+
- Shared concerns extracted to `lib/eco/api/usecases/graphql/helpers/pages/*`
|
|
85
|
+
(creatable, ooze-handlers, shortcuts, filters, rescuable, dirty/patch feedback).
|
|
86
|
+
- Specs **in eco-helpers** for each native counterpart, written **before/with** the class
|
|
87
|
+
(specs-first / parity-proving).
|
|
88
|
+
- Re-pointing the old `OozeSamples::*` names to delegate to / subclass the native classes,
|
|
89
|
+
**case by case**, behind per-case parity gating.
|
|
90
|
+
- Per-case removal of the now-dead redirect code (the relevant `Infrastructure` overrides
|
|
91
|
+
and `FieldPatches` entries) once a case is flipped.
|
|
92
|
+
- Final removal of the `OozeRedirect` shim entirely once all migratable cases are flipped.
|
|
93
|
+
|
|
94
|
+
### Out of scope (non-goals)
|
|
95
|
+
|
|
96
|
+
- **Force / binding-dependent cases.** ~50% of ooze cases use `target.forces` /
|
|
97
|
+
`force.bindings` / `force.custom_script`. The gem DOES ship GraphQL force client code for
|
|
98
|
+
both read (`Query::PageWithForces`) and write (`executeWorkflowCommands`:
|
|
99
|
+
`editForce`/`addBinding`/`removeBinding`/`removeForce`), but it is gated OFF
|
|
100
|
+
(`OozeRedirect.force_support?` hard-wired `false`) and end-to-end readiness is UNCONFIRMED.
|
|
101
|
+
These cases are **held pending a Phase 0 live readiness test** — in scope if it passes, on
|
|
102
|
+
the v2 path if it fails. See the Risks section.
|
|
103
|
+
- Rewriting customer scripts. Scripts must not change. If a script *must* change, that is a
|
|
104
|
+
decision to log in DECISIONS.md and confirm with Oscar — it is a regression of the goal.
|
|
105
|
+
- Template mutation, Workflow Builder, webhooks/subscriptions (separate projects).
|
|
106
|
+
- The `eco-helpers-compat` gem-side compat layer itself (`Compat::Pages`,
|
|
107
|
+
`Compat::Registers`, `StageView`) stays — the native cases call it. This project retires
|
|
108
|
+
the **OozeRedirect monkeypatch**, not the compat façade.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Success Criteria
|
|
113
|
+
|
|
114
|
+
1. `TargetOozesUpdateCase` and `RegisterUpdateCase` (+ `Helpers::Creatable`) run on native
|
|
115
|
+
GraphQL classes, parity-proven against the v2 path via the A/B harness, with the old
|
|
116
|
+
names still resolving and the two live cutover scripts (act-gov TOOCS, jamestrong CANS)
|
|
117
|
+
running **unchanged**.
|
|
118
|
+
2. Every migratable OozeSamples case has a native counterpart, a passing spec suite, and a
|
|
119
|
+
recorded parity result before its name is flipped.
|
|
120
|
+
3. The `OozeRedirect` shim (and its `FieldPatches` global monkeypatches) is **deleted** for
|
|
121
|
+
all migrated cases; the only remaining v2 coupling is in the explicitly force-blocked
|
|
122
|
+
cases.
|
|
123
|
+
4. `bundle exec rspec` green in eco-helpers; gem suite still green.
|
|
124
|
+
5. No customer script edits required — verified against the downstream include-site
|
|
125
|
+
inventory from Phase 0.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Risks & Blockers — Ooze → Native GraphQL Migration
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## BLOCKER (external dependency, UNCONFIRMED): GraphQL forces not yet verified end-to-end
|
|
6
|
+
|
|
7
|
+
**~50% of all ooze cases use forces** (`target.forces`, `force.bindings.{get_by_name,add,
|
|
8
|
+
delete!}`, `force.custom_script`, `force.script`).
|
|
9
|
+
|
|
10
|
+
**Correction (2026-06-30):** the GraphQL force endpoint is NOT simply "missing" — the gem
|
|
11
|
+
already carries client code for BOTH read and mutate:
|
|
12
|
+
- **Read:** `Ecoportal::API::GraphQL::Query::PageWithForces` fetches `page.forces { ...ForceFields }`.
|
|
13
|
+
- **Mutate:** `Mutation::Page::ExecuteForceCommands` → the `executeWorkflowCommands` mutation,
|
|
14
|
+
supporting `editForce { id, customScript }`, `addBinding`, `removeBinding`, `removeForce`
|
|
15
|
+
(plus `addForce`/`reorderForces` `WorkflowCommandInput` variants). So a force WRITE path
|
|
16
|
+
exists via the workflow-command bus — it is **not** read-only at the client layer.
|
|
17
|
+
|
|
18
|
+
What is still UNCONFIRMED (and why this stays a blocker until verified live, not via code-read):
|
|
19
|
+
- `OozeRedirect.force_support?` is hard-wired to return `false`
|
|
20
|
+
(`lib/eco/api/usecases/graphql/compat/ooze_redirect.rb`) — forces are gated OFF.
|
|
21
|
+
- The `ooze_redirect.rb` comment claims `PageWithForces` currently fails schema validation
|
|
22
|
+
(selections on PageUnion; `id` on `DataFieldBinding`/`SectionBinding`; unused `ForceFields`)
|
|
23
|
+
and that the backend is "in progress" — but that note may be STALE given the mutation classes
|
|
24
|
+
now present. **Phase 0 must live-test PageWithForces + a no-op editForce against a real org**
|
|
25
|
+
to establish actual readiness rather than trusting the comment.
|
|
26
|
+
- Activating `ForceCompat` on the mere *existence* of those classes would make **every**
|
|
27
|
+
OozeRedirect case (even non-force ones like TOOCS) fetch via a possibly-broken force query.
|
|
28
|
+
|
|
29
|
+
**Impact:** Force-dependent cases are **held pending the Phase 0 live readiness test** of
|
|
30
|
+
`PageWithForces` + `executeWorkflowCommands`. If that test passes, forces come INTO scope and
|
|
31
|
+
these cases migrate like any other (just with an extra force-command write path). If it fails,
|
|
32
|
+
they are partitioned into the "blocked on forces" table in `INVENTORY.md` and remain on the v2
|
|
33
|
+
path, and the `OozeRedirect` shim cannot be deleted in full until either (a) all blocked cases
|
|
34
|
+
are retired by the customer, or (b) the endpoint is fixed and a follow-up project migrates them.
|
|
35
|
+
|
|
36
|
+
**Blocked-on-forces seed list** (from `ooze_redirect.rb` lines 68–77 — re-verify in Phase 0):
|
|
37
|
+
|
|
38
|
+
| Org | Cases |
|
|
39
|
+
|---|---|
|
|
40
|
+
| act-gov | 5× `20240130_act_*_case`, `rearrage_page_sites_case` |
|
|
41
|
+
| briscoes | `remove_induction_sections`, `310524_Briscoes_Remove_Tasks` |
|
|
42
|
+
| chorus | 4× `audit_update` |
|
|
43
|
+
| hcc | `update_enterprise_risk_case` |
|
|
44
|
+
| lic | `update_life_cycle_force_case` |
|
|
45
|
+
| mitre10 | `rich_text_update`, `update_location_force`, `updating_template` |
|
|
46
|
+
| npdc | `contractor_title_force`, `risk_titile_force`, `fix_title_syncing`, `reminder_date_fields`, `10092024_NPDC_CP_Add_Force` |
|
|
47
|
+
| profile-group | `int_training_review`, `20231026_profile_wellness` |
|
|
48
|
+
| turners-growers | `event_changes`, `inj_cost_calc`, `remove_line_force` |
|
|
49
|
+
| twg | `hide_attached_risks`, `add_new_force` |
|
|
50
|
+
|
|
51
|
+
**Mitigation / trigger:** Phase 0 live-tests `PageWithForces` (read) and a no-op
|
|
52
|
+
`editForce`/`addBinding` via `executeWorkflowCommands` (write) against a real org. If both pass,
|
|
53
|
+
restore a real `force_support?` readiness check, fold forces into the main migration scope, and
|
|
54
|
+
drop this from the blocker list. If either fails, track the fix with Engineering and keep the
|
|
55
|
+
cases above on v2; do not delete `force_compat.rb` or the v2 fallback path that serves them.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Risk: monkeypatch regressions during coexistence
|
|
60
|
+
|
|
61
|
+
While native and shim coexist, the global `FieldPatches` (v2-class `===`/`is_a?` reopening,
|
|
62
|
+
GraphQL field `prepend`s) remain process-wide. A native case loaded in the same process as
|
|
63
|
+
a shimmed case shares those patches.
|
|
64
|
+
|
|
65
|
+
**Mitigation:** Native cases must not *depend* on the patches (they dispatch on GraphQL
|
|
66
|
+
types directly). Spec the native classes in isolation **without** loading `OozeRedirect`, to
|
|
67
|
+
prove independence. Only retire a given `FieldPatch` once the last case needing it is
|
|
68
|
+
flipped (tracked in DECISIONS.md).
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Risk: silent behavioural divergence (the bug that motivated this)
|
|
73
|
+
|
|
74
|
+
The 2026-06-30 incident (KPIs read 0, dry-run diff suppressed) was a *silent* divergence
|
|
75
|
+
between the shim and the base loop. Native rewrites can re-introduce silent divergence
|
|
76
|
+
(e.g. a KPI counter or dedup edge missed).
|
|
77
|
+
|
|
78
|
+
**Mitigation:** Per-case A/B parity gate against the captured v2 baseline (KPI block + diff)
|
|
79
|
+
is mandatory before flipping. Specs must assert the full KPI set and the dry-run diff shape
|
|
80
|
+
(`get_body(page)['page']`), not just "it ran".
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Risk: BC surface drift (a missed override point)
|
|
85
|
+
|
|
86
|
+
If a native class omits an override point a customer script relies on (e.g. `search`,
|
|
87
|
+
`filters`, `custom_processing`, `excluded_field_hooks`, `paired_fields_post_callback`,
|
|
88
|
+
`to_field`, `before_loading_new_target`), that script breaks — a goal regression.
|
|
89
|
+
|
|
90
|
+
**Mitigation:** Phase 0 `INVENTORY.md` enumerates every override method per consumer
|
|
91
|
+
script. Native classes must expose every one. Re-run each affected live script unchanged as
|
|
92
|
+
the final per-phase check.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Risk: write-path / field-type gaps in the gem
|
|
97
|
+
|
|
98
|
+
The compat layer has known gaps (from `eco-helpers-compat/INTENT.md`): `add_field` /
|
|
99
|
+
`components.add` (`dataFields.additions`) not implemented; file/image upload unimplemented;
|
|
100
|
+
some field types read-only. A case that needs an unsupported write cannot reach parity.
|
|
101
|
+
|
|
102
|
+
**Mitigation:** The 21-type field matrix (parity plan) classifies clean-write vs partial vs
|
|
103
|
+
read-only. A case requiring a gap is **held** (logged in DECISIONS.md) until the gem closes
|
|
104
|
+
the gap — not flipped. `RegisterMigrationCase` (typed field copy) is the highest-exposure
|
|
105
|
+
case here.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Risk: interactive prompts in automated runs
|
|
110
|
+
|
|
111
|
+
The base loop reintroduces the v2-faithful `prompt_user` "proceed (y/N)" preview
|
|
112
|
+
(local default 'N', 10s timeout). Native cases reproduce this; an automated/remote run that
|
|
113
|
+
expects no prompt could hang or abort.
|
|
114
|
+
|
|
115
|
+
**Mitigation:** Preserve the existing `run_mode_remote?` → default 'Y' behaviour and the
|
|
116
|
+
timeout exactly as the v2 cases have it. Cover it in specs.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Risk: scope creep into the compat façade or forces
|
|
121
|
+
|
|
122
|
+
This project retires the **OozeRedirect monkeypatch**, not the `Compat::Pages`/`Registers`
|
|
123
|
+
façade (native cases call it) and not forces.
|
|
124
|
+
|
|
125
|
+
**Mitigation:** Non-goals are explicit in INTENT.md. Forces work is a separate project
|
|
126
|
+
gated on the endpoint.
|