Skip to content

feat(schemas): namespace the case task - #1845

Merged
rubenvdlinde merged 1 commit into
developmentfrom
feat/namespace-the-case-task
Sep 5, 2026
Merged

feat(schemas): namespace the case task#1845
rubenvdlinde merged 1 commit into
developmentfrom
feat/namespace-the-case-task

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

What

task becomes caseTask. This closes the three-way collision — planninq's project task keeps the bare slug, pipelinq's became crmTask in ConductionNL/pipelinq#1833.

Why all three namespace

The three share description, priority and status — 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() 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:

TypeError: DemoCaseloadGateway::create(): Argument #3 ($schemaId)
must be of type string, null given

— 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 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.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 there 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 — row labels for mixed lists, not schemas.

Verification

Full unit suite: 3,045 tests, 18,012 assertions, exit 0. phpcs, phpstan, psalm exit 0.

`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
rubenvdlinde merged commit d8d4ca3 into development Sep 5, 2026
32 of 34 checks passed
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/dossiq @ 1f42f5d

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>
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