Skip to content

train: land 6 ready PRs (12 Oct, e) - #3855

Merged
rubenvdlinde merged 103 commits into
developmentfrom
train/2026-10-12-e
Oct 12, 2026
Merged

rubenvdlinde merged 103 commits into
developmentfrom
train/2026-10-12-e

Conversation

@rubenvdlinde

@rubenvdlinde rubenvdlinde commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Merge train 5 for dossiq: the R1 case definition packages, the L11 decomposition stack and R2's BRP-through-integriq. Built per the merge-train method: one branch from development (831ca55, train 4), git merge --no-ff of each PR's real head, shared files resolved once.

Included heads

Excluded

Conflict notes

  • appinfo/info.xml: every deleted seed repair step stays deleted (SeedLhsMatrix, SeedVthMatrixCells, VthSeedDataRepairStep, SeedVthWorkflowTemplates, SeedBezwaarBeroepData, SeedBezwaarWorkflowDefinition, SeedBesluitvormingTemplates, and the SeedBezwaarBeroepCommand). Train 4's MoveDecisionTablesToOpenRegister and DrainIntakeObjectsCommand stay.
  • .procedure-code-baseline.json: measured with check_procedure_code.py . --ref HEAD: 185 (was 206), written as 185; gate exits 0.
  • .debt-baseline.json: min of each side, then tightened with node scripts/debt-ratchet.js: phpmd 182, phpunit.skips 5, psalm.inlineSuppressions 253. Nothing raised.
  • catch-return-null allowlist: ceiling 256 = entry count (ServiceCatchReturnsNullTest asserts it).
  • Register info.version 0.20.40 to 0.20.41 (register.d/84 gained status roles); digests regenerated once.
  • The bezwaar-beroep package still uses the register's status uuids: the WooBezwaar package test and the package suites are green on train 4's tree.
  • LhsLookupAnswersTheGridTest and LhsInterventionTableMatchesGridTest both green.
  • Two combinations the PRs could not know about, fixed here: day-count.allowlist.json entry follows the code to Queue/UrgencyScorer.php; SeedPayloadSchemaConformanceTest::testPackageSeedRowsOnlyWriteDeclaredProperties skips seeds that name another app's register (an object) and judges lhs_matrix_schema through a new lhsMatrices collection. PackageInstallerTest gets one @uses line (PackageSeedRules) that the pcov run flagged as risky.
  • Prettier on TaskDetailView.vue and its spec, which development landed unformatted (refactor(tasks): TaskCaseCard becomes CnFactsWidget with resolve #3840); the format check failed on development.

Verified (exit codes; re-run in full on dcf33a5 after a machine restart)

  • composer lint 0, check:refusal-grounds-snapshot 0, phpcs 0, phpmd 0, psalm 0 (on the head before the last test-only commits), phpstan 0
  • full PHPUnit --no-coverage: 8,589 tests, exit 0
  • pcov run in a throwaway php:8.3 container (zip and pcov, pcov.directory=/app/lib, writable mount, --fail-on-risky): exit 0, no risky tests
  • vitest --maxWorkers=2: exit 0. npm run lint 0, format 0, check:schema-l10n 0, test:l10n 0, check:l10n-js 0
  • node scripts/debt-ratchet.js: 1, only the inherited eslint.inlineDisables 15 against 14 (no disable added by the train)
  • Gate 119: 185 of 185, exit 0
  • Not run: the other Hydra gates (inherited reds 16, 22, 43, 51, 53, 55, 101, 104, 107 are not touched by this train)
  • _rbac: false outside tests: three sites, all moved verbatim by refactor(zgw): cross-register sync and the document link routes leave BrcController #3833/refactor(zgw): store lookups and result shapes leave ZgwRulesBase #3834 from existing code (two deleteObject in Zgw/BrcCrossRegisterSync, one searchObjectsPaginated read in Zgw/ZgwRuleLookups). No new one.

Admin and rollout steps named by the included PRs

Update after the first CI read (head dcf33a5)

  • Vue Quality (eslint) failed with vue/new-line-between-multi-line-property at TaskDetailView.vue:433. Development's copy of the file is clean; my own prettier commit removed a blank line. Fixed in dcf33a5; npm run lint 0 and npm run format 0.
  • Re-run on dcf33a5: composer lint, refusal-grounds snapshot, phpcs, phpmd, phpstan, psalm all 0; PHPUnit --no-coverage 8,589 tests 0; vitest 0; npm lint, format, check:schema-l10n, test:l10n, check:l10n-js 0; gate 119 185 of 185, exit 0. The pcov run (exit 0, no risky) was on the commit before the one-line style change.
  • check:debt-ratchet fails on one counter only: inherited eslint.inlineDisables 15 against 14. Every other counter equals its baseline.
  • Hydra Gates fail on 25, 43, 51, 101. 43, 51 and 101 are in the inherited set. Gate 25 (1 new public endpoint without a contract test) is not: it is the package#index and package#install routes (/api/packages, /api/packages/{id}/install) that Besluitvorming becomes an on-request case definition package (ADR-118, R1) #3725 adds; Hydra Gates were skipped on the package PRs' own runs, so it never ran there. Left for a contract test follow-up.

Gate 25, corrected (head f8c78db)

The first note above was wrong. Gate 25 does not flag the package routes (#[AuthorizedAdminSetting] is not a public endpoint to the gate). CI ran it full-scope and it flagged emailTemplate#listTemplates (GET /api/casetypes/{caseTypeId}/email-templates, #[NoAdminRequired]), an old endpoint the train does not touch. It was "covered" only because the word listTemplates appears in VTHTemplateControllerTest and VTHTemplateServiceTest, which #3791 deletes. Fixed with two real contract tests in EmailTemplateControllerContractTest: anonymous caller gets 401 and the service is never read; a signed-in caller gets 200 with results for the route's case type. Gate 25 locally: PASS, 498 endpoints covered full-scope, and PASS on the diff. tests/Unit/Controller: 1,313 tests, exit 0.
Gate 101 (1 schema without valid demo data) is the demo object of stoppingRule (targetRecall: 0.0 against a schema minimum of 0.5, in dossiq_mock_register.json). The train does not touch it; it fires because the train bumps the register version and the gate judges every schema of a touched descriptor. Same on development once its register is touched. Left alone.

rubenvdlinde and others added 30 commits October 10, 2026 23:05
The bezwaar and beroep case types ship as lib/Settings/packages/bezwaar-beroep/
(install: on-request), written by the package installer. The setup action
`seed` installs it; installed or already current records setup_seed_done, a
refusal or failed write answers 422 with the installer's message.

Converted once, offline, by scripts/packages/seed-to-package.py: status names
resolved into fixed UUIDs, a `*` source status (honoured by no reader) expanded
into one transition per open status, flows published. The nine fields the
flows guard on are declared as property definitions, so every guarded
transition can be taken; the guard sweep and the payload sweep now walk every
package.

Deleted: SeedDataService, SeedSummary, SeedBezwaarBeroepData,
SeedBezwaarBeroepCommand (occ dossiq:bezwaar:seed), SeedBezwaarWorkflowDefinition,
bezwaar_seed_data.json and their unit tests. Newman collection and Playwright
journey added (decision 185).
…-bezwaar-beroep

# Conflicts:
#	tests/Unit/Architecture/catch-return-null.allowlist.json
…, R1)

The three deprecated bvw bundles ship as lib/Settings/packages/besluitvorming,
install on-request (decision 190), converted once with fixed ids and
published flows. A generic package API (GET /api/packages, POST
/api/packages/{id}/install) replaces the besluitvorming activate route and
serves every on-request package. Instances where the old seeder ran get
their case types adopted by identifier, not duplicated.

Deleted: BesluitvormingTemplateService, Besluitvorming/TemplateBundleSeeder,
Besluitvorming/WorkflowReferenceResolver, SeedBesluitvormingTemplates,
BesluitvormingController and route, the bvw-*.json bundles and their unit
tests. Newman collection and Playwright journey added; package-to-newman.py
writes a package's read-back collection.
The settings-only package dso-intake (install auto) points
dso_vergunningaanvraag_schema at integriq's dso_verzoek schema, named by
register and slug and resolved at install. An administrator's value, an
empty one included, is kept. Without integriq or its schema the install is
refused and retried on the next upgrade.

Deletes Repair/DefaultDsoIntakeSchema, its two info.xml steps and its unit
test. DsoIntakeCheck gets its own KEY constant. Adds a Newman collection,
the Playwright journey tests/e2e/packages/dso-intake.spec.ts and openspec
change dso-intake-package.
lib/Settings/packages/subsidie/ holds the generic subsidie case type
(category Subsidies), 5 statuses, 3 roles and a published flow, converted by
scripts/packages/seed-to-package.py from the parked entry in the old bezwaar
seed. It declares the property definition beschiktBedrag, which the
beschikking transition's requiredField guard names.

Adds the Newman read-back collection, the Playwright journey
tests/e2e/packages/subsidie.spec.ts and openspec change subsidie-package
(REQ-SUB-011). MigrateSubsidieRegelingToCaseType stays until its one-release
window ends.
…ists; the VTH seeders are deleted (unverified)
…ckage-bezwaar-beroep

# Conflicts:
#	appinfo/info.xml
#	lib/Repair/SeedBezwaarWorkflowDefinition.php
#	tests/Unit/Architecture/catch-return-null.allowlist.json
…ckage-besluitvorming

# Conflicts:
#	tests/Unit/Architecture/catch-return-null.allowlist.json
…ckage-vth

# Conflicts:
#	appinfo/info.xml
#	tests/Unit/Repair/Vth/VthCaseTypeChildSeederTest.php
…staller-seed-other-register

# Conflicts:
#	appinfo/info.xml
…ision 208)

