Repository navigation
feat(dmn): named decision tables are stored once and flows reference them by key - #4572
Merged
Merged
Conversation
…them by key Decision 186: a reusable decision table lives in OpenRegister as a generic capability (ADR-118 C15). A core decision-tables register, refused at save when the evaluator cannot run a table or its key is taken; DecisionTableStore resolves a table by key or uuid and evaluates it for apps; the decision-table flow step takes tableRef as an alternative to an inline table.
Contributor
Quality Report — ConductionNL/openregister @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| test-l10n | ✅ | ||||
| test-l10n-parity | ✅ | ||||
| format | ✅ | ||||
| check-schema-l10n | ❌ | ||||
| composer | ✅ | ✅ 173/173 | |||
| npm | ✅ | ✅ 648/648 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 25341/25341 · 25 skipped (no test failed, the job failed for another reason — see its log) | ||||
| Newman | ✅ 635/635 | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ❌ |
Quality workflow — 2026-10-10 21:44 UTC
Download the full PDF report from the workflow artifacts.
Contributor
Quality Report — ConductionNL/openregister @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| test-l10n | ✅ | ||||
| test-l10n-parity | ✅ | ||||
| format | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 173/173 | |||
| npm | ✅ | ✅ 648/648 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 25374/25374 · 25 skipped (no test failed, the job failed for another reason — see its log) | ||||
| Newman | ✅ 635/635 | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ❌ |
Quality workflow — 2026-10-11 07:56 UTC
Download the full PDF report from the workflow artifacts.
…e register import The listener matched a row by schema slug alone, so another app's own decision-table schema (buildiq's, until it moves onto this register) would have had its rows refused. It now also requires the decision-tables register. ImportDecisionTableRegister gains its unit tests (CI's coverage guard read the added statements as untested).
Contributor
Quality Report — ConductionNL/openregister @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-specs | ✅ | ||||
| test-l10n | ✅ | ||||
| test-l10n-parity | ✅ | ||||
| format | ❌ | ||||
| check-schema-l10n | ✅ | ||||
| composer | ✅ | ✅ 173/173 | |||
| npm | ✅ | ✅ 648/648 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ✅ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ✅ 25594/25594 · 25 skipped | ||||
| Newman | ✅ 635/635 | ||||
| Playwright | ⏭️ deferred: E2E runs locally and on the promotion path only. This pull request targets development, so the suite is asked once per promotion into beta and main rather than once per push per open pull request. Run it locally with npx playwright test, or from the Actions tab on a branch with no open pull request into development. |
||||
| Hydra gates | ❌ |
Quality workflow — 2026-10-11 21:28 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.
What
Named decision tables, stored once in OpenRegister, used by reference (decision 186, ADR-118 capability C15).
decision-tables, schemadecision-table(key,name,description,hitPolicy,inputs,outputs,rules,owner):lib/Settings/decision_table_register.json, imported by the new repair stepImportDecisionTableRegister(info.xml version moved so it runs).DecisionTableValidationListenerrefuses, at save, a stored table the evaluator cannot run (the sameDecisionTableValidatorthe inline step uses) and a second table under a key another table carries (decision-table-invalid).DecisionTableStoreresolves a table bykey, else by uuid, re-validates it on read, and hasevaluate(reference, inputs)for an app that decides outside a flow. An unknown reference is refused, never answered with an empty table.openregister.decision-tablestep takestableRefas an alternative totable. Both, or neither, is refused at save. AtableRefthat names nothing executable is refused at save and fails the step at run.Why
Q-dossiq-L6-4, answered by Ruben as decision 186: OpenRegister's step carried its table inline and had no store, so dossiq kept its own (
decisionTableschema, CRUD, five routes, an admin tab, a translator that inlines stored tables, and the VTH enforcement recommendation reading a stored table). Those move onto this capability in a dossiq PR that follows (lane R3).Change:
openspec/changes/stored-decision-tables/(REQ-SDT-01..04). Task 1.5 (live: import, store, run bytableRef) is owed to the live pass; 1.6 (point the editor at the register) is a follow-up.Verified
DecisionTableStoreTest,DecisionTableValidationListenerTest,DecisionTableNodeStoredTableTest. Red on development: the store and listener classes do not exist and the step has notableRef. Green:tests/Unit/Service/Dmn, the listener test andtests/Unit/Service/Flow/Nodes/119 tests OK, exit 0;tests/Unit/Settings,tests/Unit/Repair,tests/Unit/AppInfo205 tests OK, exit 0.@spec) is inherited.composer check:strict(the check slots were held by other lanes). CI is the full check for this PR.Decision 196: lands together with buildiq#1100 and .github#840
Ruben decided that OpenRegister owns the schema slug
decision-table, and that buildiq's rule engine moves onto these stored tables. The slug staysdecision-table.declares schema slug 'decision-table', which belongs to 'buildiq'). chore(gate-106): OpenRegister owns the schema slug decision-table (decision 196) .github#840 moves the owner infleet-schema-slugs.jsontoopenregister. With that contract the checker reports0 finding(s)on this tree. CI reads the contract frommain, so .github#840 lands first.decision-tableschema and moves its tables into this register with a repair step. Land the three together.DecisionTableValidationListenernow validates a row only when it is in thedecision-tablesregister. Before, it matched the schema slug alone, so buildiq's still-existing schema of the same slug would have had its rows refused. Red: 2 failing tests against the old listener. Green: 27 targeted tests.ImportDecisionTableRegisternow has unit tests. CI's coverage guard had read its 137 added statements as untested (86.04% vs 90.19%).ObjectServiceRunAsAnonymousTest::testTheSubjectIsGoneEvenWhileThePhpSessionStillNamesAUser, passes locally (13 tests OK). This PR touches neither that test norObjectService. Read it as inherited or flaky until CI says otherwise.