Repository navigation
feat: build open OpenSpec changes (dossiq L6, part 3): agent write tools with reach - #3583
Merged
Merged
Conversation
Twelve schemas declare a curated x-openregister-mcp block, so OpenRegister derives 20 read tools (dossiq.case.search, dossiq.statusRecord.search, ...). The hand-written DossiqToolProvider and its helpers are deleted, so nothing shadows the derived tools. OpenRegister RBAC is the only gate. Archives dossiq-mcp-adoption; live tasks 4.1-4.4 stay owed (decision 139).
A change outside properties/required/authorization only reaches an instance when the schema version moves (SchemaVersionFloorTest). Digests regenerated.
…nd workload figures First IMcpScannableServices opt-in (DossiqScannableServices, registered under OpenRegister's per-app alias). Curated #[McpTool] reads: getDeadlineDashboard, getDoorlooptijdMetrics, getKpiOverview, getWorkload (ReportingTools), listAvailableTransitions (CaseTools) and listOverdueComplaints on ComplaintService, a projection that never carries the complainant. Each tool runs the gate its controller runs, then calls the owning service.
…ct; screens.md for hermiq-ai-tooling
…creens.md for the touched specs and the archived change
# Conflicts: # lib/Settings/dossiq_register.json # lib/Settings/register.d/60-termijnbewaking.json # tests/schemas/schema-version-digests.json
# Conflicts: # lib/Settings/dossiq_register.json # lib/Settings/register.d/60-termijnbewaking.json # tests/schemas/schema-version-digests.json
…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
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
October 10, 2026 10:44
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 | ❌ 6961/6962 · 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-10 10:58 UTC
Download the full PDF report from the workflow artifacts.
# Conflicts: # .debt-baseline.json # appinfo/info.xml # lib/Settings/dossiq_register.json # lib/Settings/register.d/60-termijnbewaking.json # tests/schemas/schema-version-digests.json
# Conflicts: # lib/Settings/register.d/60-termijnbewaking.json # tests/schemas/schema-version-digests.json
…duleAppointment (phpmd finds nothing without it)
…spelled-out alias (gate 57 could not see AppointmentTools)
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 | ❌ 7012/7013 · 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-10 16:26 UTC
Download the full PDF report from the workflow artifacts.
…ion stays under the phpmd coupling limit
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 | ❌ 7012/7013 · 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-10 16:53 UTC
Download the full PDF report from the workflow artifacts.
This was referenced Oct 10, 2026
Merged
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 an agent can now do
hermiq-ai-tooling phase 3: an assistant (through hermiq) can move a case on, hand it to another handler, complete a task, extend, pause or resume a statutory term, book or cancel an appointment, and draft a beschikking. Every tool runs the check its controller runs and calls the service its controller calls; refusals come back as envelopes with the service's own rule and sentence. All 15 curated tools now declare their
reach(REQ-MCP-205): readsuser, case and term writesinstance, appointmentsexternal, the beschikking draftuser.Stacked on #3567 (< #3558). Must land AFTER ConductionNL/openregister#4546 (
reachon#[McpTool]): against an OpenRegister without that parameter the attribute fails to instantiate and the scanner skips the tool.Changes
lib/Service/Mcp/CaseTools.php:transitionCase(StatusTransitionService::execute as the caller; a failed guard returns the failing guards),reassignCase(coordinators only),completeTask(the engine task verb; a task with required form fields is refused with the field named).lib/Service/Mcp/TermTools.php(new):extendDeadline,pauseDeadline,resumeDeadline. The term is read and the caller must be allowed to change its CASE; the term controller only checks the session.lib/Service/Mcp/AppointmentTools.php(new):scheduleAppointment,cancelAppointment, with AppointmentController's case checks.lib/Service/Mcp/BeschikkingTools.php(new):draftBeschikkingonly (BeschikkingService::compose); no approve, sign or send (design D3).lib/Service/CaseAssignmentService.php: newreassign(), the single-case form of the caseload release (there was none). Writesassigneeonly, refuses a no-op, notifies the receiver with the existingcases_reassignedsubject.lib/Service/Mcp/ToolEnvelopes.php(new trait): the shared error and refusal envelopes.lib/Mcp/DossiqScannableServices.php: lists the three new tool classes.CaseAssignmentService::reassign(), completeTask ->CaseTaskActions::complete(), draftBeschikking ->BeschikkingService::compose().New classes and their tests (coverage guard)
TermTools:tests/Unit/Service/Mcp/TermToolsTest.php(8 cases: no session, unknown term, case not changeable, extend with date normalised, unreadable date, pause, service refusal, resume with and without a date).AppointmentTools:tests/Unit/Service/Mcp/AppointmentToolsTest.php(7 cases).BeschikkingTools:tests/Unit/Service/Mcp/BeschikkingToolsTest.php(5 cases, including no approve/sign/send method).ToolEnvelopes(trait): exercised through all four tool tests.CaseAssignmentService::reassign():tests/Unit/Service/CaseAssignmentServiceTest.php(5 cases; the patch is checked against the realcaseschema fragment).CaseToolswrites: 11 new cases inCaseToolsTest.DossiqScannableServicesTestpins every tool's reach and holds the tool classes off ObjectService.dq-l6-logs/red-reach-dossiq.log,red-reassign.log,red-termtools.log,red-appt-besch.log.Dependencies built (decision 156)
reachon#[McpTool](REQ-ATTR-006).GovernanceBodyStateRequestedEvent, the read seam migrate-committees-to-decidiq task 3 needs (dossiq side not built yet).Questions added
Checks
tests/Unit/Settings,tests/Unit/Mcp,tests/Unit/Service/Mcp, CaseAssignment service and controller tests after merging origin/development: OK (361 tests).composer check:strictandnpm run lintNOT run locally (one heavy command per lane, the slot held by the openregister check). PHP only, no src/ change. CI is the full check.Still owed (live pass, decision 139)
hermiq-ai-tooling 5.1-5.4:
tools/listshows 15 curated tools with the D2 reach; a fresh agent is denieddossiq.reassignCaseand may calldossiq.getDeadlineDashboard; a granted reassign pends in hermiq approvals and executes throughCaseAssignmentService::reassign(); the three chat scenarios of design D4.