The drafts in lib/Settings/vth-templates/ become draft flows of the vth
package, and the directory goes. No case follows a draft until an
administrator publishes it. The workflow backfill no longer counts a
draft as a flow a case type has, so a case type that ships only a draft
keeps its basis flow. Unverified: the Settings, Repair and Architecture
suites are queued.
…al properties (REQ-CT-56)

A seed file's match is one property name or a list of them. A row is
adopted when it is equal on every property named. A flag and a number
are compared by meaning. Matching on a flag alone adopts the row that
has the flag set, whatever it is called, so an instance that replaced a
shipped default gets no second one (decision 204).
…vention (decision 204)

lhs-matrix holds the default matrix, recognised by being active, and the
16 grid cells, recognised by row and column. lhs-intervention writes the
table dossiq.lhs-intervention into OpenRegister's decision-tables
register. SeedLhsMatrix and SeedVthMatrixCells go; the actor type repair
stays. Unverified beyond the installer tests: the suites are queued.
…integriq, dossiq's BRP client goes (ADR-118, decision 220)

ConflictOfInterestService asks PersonRelationReader, which reaches integriq's
BrpRelationReader by class name at runtime. Integriq absent, too old or not
allowed to ask for relations is reported as relationCheck not-available; a
read that is allowed and gets no answer blocks. The four BRP client classes,
BrpRegistrar, the contract fixture and their tests are deleted, and the BRP
card names the setting on integriq's source.
# Conflicts:
#	.debt-baseline.json
#	.procedure-code-baseline.json
#	appinfo/info.xml
# Conflicts:
#	.debt-baseline.json
… into train

# Conflicts:
#	.debt-baseline.json
#	.procedure-code-baseline.json
#	appinfo/info.xml
#	tests/Unit/Architecture/catch-return-null.allowlist.json
# Conflicts:
#	tests/Unit/Architecture/catch-return-null.allowlist.json
…p-through-integriq

# Conflicts:
#	tests/Unit/Architecture/catch-return-null.allowlist.json
# Conflicts:
#	tests/Unit/Architecture/catch-return-null.allowlist.json
… skips foreign-register seeds and judges lhsMatrix
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/dossiq @ 6015144

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 ✅ 8586/8586 · 3 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 17:19 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde
rubenvdlinde merged commit 0ae4db8 into development Oct 12, 2026
8 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/dossiq @ 703f410

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 ✅ 8588/8588 · 3 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 19:02 UTC

Download the full PDF report from the workflow artifacts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant