feat(schemas): namespace the case task - #1845
Merged
Merged
Conversation
`task` was claimed by three apps: planninq, pipelinq and this one. They share `description`, `priority` and `status` — what any task-shaped record carries, and nothing that identifies the record. planninq's project task is the largest and keeps the bare slug; pipelinq's became `crmTask`. WHAT THE SUITE FOUND THAT THE GREP DID NOT. The rename reached the descriptors, the config-key map and every store call on the first pass, and the suite still failed six times — twice for the same reason in two different places. KpiAggregationService::ids() and DemoCaseloadGateway::schemaIds() each build a LOCAL array keyed 'task' and hand it round as $ids['task']. Renaming the readers without the builders left $ids['caseTask'] resolving to null, which surfaced as a TypeError on a nullable argument three frames away, in a class that never mentions the slug. Then PHPStan caught the declared array shapes still saying `task: string` after the builders moved. Neither would ever appear in `grep -rn "'task'"`-shaped triage as a schema reference: the array key is not the slug, it is just spelled like it. This is the first rename tonight where the escaped sites were STRUCTURAL rather than lexical. tests/e2e/ci-seed.sh names the slug in its required-schema list and moved with it — that list is checked after the import and exits BEFORE Playwright, so a miss reports every spec as not run rather than as a failure. Decoys left alone: `itemType` in WorkQueueService and the `type` key in CaseReassignmentService, BulkReassignModal, taskApi and dashboardHelpers, all row labels for mixed lists. Full suite: 3,045 tests, 18,012 assertions, exit 0. phpcs, phpstan, psalm exit 0.
rubenvdlinde
requested review from
Rem-Dam,
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
September 5, 2026 19:49
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 | ✅ | ||||
| composer | ✅ | ✅ 106/106 | |||
| npm | ✅ | ✅ 541/541 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ deferred — runs on the promotion into beta/main, not on a pull request into development | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-09-05 19:54 UTC
Download the full PDF report from the workflow artifacts.
rubenvdlinde
added a commit
that referenced
this pull request
Sep 5, 2026
) Three of dossiq's four red jobs on development are one missed key. #1845 namespaced `task` to `caseTask` and swept the manifest thoroughly — every `"schema": "task"` moved — but `deepLinks` addresses its target through `schemaSlug`, a different key name, so the sweep did not reach it. The consequences reported separately, which is why this looked like three problems: Frontend Tests (unit) searchableSchemas.spec.js asserts a deepLinks entry for every searchable schema; the register now declares `caseTask` as searchable and the manifest still offered `task`. Hydra gate-53 effective-manifest-crossref resolves deepLinks against the declared schemas, so a slug nothing declares is a cross-reference failure. Frontend Check prettier, on the spec file the same commit had edited. The spec kept the old name in two more places, and the comment sitting between them already stated the rule it was breaking: "the KEY is the schema slug and moved with it; the URL is a published ROUTE and deliberately did not". That was written for the `objectionProceeding` rename and is just as true for this one. Both maps move; the `/apps/dossiq/tasks/{uuid}` template and the `/tasks/:id` route stay, because a route resolves at request time and breaking one fails silently. Verified locally: 366 unit tests pass across 36 files, gate-53 reports `{"status":"passed","checked":1,"failed":0}` with the same 7 non-blocking WARNs CI already reported, prettier clean across the repo, eslint clean. Co-authored-by: Conduction Release Bot <release-bot@conduction.nl> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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
taskbecomescaseTask. This closes the three-way collision — planninq's project task keeps the bare slug, pipelinq's becamecrmTaskin ConductionNL/pipelinq#1833.Why all three namespace
The three share
description,priorityandstatus— what any task-shaped record carries, and nothing that identifies the record.What the suite found that the grep did not
The rename reached the descriptors, the config-key map and every store call on the first pass. The suite still failed six times, twice for the same reason in two different places:
KpiAggregationService::ids()andDemoCaseloadGateway::schemaIds()each build a local array keyed'task'and hand it round as$ids['task']. Renaming the readers without the builders left$ids['caseTask']resolving tonull, which surfaced as:— three frames away, in a class that never mentions the slug. Then PHPStan caught the declared array shapes still saying
task: stringafter the builders moved.Neither would appear in slug-shaped triage. The array key is not the slug, it is just spelled like it. This is the first rename tonight where the escaped sites were structural rather than lexical, and it is a good argument for running the suite even when the grep looks clean.
The seed list
tests/e2e/ci-seed.shnames the slug in its required-schema list and moved with it. That list is checked after the import and exits before Playwright, so a miss there reports every spec as not run rather than as a failure.Decoys left alone
itemTypeinWorkQueueService, and thetypekey inCaseReassignmentService,BulkReassignModal,taskApianddashboardHelpers— row labels for mixed lists, not schemas.Verification
Full unit suite: 3,045 tests, 18,012 assertions, exit 0. phpcs, phpstan, psalm exit 0.