chore(case-email-integration): re-point to email leaf per ADR-022#608
Merged
Merged
Conversation
Intercept the not-yet-implemented case-email-integration change so it
consumes the OpenRegister `email` integration leaf (NC Mail; id `email`,
group `comms`, storage `link-table`) for all email display, compose, link
and unlink — rather than building a bespoke mail client.
Re-pointed to the leaf (display + compose + link):
- emailMessage/emailThread schemas, CaseEmailService send/transport,
EmailComposer.vue, EmailThread.vue, EmailTab.vue, UnlinkedQueue.vue,
SMTP send config and send/list/link/unlink endpoints — all removed.
Display/widget via the leaf tab + CnEmailCard on the `case` detail page
(ADR-019/ADR-024); compose in NC Mail; link via the leaf's
POST /api/objects/{register}/{schema}/{id}/email.
Kept in-app as leaf extensions (no leaf equivalent):
- emailTemplate schema + EmailTemplateService versioning + Dutch defaults
(per-zaaktype templating; prefills an NC Mail draft).
- Email -> PDF -> caseDocument archival + retry (Archiefwet/ZGW).
Documented ADR-022 exception:
- InboundEmailJob polls a shared/functional mailbox (owner-less, so the
link-only leaf cannot ingest it) and auto-links by case-number subject
regex, recording links through the leaf endpoint. Justified in new
openspec/architecture/adr-002-shared-mailbox-poller-exception.md.
openspec validate case-email-integration --strict: valid.
Contributor
Quality Report — ConductionNL/procest @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ❌ | ||||
| phpcs | ❌ | ||||
| phpmd | ❌ | ||||
| psalm | ❌ | ||||
| phpstan | ❌ | ||||
| phpmetrics | ❌ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ❌ | ❌ | |||
| npm | ✅ | ✅ 326/326 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-25 21:52 UTC
Download the full PDF report from the workflow artifacts.
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.
Summary
Intercepts the not-yet-implemented
case-email-integrationOpenSpec change so it consumes the OpenRegisteremailintegration leaf (NC Mail; idemail, groupcomms, storagelink-table) for all email display, compose, link, and unlink — instead of building a bespoke IMAP poller / SMTP composer / threading UI. Artifacts only; no code.Per hydra ADR-022 ("integrate, don't build") + ADR-019 (integration registry) + ADR-024 (app manifest). The
emailleaf is link-only (NC Mail owns compose/send) and ships a sidebar tab +CnEmailCardwidget surfaced on thecasedetail page.Re-pointed to the leaf (removed from the change)
emailMessage/emailThreadschemas (linked emails live in the leaf link-table)CaseEmailServicesend/transport, SMTP send config,test-smtpEmailComposer.vue,EmailThread.vue,EmailTab.vue,UnlinkedQueue.vuePOST/GET /api/cases/{caseId}/emails,/api/emails/unlinked,.../link,.../discardDisplay = leaf tab +
CnEmailCard; compose = NC Mail; link = leafPOST /api/objects/{register}/{schema}/{id}/email.Kept in-app as leaf extensions (no leaf equivalent)
emailTemplateschema +EmailTemplateServiceversioning + Dutch defaults — per-zaaktype templating that prefills an NC Mail draft (no procest send path).caseDocumentarchival + retry job — Archiefwet / ZGW informatieobject compliance; the leaf does not archive.Documented ADR-022 exception
InboundEmailJobpolls a shared/functional mailbox (zaken@gemeente.nl) that has no per-user NC Mail account owner — the link-only leaf cannot ingest it unattended (requiresPermission()→ null; per-user access only). The poller is scoped strictly to ingest + case-number subject auto-link, recording every link through the leaf endpoint. Justified in newopenspec/architecture/adr-002-shared-mailbox-poller-exception.md(references ADR-022 § Exceptions clause 1, with a sunset/migration clause).Validation
openspec validate case-email-integration --strict→ valid.🤖 Generated with Claude Code