docs(openspec): propose retiring Integriq's own flow engine - #1796
Merged
Conversation
Integriq runs its own flow engine. visual-flow-orchestration declares a `flow` schema with an ordered steps[] pipeline, plus flow_run and flow_run_log, and FlowRunnerService executes it. OpenRegister runs one too, with a nodes/edges graph, triggers, an execution mode and 22 node types. The slug collision is the symptom. Measured on the dev instance 2026-08-31, `flow` is declared by both openregister and integriq, so a bare "$ref": "flow" resolves to whichever row SchemaMapper::find() fetches first. Renaming Integriq's slug clears that in an afternoon and leaves the fleet with two flow engines, which is the more expensive outcome: every later flow feature then has to be built twice. The gap that kept them separate is already being closed. OpenRegister has no node that makes an outbound call and none that runs a synchronization, which is Integriq's whole purpose. The existing integriq-flow-nodes change contributes both through RegisterFlowNodesEvent, the seam OpenRegister already ships. This change depends on it and adds what remains: an approval node, the steps-to-graph migration, retiring FlowRunnerService, and removing the schema. Proposal only. No code, and the pre-implementation gate holds three questions that must be answered before Task 1: PO sign-off on losing the step-list editor, whether an event-emit node exists, and how many live flow objects each instance carries. Found while building gate-106 (cross-app-schema-slug): generating its fleet baseline surfaced `flow` as the one remaining two-app claim that is a genuine shadowing of an OpenRegister core schema rather than two apps meaning different things by a common word.
Contributor
Quality Report — ConductionNL/integriq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| check-l10n-js | ✅ | ||||
| composer | ✅ | ✅ 141/141 | |||
| npm | ✅ | ✅ 537/537 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ⏭️ deferred — runs on the promotion into beta/main, not on a pull request into development | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-09-01 09:45 UTC
Download the full PDF report from the workflow artifacts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Proposal only. No code.
Integriq runs its own flow engine.
visual-flow-orchestrationdeclares aflowschema with an orderedsteps[]pipeline, plusflow_runandflow_run_log, andFlowRunnerServiceexecutes it. OpenRegister runs one too, with anodes/edgesgraph, triggers, an execution mode and 22 node types.The slug collision is the symptom, not the disease
Measured on the dev instance 2026-08-31:
flowis declared by bothopenregisterandintegriq. A schema slug is global on a shared OpenRegister, so a bare"$ref": "flow"resolves to whichever rowSchemaMapper::find()fetches first.Renaming Integriq's slug clears that in an afternoon. It also leaves the fleet with two flow engines, which is the more expensive outcome: every later flow feature then has to be built twice.
flowflownodes+edgesgraphsteps[]triggercatalog,cron,executionModecall,mapping,synchronization,event,approval,branchThey share
nameanddescription.The gap that kept them separate is already being closed
OpenRegister has no node that makes an outbound call and none that runs a synchronization, which is Integriq's whole purpose. The existing
integriq-flow-nodeschange (0/20) contributesopenconnector.source-callandopenconnector.synchronization-runthroughRegisterFlowNodesEvent, the seam OpenRegister already ships for apps to add node types without patching the engine.This change depends on it and adds what remains:
callopenconnector.source-call(integriq-flow-nodes)synchronizationopenconnector.synchronization-run(integriq-flow-nodes)mappingMapNodebranchRouterNode/SwitchNodeeventapprovalThe pre-implementation gate
Three questions must be answered before Task 1, not after:
flowobjects does each instance carry? A migration whose blast radius is unmeasured is a migration whose rollback is unplanned.How this was found
Building gate-106 (
cross-app-schema-slug, ConductionNL/.github#659) meant generating a fleet slug-ownership baseline.flowcame back as the one remaining two-app claim that is a genuine shadowing of an OpenRegister core schema, rather than two apps meaning different things by a common word.🤖 Generated with Claude Code