Repository navigation
feat(cmmn): retire the local CMMN runtime, the case plan lives in OpenRegister only - #3773
Merged
Merged
Conversation
…them without a grant Every curated read (deadline dashboard, lead times, KPIs, workload, available transitions, overdue complaints) now declares reach: 'user'. Without it a two-segment id resolves to external and needs an explicit grant. Needs openregister build/dep-dossiq-mcptool-reach on the instance first.
… and work its terms Curated write tools, each on the service its controller calls: transitionCase (StatusTransitionService, guards and status record intact), reassignCase (new CaseAssignmentService::reassign, coordinators only, the receiver is notified), completeTask (the engine's complete verb), extendDeadline/pauseDeadline/resumeDeadline (new TermTools: the term is read and its CASE must be changeable by the caller before the term services run). Refusals come back as envelopes with the service's own rule and sentence. WIP: AppointmentTools and BeschikkingTools are listed but not written yet.
…chikking AppointmentTools (scheduleAppointment, cancelAppointment; external reach: the resident is told) run AppointmentController's case checks and call AppointmentService. BeschikkingTools offers draftBeschikking only, through BeschikkingService::compose(); approving, signing and sending stay with the caseworker. A test holds the tool classes off ObjectService. hermiq-ai-tooling 3.1-3.3 ticked; the spec names the services as found.
# Conflicts: # lib/Settings/register.d/60-termijnbewaking.json # tests/schemas/schema-version-digests.json
… verdict woo-review-triage section 1: wooDocumentReview, wooTriageRule and wooReviewBatch schemas (87-woo-review.json, register 0.20.23); only an in-scope document needs a verdict and an unmarked one is always outstanding; POST relevance and GET summary on the Woo case; a repair step marks documents assessed before this change in scope so they do not block their case. (unit tests written, run pending a slot)
…h install has no assessments
# Conflicts: # lib/Settings/register.d/60-termijnbewaking.json # tests/schemas/schema-version-digests.json
…duleAppointment (phpmd finds nothing without it)
…1-4) Decision 179 (Ruben, 10 Oct 2026): a form submits into its destination object, with no in-between intake layer, and is valid against that object's schema when built. Cross-app change: hydra openspec/changes/form-submits-into-its-destination-object (ADR-117, hydra#748). Spec only.
# Conflicts: # appinfo/info.xml # tests/schemas/schema-version-digests.json
…rmed only when its term runs WooRequestIntake::receive() takes opencatalogi's answer keys (portal-form and opencatalogi origins, subjectRef optional for those two), writes the Woo case directly (decision 179: no intake object in between), counts the term from when the requester sent it, and reads the term back: armed only when a statutory instance with an engine timer ends on the case deadline; otherwise not-armed with an internal timeline entry, or unavailable with nothing written. PortalContributionProvider::receiveWooRequest() has opencatalogi's signature. Register 0.20.26 (wooRequest origin enum, phone and address).
…t, a due invoice and a published award Four x-openregister-notifications rules on the supplier schemas mail the supplier's contact address through supplierRef, using OpenRegister's new email recipient kind (portal-contribution T3).
…nd act as dossiq on the case layer The bridge called createPlan and getPlan with uid null, which OpenRegister refuses, so every case start created nothing. It now calls the system verbs from openregister#4544 and names an OpenRegister that lacks them. The drain (retire-cmmn-caseplanstate 2.1-2.3): occ dossiq:cmmn:migrate-case-plans and a post-migration repair step hand each blob to ensureItems with the recorded states and the event log as history, verify every state, then clear the blob. Unmappable cases keep their blob and are reported.
…chable
formerReferences (list of {application, reference}) on the case schema, an
exact search declaration, register 0.20.27.
OpenCatalogiWooCase maps every status to its stage (received, in_progress, awaiting_clarification, decided, withdrawn), carries start, requester, channel, old reference, extension count and end date, on opencatalogi's own request shape as fixture. First part of takes-over 4.2.
…s no approval floor Decision 176 (Q-dossiq-L6-2): REQ-MCP-206 now says hermiq decides which AI writes wait for a person. dossiq declares readOnlyHint: false and a scope on every write so hermiq can gate it, and ships no grant or waiver. CHANGELOG entry for the curated tools (task 4.3).
…who gets a task for it
POST /api/cases/{id}/woo/batches takes a list of documents or a filter on
the rule that marked them, refuses a document already in another open
batch (409, naming the batch), writes the batch on each review and hands
the reviewer an engine task. GET lists the batches with assessed of total.
Also: WooThroughputReport gets its row in the date-arithmetic audit that
development's EveryTermOnTheCalendarTest now requires.
…siq.fileCase dossiq.fileCase carries the citizenIntake mark with scope and action create, which is how hermiq now recognises an intake tool (decision 177). It writes through the create form's own path: one save on the case schema as the caller, so the schema, the intake requirements, the duplicate policy and RBAC all run, and a refusal is thrown so hermiq hands the resident to a person. No intermediate intake object (decision 179). The six curated reads carry outsideAgent for hermiq's outbound surface. ai-features-on-the-case-consume-hermiq 5.1, 5.2; screens.md added.
…throughput tally has its audit row
…d the viewer reports the pages seen
Review depth per document type (every page, or a sample drawn from a seed
recorded on the review). POST .../documents/{documentRef}/pages-seen
appends each displayed page with the reviewer and time; the first page
count a review hears sets its required pages from the recorded depth.
caseType.aiFeatures (register fragment 43) maps hermiq's feature slug to case, intake or none, and holds no provider, model or residency. Register 0.20.25, info.xml bumped, en/nl strings. Ticks ai-features 1.1, and 1.2/2.1 with the files that already carry them.
…tick them with their files
…ts, retired repair step)
…e strip and the simple view
…rvice the penalty calculation retired
# Conflicts: # .debt-baseline.json # appinfo/info.xml # appinfo/routes.php # lib/AppInfo/Registrar/AppHostRegistrar.php # lib/Service/Settings/SchemaSlugMap.php # lib/Settings/dossiq_register.json # lib/Woo/WooRequestIntake.php # openspec/changes/archive/2026-10-10-custody-and-handover-of-a-case/screens.md # openspec/changes/archive/2026-10-10-frozen-beschikking-and-numbered-successor/screens.md # openspec/changes/archive/2026-10-10-site-resident-portal-design/screens.md # openspec/changes/portal-contribution/screens.md # openspec/changes/woo-request-takes-over-from-opencatalogi/screens.md # openspec/changes/woo-review-recall-and-stopping/screens.md # openspec/changes/woo-review-triage/screens.md # openspec/specs/beschikking-generatie/screens.md # openspec/specs/dossiq-sociaal-domein-avg-consent/screens.md # openspec/specs/portal-contribution/screens.md # tests/Unit/Architecture/catch-return-null.allowlist.json # tests/Unit/Repair/RepairStepRegistrationTest.php # tests/schemas/schema-version-digests.json # tests/vitest/caseCommunicationWidget.spec.js
…rstTodayWidget (inherited)
…nRegister only retire-cmmn-caseplanstate 3.1, 3.3, 4.1, 4.2 and the e2e of group 5. lib/Service/Cmmn, CmmnCaseController, the five cmmn-plan routes, the rollback command and the read-preference flag are gone. CasePlanPanel reads OpenRegister's case layer and nothing else. CmmnRetirementTest refuses a new reference and ties the casePlanState declaration to the drain: they leave together (task 3.2, its own pull request).
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
October 12, 2026 05:43
Contributor
Author
|
Full local run on 96a5cc4, once, through the build slot.
|
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
dossiq no longer runs a case engine of its own. An adaptive case plan is rows in OpenRegister's case layer, and the case page reads them there and nowhere else (decision 146, one engine).
This is
retire-cmmn-caseplanstatetasks 3.1, 3.3, 4.1 and 4.2, plus the e2e specs of group 5.lib/Service/Cmmn/(nine classes),CmmnCaseControllerand the five/api/case/{caseId}/cmmn-plan*routes are gone. So areocc dossiq:cmmn:rollback-case-plans,CasePlanRollbackServiceand thecmmn_prefer_openregister_case_planflag: all three existed only for the bridge release. Their unit tests went with them.cmmnApi.jsandcmmnHelpers.jsare gone.CasePlanPanel.vueasks OpenRegister only. A case OpenRegister holds nothing for shows "no adaptive plan"; an outage still shows an error with a retry.tests/Unit/Service/CmmnRetirementTest.phpfails on any file underlib/,src/orappinfo/that names the retired namespace, the controller, acmmn-planroute orcasePlanState. The allowlist holds the four drain files and the five files that declare or describe the property. Each entry gives its reason, a stale entry fails, and no entry may name anything but the blob.CmmnBpmnCoexistenceRegressionTesttested the engine that is gone. Its invariant is nowtestTheStatusTransitionPathNeverReachesTheCaseLayerand an assertion in the case-detail e2e.tests/e2e/cmmn-retirement.spec.tsopens a case, completes an item from the panel, probes the old routes for 404 and proves a drained case shows the same states.case-detail-kpis-and-tabs.spec.tsloses itscmmn-planand 409 allowances.Nothing here is named after a procedure (decision 182). The plan panel, the projection and the guard serve any case type with
handlingModel: cmmn.Base and stack
origin/train/2026-10-11-bat 88ae501, train: land 32 ready PRs (11 Oct, b) #3742), because the guard's allowlist names the drain classes of feat(cmmn): drain casePlanState blobs into OpenRegister plan items, and act as dossiq on the case layer #3605. Land this after train: land 32 ready PRs (11 Oct, b) #3742. Until then the diff againstdevelopmentalso shows the train.developmentinto this branch. It conflicts in five files (l10n/nl.json,ObjectListenerRegistrar.php,dossiq_register.json,language-neutral-keys.json, the schema digests), all between the train anddevelopment, none touched here.ensureItems) has landed. openregister#4545 (build/cmmn-runtime-2: plan-item timers, the open-case and advance-case flow steps) is still open. Nothing in this PR calls it.Before you merge: the drain gate
Task 3.2 is not in this PR.
casePlanStatestays declared and the drain stays shipped.After this PR a case that still carries a blob shows no plan until the drain has moved it. The repair step of #3605 runs on the same upgrade, so that window closes during the upgrade for every case the drain can map. A case the drain reports as unmappable keeps its blob and shows no plan until someone resolves it. If that is not acceptable for an instance, run
occ dossiq:cmmn:migrate-case-plans --strictthere first and merge on exit 0.There is no rollback command any more. Rolling back means rolling back the release.
Verified
phpunit --no-coverageovertests/Unit/Architecture,AppInfo,Repair,Controller,Command,Service/CasePlanDrain,CasePlanProjectionServiceTestandCmmnRetirementTest: exit 0, 1960 tests.src/namingcasePlanStateturns it red.lib/files: exit 0 each.openspec validate retire-cmmn-caseplanstate --strict: valid.TenantService,StateMachineService), 43 (DocumentReviewPanel.vue), 51, 104 and 107. None is in a file this PR changes.CaseModelLoader::getActiveModelis gone).check:strict,npm run lintand full vitest were still waiting for a build slot when the lane handed back. CI is the full check (decision 149).