Repository navigation
feat(stuf): a connected system writes cases and documents through integriq (decision 206) - #3801
Merged
rubenvdlinde merged 5 commits intoOct 12, 2026
Merged
Conversation
…uf-writes-through-integriq
…egriq, as the service account (decision 206) Integriq authenticates the sender and maps the StUF message onto a generic operation. ConnectedSystemCaseWriter carries it out as the background service account with the access rules on. A stufEndpoint opts in with acceptsWrites. Dossiq has no StUF write route of its own.
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
October 12, 2026 07:58
Contributor
Quality Report — ConductionNL/dossiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ❌ | ||||
| phpstan | ❌ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-vue3-compile | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ❌ | ||||
| check-schema-l10n | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-debt-ratchet | ❌ | ||||
| check-types-e2e | ✅ | ||||
| composer | ✅ | ✅ 109/109 | |||
| npm | ✅ | ✅ 659/659 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 8148/8149 · 4 skipped | ||||
| Newman | ⏭️ | ||||
| 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-12 08:19 UTC
Download the full PDF report from the workflow artifacts.
Contributor
Quality Report — ConductionNL/dossiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-vue3-compile | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ❌ | ||||
| check-schema-l10n | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-debt-ratchet | ❌ | ||||
| check-types-e2e | ✅ | ||||
| composer | ✅ | ✅ 109/109 | |||
| npm | ✅ | ✅ 659/659 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 8148/8149 · 4 skipped | ||||
| Newman | ⏭️ | ||||
| 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-12 08:43 UTC
Download the full PDF report from the workflow artifacts.
…uf-writes-through-integriq The integriq event stubs cite dossiq's own StUF requirements (gate 46), as train 3 did for the stubs it took. Register version 0.20.38 for the stufEndpoint 1.2.0 fragment and the case origin fields.
caseSearchDeclarations.spec.js asks every case property for an input control or a place on its silent list. Both fields are looked up by exact match.
Contributor
Quality Report — ConductionNL/dossiq @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-vue3-compile | ✅ | ||||
| test-l10n | ✅ | ||||
| format | ✅ | ||||
| check-schema-l10n | ✅ | ||||
| check-l10n-js | ✅ | ||||
| check-debt-ratchet | ❌ | ||||
| check-types-e2e | ✅ | ||||
| composer | ✅ | ✅ 109/109 | |||
| npm | ✅ | ✅ 659/659 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| lockfile sync | ✅ | ||||
| PHPUnit | ❌ 8373/8375 · 4 skipped | ||||
| Newman | ⏭️ | ||||
| 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-12 13:40 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 this does
Decision 206 (Ruben, 12 Oct): another system may write cases and documents into dossiq over StUF, but only through integriq and authenticated. This is the dossiq half. The integriq half is ConductionNL/integriq#2662, and it lands first.
Stacked on #3775 (
refactor/r2-stuf-provider-retired, head ebf7359), which had not landed when this branch was cut. It contains origin/development as of 102aba0. Land it after #3736, #3775 and integriq#2662.create,updateoradd-document. Dossiq reads that operation from integriq's event. It parses no StUF and has no StUF write route of its own.ConnectedSystemCaseWritercarries the operation out as the background service account (BackgroundServiceAccount::runAs) with OpenRegister's access rules on. No_rbac: false, no system elevation. It is generic code named by what it does (decision 182): nothing in it names StUF or a procedure.StufProviderWriteListeneranswers integriq's two write events, only for a source astufEndpointnames, and puts the outcome back on the event with its kind (refused, forbidden, not found, conflict).stufEndpointopts in withacceptsWrites, off by default. ItszaaktypeMappingsdecide which case type an incoming case opens on. The newdocumentTypeMappingsdecide the document type. An unmapped zaaktype or document type is refused. The schema moves to 1.2.0.originSystemandoriginIdentifier(new, generic case properties), so later messages from that system find it by the identifier it gave. Any other case is found by its dossiq case number.DossierUploadHandler::uploadOne), so the executable check and the confidentiality rule apply.Refused, and how
acceptsWritesIntegriq turns each kind into a Fo03 with HTTP 400, 403, 404 or 409.
Rollout, for an administrator
dossiq-background-service.stufEndpoint: setacceptsWritesto true, checkzaaktypeMappings(dossiq case type identifier or uuid to the zaaksysteem's zaaktype name or code) and filldocumentTypeMappings(the zaaksysteem's document type name to a dossiq document type id).configuration.acceptsProviderRequeststrue and a WS-Security UsernameToken./apps/integriq/api/stuf-zkn/provider/{sourceId}/cases. The old dossiq addresses (/apps/dossiq/api/stuf/zakenand/cases) take queries only: integriq refuses a write that arrives through them.Which cases a connected system may change (decision 215)
An update or a document add may name any case by its dossiq case number, not only a case the same system opened. Ruben confirmed this on 12 Oct (decision 215, question Q-R2-4).
Inherited, reported not fixed
StufProviderQueryListener::zaaktype()readscaseType.slug, and the shipped caseType schema declares noslug. So a zakLa01 names a zaaktype only when the mapping key is the case type's uuid. Fixed in fix(stuf): a case answer names its zaaktype by the case type's catalogue identifier #3816, on other lines of the same file.Gate 119
No procedure-named class is added or removed, so the gate 119 count does not move.
Verified
ConnectedSystemCaseWriterTest,StufProviderWriteListenerTest,StufProviderQueryListenerTest,CrossAppListenerRegistrarTest: 52 tests, 189 assertions, 2 skipped (both already skipped on development), green. The writer, the document filer, the service account and the case type resolver are the production classes.RealSchemaValidator), with a control that the same validator refuses a wrongintakeChanneland a non-stringoriginSystem.dossiq-achtergrondand without an access-scope override.StufProviderWriteListener.check:schema-l10n,test:l10n,check:l10n-js: green. Schema digests regenerated.composer check:strict, once, on 1a39a85 (refactor/r2/logs/w2-strict.log): lint, refusal-grounds-snapshot, phpcs and phpmd green, full suite 8153 tests green. psalm and phpstan each reported the same 4 errors, all in the newStufProviderWriteListener(the event type was not narrowed). Fixed in the next commit and rechecked with psalm and phpstan on that file and its test, all green. The full run was repeated after merging development, see the next line.COMPOSER_PROCESS_TIMEOUT=0 composer check:strict, once more, on db1f4bb after merging development 3b974a4 (refactor/r2/logs/w3-strict.log): exit 0, ALL CHECKS PASSED. lint, refusal-grounds-snapshot, phpcs, phpmd, psalm and phpstan green, full suite 8379 tests, 80 skipped.Frontend Tests (unit).caseSearchDeclarations.spec.jsasks every case property to declare an input control, andoriginSystemandoriginIdentifierdeclared none. Fixed in the next commit (exact match, text control). After it: that spec 8 tests exit 0,tests/Unit/Settings,tests/Unit/ListenerandConnectedSystemCaseWriterTest759 tests exit 0,check:schema-l10nexit 0. The full vitest suite was not run locally, so CI's frontend job is the check for it. The other two reds on that read,Hydra Gatesandcheck:debt-ratchet, are red on development's own push run for 3b974a4.l10n:build,check:schema-l10n(0 uncovered, baseline 0) andtest:l10nexit 0. Train 3 took the twointegriqSourcecatalogue strings from this branch, and the catalogues hold one copy of each.info.versiongoes 0.20.37 to 0.20.38 forstufEndpoint1.2.0 and the two case origin fields. No repair step or migration is added, soappinfo/info.xmldoes not move (gate 110).