docs: narrow AdreMa ownership to address provider

This commit is contained in:
2026-07-31 14:52:49 +02:00
parent 0c3d4eecb6
commit 90a507d9a4
4 changed files with 33 additions and 437 deletions
+8 -7
View File
@@ -5,9 +5,8 @@
<!-- govoplan-repository-type:end --> <!-- govoplan-repository-type:end -->
`govoplan-addresses` is the reusable address and recipient-source module. It `govoplan-addresses` is the reusable address and recipient-source module. It
owns long-lived address directories and makes them available to campaigns, owns long-lived address directories and contact points and makes them available
mail, forms, reporting, portal, and postbox modules through platform to consumers through platform capabilities.
capabilities.
The campaign module may import campaign-local recipient tables, but reusable The campaign module may import campaign-local recipient tables, but reusable
address management belongs here. address management belongs here.
@@ -54,9 +53,9 @@ deletion because Addresses cannot prove that it owns them.
`govoplan-addresses` owns: `govoplan-addresses` owns:
- Adrema-style person, organization, household, and postal-address records - scoped address books, vCard-compatible contacts, and postal/email/phone
- reusable email address lists and postal-letter recipient views contact points
- segments and reusable recipient-source definitions - classical address-only lists and recipient-source views
- consent, legal-basis, and communication-preference metadata - consent, legal-basis, and communication-preference metadata
- deduplication, merge, and address quality workflows - deduplication, merge, and address quality workflows
- import/export of reusable address directories - import/export of reusable address directories
@@ -69,6 +68,8 @@ It must not own:
- SMTP/IMAP transport - SMTP/IMAP transport
- file storage - file storage
- global identity authentication or RBAC evaluation - global identity authentication or RBAC evaluation
- typed IDM groups, identity relationships, organization structures, or
effective function assignments
- operational distribution lists/`Verteiler` with mixed recipient types - operational distribution lists/`Verteiler` with mixed recipient types
## First Capabilities ## First Capabilities
@@ -112,4 +113,4 @@ decision path, but consumers should not import or duplicate policy logic.
- [Address module architecture](docs/ADDRESS_MODULE_ARCHITECTURE.md) - [Address module architecture](docs/ADDRESS_MODULE_ARCHITECTURE.md)
- [Implementation plan](docs/IMPLEMENTATION_PLAN.md) - [Implementation plan](docs/IMPLEMENTATION_PLAN.md)
- [AdreMa capability assessment](docs/ADREMA_CAPABILITY_ASSESSMENT.md) - [AdreMa capability assessment and Distribution Lists roadmap](https://git.add-ideas.de/GovOPlaN/govoplan-dist-lists/src/branch/main/docs/ADREMA_CAPABILITY_ASSESSMENT.md)
+22 -10
View File
@@ -17,7 +17,7 @@ targets layered on top of the same local model and sync contracts.
`govoplan-addresses` owns: `govoplan-addresses` owns:
- scoped address books - scoped address books
- contacts, organizations, households, and postal/email/phone address data - vCard-compatible contacts and postal/email/phone contact-point data
- vCard import/export and vCard-compatible field mapping - vCard import/export and vCard-compatible field mapping
- reusable recipient sources and classical address lists - reusable recipient sources and classical address lists
- contact tags, categories, communication preferences, consent, and legal basis - contact tags, categories, communication preferences, consent, and legal basis
@@ -31,9 +31,12 @@ It does not own:
- mail transport, mailbox access, or delivery queues - mail transport, mailbox access, or delivery queues
- calendar events or iCalendar event storage - calendar events or iCalendar event storage
- global identity authentication or authorization decisions - global identity authentication or authorization decisions
- organization structure or internal function assignments - IDM identities, typed groups, effective-dated relationships, or identity
- operational distribution lists/`Verteiler` with mixed users, identities, lifecycle state
groups, functions, roles, raw recipients, and nested lists - organization structures, units, function definitions, or function
assignments
- operational distribution lists/`Verteiler` with mixed address contacts, IDM
identities/groups, functions, raw targets, Dataflow rows, and nested lists
## Scopes ## Scopes
@@ -55,7 +58,8 @@ fields:
- name components and formatted names - name components and formatted names
- nicknames and display names - nicknames and display names
- email addresses, phone numbers, postal addresses, URLs, notes, categories - email addresses, phone numbers, postal addresses, URLs, notes, categories
- organizations, titles, roles, departments, and relationships - organization, title, role, department, `KIND`, and `RELATED` values needed for
vCard round-trip compatibility
- birthday/anniversary where allowed by policy - birthday/anniversary where allowed by policy
- photos/avatars where storage and privacy policy allow them - photos/avatars where storage and privacy policy allow them
- calendar or scheduling addresses where present - calendar or scheduling addresses where present
@@ -180,12 +184,20 @@ stable IDs while keeping their own domain evidence. Cross-module UI must hide
write actions when no writable target exists, or show the writer decision write actions when no writable target exists, or show the writer decision
message when a disabled action remains visible for context. message when a disabled action remains visible for context.
Operational distribution lists belong in `govoplan-dist-lists`. They may later Operational distribution lists and reusable dynamic segments belong in
consume address lists as one entry type, but they own mixed recipient expansion `govoplan-dist-lists`. They may consume address lists as one entry type, but
for users, identities, organization units, groups, functions, roles, raw they own mixed recipient expansion for address contacts, IDM identities and
recipients, and nested lists. Workflow and Tasks own `Umlauf` execution state; typed groups, organization units, functions/effective incumbents, raw targets,
Dataflow-backed rows, and nested lists. Workflow owns `Umlauf` execution state;
distribution lists define who is included, not how work circulates. distribution lists define who is included, not how work circulates.
Organizations owns unit and function definitions. IDM owns effective-dated
identity-to-function assignments and typed group relationships. Identity
lifecycle status is not a business audience status; a selectable business
status is represented by a group, function, or effective-dated relationship.
Addresses may link contact points to stable provider references without copying
those provider-owned facts.
## Deferred Work ## Deferred Work
The following are valuable but not required for the first functional milestone: The following are valuable but not required for the first functional milestone:
@@ -193,6 +205,6 @@ The following are valuable but not required for the first functional milestone:
- automatic deduplication and merge suggestions - automatic deduplication and merge suggestions
- two-way sync conflict UI - two-way sync conflict UI
- Microsoft/Google connectors - Microsoft/Google connectors
- household and relationship editing - richer vCard `KIND`/`RELATED` round-trip and provider-reference linking
- advanced consent-policy automation - advanced consent-policy automation
- contact activity timeline across all modules - contact activity timeline across all modules
-418
View File
@@ -1,418 +0,0 @@
# AdreMa Capability Assessment
## Purpose
This document records a behavior-level assessment of the historical AdreMa
application supplied in `/mnt/DATA/tmp.tar`. The goal is not to reproduce its
implementation or UI. The goal is to preserve the useful administrative
capabilities while replacing hard-coded queries and output paths with
governed, reusable GovOPlaN contracts.
The archive was inspected as untrusted historical material. No archived code
was executed. Generated documents and record-level output were excluded from
the analysis.
## Evidence And Handling
- Archive SHA-256:
`328edbaf05df084f9c63cc3b9b36f7c5ae0c639942be4b7ad830efc0905a311b`
- Compressed size: about 1.49 GB
- Inventory: 8,966 files and 190 directories
- Uncompressed payload: about 1.79 GB
- The AdreMa selection UI contains 258 distinct segment variables, 265 query
cases, 13 sort definitions, seven action definitions, and 24
department-specific forms.
- The adjacent configurable list/report layer contains 47 ETI definitions.
- The wider print-server archive contains 127 SQL files, 181 XSLT files, and 82
Python workflow sources.
The archive contains generated person-level documents and embedded
credentials. It must not be committed, copied into test fixtures, or treated as
safe sample data. Any credential that could still be valid must be rotated.
Future fixtures derived from this assessment must be synthetic.
## What AdreMa Actually Is
AdreMa is not primarily a master address database. It is a role-specific
audience selection and output application over authoritative institutional
databases.
Its main flow is:
1. Authenticate against a directory.
2. Show a menu of saved recipient selections permitted for the current user or
department.
3. Run a fixed SQL selection against organization, person, employment,
function, student, geography, and address data.
4. Apply a selected sort order and address variant.
5. Produce a table, spreadsheet, label preview, label file, central print job,
or BCC mail draft.
6. Record a basic process log and recipient count.
The broader print-server application adds SQL-to-XML extraction, XSLT
transformation, HTML/Excel output, TeX/PDF generation, batch letters, PDF
protection, printer selection, and direct print-queue submission.
This means an AdreMa replacement should not be one large Addresses feature.
It is a vertical composition of Addresses, Organizations/IDM, Datasources,
Connectors, Dataflow, Distribution Lists, Templates, Campaign, Files, Audit,
Policy, Reporting, Workflow, and a future print-delivery capability.
## Observed Functional Model
### Sources And Identities
The application reads live authoritative data rather than maintaining a
separate copy. Its selections use:
- people and institutional units
- functions and role assignments
- employment and student state
- effective dates and exclusions
- internal and external organizations
- geography, country, and postal-code ranges
- source-specific person, registration, and unit identifiers
Access to selections is hard-coded by user and department. Administrative
users receive the union of those menus.
### Contact And Address Semantics
Observed recipient fields include:
- display name, given name, family name, title, and formal salutation
- organization/unit and function context
- phone, fax, email, and URL
- `care of`/`for the attention of` lines
- street, postal code, locality, country, and internal mail routing
- person, registration, and organizational-unit identifiers
- address purpose variants such as private, semester, home, business, service,
and correspondence address
- effective employment or membership data used to decide eligibility
The legacy system also allows a requested number of labels for an individual
recipient. That quantity belongs to an output job, not to the canonical address
record.
### Recipient Selection
Selections cover several distinct patterns:
- static categories of institutional units
- people assigned to a function or organizational level
- current-state selections with effective-date rules and exclusions
- geographic and demographic selections
- combinations and unions of predefined audiences
- explicit person or unit lookup by source identifier
- department-specific variants of a shared audience
- user-selected additional predicates and sort orders in the adjacent ETI
report layer
The important reusable abstraction is therefore a versioned, parameterized,
permissioned segment definition. The 265 query branches must not become 265
new backend endpoints.
### Output
The directly observed output modes are:
- on-screen recipient table with contact and postal fields
- spreadsheet export
- plain-text label preview
- generated label file
- emailed label file
- central label printing
- BCC mail draft
The adjacent print-server flows additionally produce:
- formatted lists and grouped reports
- personalized letters and notices
- HTML, spreadsheet-compatible, TeX, PostScript, and PDF artifacts
- printer-specific layouts and direct print jobs
- password-protected output and combined document bundles
### Configuration
The ETI layer is an early configuration-driven report system. A definition can
declare:
- a SQL source
- named optional filter predicates
- named sort orders
- list and label layouts
- page, line, margin, repetition, and format settings
- screen or spreadsheet output
That is conceptually close to a GovOPlaN combination of a Dataflow template,
typed output template, and Report/Campaign run configuration.
## Legacy Limitations We Should Not Reproduce
- users, departments, permissions, query variants, and output paths are
hard-coded
- credentials are embedded in source files
- request values are interpolated into SQL and shell commands
- authentication, authorization, session transfer, and application routing are
coupled
- selection names do not carry version, owner, purpose, legal basis, or
provenance
- past output cannot be reproduced reliably after source data or query code
changes
- exclusions and exceptional recipients are hidden inside SQL
- there is no first-class consent, suppression, address-quality, or duplicate
resolution model
- mail generation relies on client-side `mailto` BCC links
- print operations have weak status, retry, cancellation, and evidence
handling
- temporary files and generated artifacts are not governed records
- the UI does not explain why a recipient was included, excluded, or
inaccessible
## Current GovOPlaN Coverage
| Capability | Current state | Primary owner |
| --- | --- | --- |
| Scoped address books and contacts | Implemented | Addresses |
| Multiple email, phone, and postal contact points | Implemented | Addresses |
| Static address lists | Implemented | Addresses |
| vCard import/export and CardDAV sync | Implemented | Addresses |
| Read-only lookup and immutable email-recipient snapshots | Implemented | Addresses |
| Source provenance and sync conflicts | Implemented | Addresses |
| Governed source catalogue, snapshots, and frozen states | Implemented first slice | Datasources |
| Connector-backed tabular acquisition and preview | Implemented first slice | Connectors |
| Graphical/SQL transformations, joins, filters, expressions, quality, and reconciliation | Implemented broad first slice | Dataflow |
| Campaign snapshots, review, mail delivery, and evidence | Implemented for mail | Campaign/Mail |
| Typed template library and document rendering | Scaffold/issue only | Templates |
| BI reports and spreadsheet-grade exports | Scaffold/issue only | Reporting |
| Mixed operational distribution lists | Contract/implementation issues only | Distribution Lists |
| Dynamic address segments, consent, suppression, and preferences | Open issue | Addresses |
| Deduplication, merge, quality, and complete history | Open issue | Addresses |
| Postal recipient resolution and channel-neutral snapshots | Missing | Addresses |
| Direct governed print jobs | Missing | Future Print module plus connector providers |
| End-to-end guided AdreMa workflow | Missing | Workflow plus consuming modules |
## Target Architecture
### 1. Canonical Parties And Contact Points
Addresses should model locally managed parties while linking, rather than
duplicating, authoritative IDM and Organizations records.
Required additions:
- party kind: person, organization, household, group, or location
- formal and display-name components, locale, title, and salutation
- optional stable references to identity, organization, unit, and function
providers
- typed relationships such as member, employee, office holder, household
member, assistant, or care-of contact
- effective dates and provenance on relationships and contact points
- postal fields for care-of/addressee lines, PO boxes, country codes, internal
mail routes, and delivery instructions
- purpose and preference metadata for private, business, service,
correspondence, billing, and other address uses
The model must remain usable when IDM or Organizations is absent. Optional
provider links enrich a local party; they do not make those modules hard
dependencies.
### 2. Governed Segments
Addresses owns the address-domain segment definition and user experience.
Dataflow evaluates complex tabular predicates, while Datasources and Connectors
provide governed inputs.
A segment needs:
- immutable definition revisions
- system, tenant, group, and user scope
- complete-flow versus reusable-template semantics
- parameters with types, defaults, constraints, and permitted overrides
- explicit include, exclude, and manual-override sets
- source fingerprints and freshness requirements
- preview, count, sample, and "why included/excluded" diagnostics
- schedule/event refresh policy where materialization is wanted
- owner, purpose, legal basis, retention, and policy provenance
- materialized/frozen recipient snapshots for reproducible use
Simple tag/contact filters can execute in Addresses. Cross-source joins and
complex expressions should compile to a Dataflow revision rather than creating
a second query engine.
### 3. Recipient Resolution
The current recipient-source DTO is email-oriented. AdreMa parity needs a
versioned channel-neutral contract that can resolve:
- email targets
- postal targets
- internal-mail targets
- postbox targets where Postbox is installed
- unresolved or blocked targets with stable reason codes
Resolution must consider:
- requested channel and communication purpose
- effective date
- preferred address/contact point
- explicit address-purpose selection and fallback rules
- locale and international postal formatting
- consent, legal basis, suppression, and policy decisions
- duplicate targets and household/organization grouping
- source revision, selected contact-point ID, and complete provenance
Consumers freeze the resolution result. They never retain only a live pointer
to an address list or segment.
### 4. Static And Operational Lists
The existing split remains correct:
- Addresses owns address-only lists and address-domain segments.
- Distribution Lists owns mixed operational `Verteiler` containing address
records, identities, users, groups, organization units, functions, roles,
raw targets, and nested distribution lists.
- Workflow/Tasks owns an `Umlauf` with ordering, state, deadlines, escalation,
and decisions.
Distribution-list entries need stable IDs. A consumer stores an immutable
expansion snapshot. Consumer-specific enrichment belongs to that consumer;
reusable derived lists are separate, revision-pinned definitions.
### 5. Templates, Artifacts, And Delivery
Templates should provide typed render contracts for:
- labels and label sheets
- envelopes
- form and serial letters
- email and postbox messages
- list/report layouts
Templates declare required fields and output capabilities. Rendering produces a
managed Files artifact with template revision, input snapshot hash, renderer
version, page/count summary, and diagnostics.
Campaign should orchestrate postal batches in the same way it orchestrates
mail: freeze recipients, validate required fields, review exceptions, render,
approve, deliver or export, reconcile outcomes, and retain evidence.
Direct physical printing deserves a dedicated domain boundary once implemented:
- Print owns printers, queues, jobs, status, cancellation, retry, accounting,
secure release, and job evidence.
- Connectors supplies IPP/CUPS, Windows print-server, or provider-specific
connection profiles.
- Campaign, Templates, Files, and Workflow consume a versioned print capability.
Downloading a generated PDF is a valid deployment without Print installed.
Matching AdreMa's direct central-print behavior requires Print.
### 6. Governance And Quality
Parity is not sufficient without:
- purpose- and channel-specific consent/legal-basis records
- do-not-contact and returned/invalid-address suppression
- normalization and validation with original-value preservation
- duplicate candidates, survivorship rules, manual merge/split, and undo
evidence
- field-level provenance and source-of-truth precedence
- stale-source and stale-segment warnings
- field/row/export policy decisions with user-readable explanations
- complete audit events for read, export, resolution, merge, rendering, and
delivery
- retention, legal hold, and deletion behavior for source records and frozen
output evidence
### 7. Guided User Experience
The default journey should be:
1. Choose or create an address list/segment.
2. Preview the authorized audience and inspect included, excluded, duplicate,
invalid, and suppressed counts.
3. Select channel, address purpose/fallback, sort, and grouping.
4. Freeze a recipient snapshot.
5. Select a compatible template/output format.
6. Review individual exceptions and approve the run.
7. export, send, or print through available capabilities.
8. inspect progress, outcomes, returned items, and evidence.
Workflow may package this as a reusable guided process and activate a focused
View. Every underlying resource must remain independently accessible and
permission-checked.
## Representative Golden Flow
Before migrating any historical selection, build a synthetic AdreMa fixture
covering:
- people, organizations, units, functions, and effective-dated assignments
- multiple postal-purpose variants and internal mail
- a function-based segment
- an organization-unit segment
- a geography-based segment
- a union of segments
- explicit inclusion and exclusion
- duplicate and suppressed recipients
- deterministic sorting and address fallback
- frozen postal and email snapshots
- label, spreadsheet, and letter output expectations
The fixture should assert exact recipient IDs, selected contact-point IDs,
ordering, exclusion reasons, source fingerprints, and output hashes. It must
contain no archived record-level data.
## Migration Strategy
Do not translate the legacy source one query branch at a time into application
code.
1. Inventory each still-relevant named selection with owner, purpose, legal
basis, source systems, parameters, output type, and expected use frequency.
2. Retire obsolete and duplicate selections before migration.
3. Map source tables to governed Connector/Datasource definitions.
4. Convert reusable predicates into Dataflow templates or simple
Addresses-owned filters.
5. compare the new result against an authorized legacy run using counts and
pseudonymized stable keys.
6. approve and version the new segment.
7. migrate output layouts into typed Templates.
8. retain a migration report and decommission the corresponding legacy path.
## Recommended Delivery Order
### Priority 1: Functional Parity Foundation
1. Typed party, relationship, address-purpose, and effective-date model.
2. Channel-neutral recipient resolution with postal snapshots.
3. Dynamic governed segments through Dataflow/Datasources.
4. Synthetic AdreMa golden-flow fixture.
5. Typed label, envelope, and letter templates with managed artifacts.
### Priority 2: Operational Parity
1. Campaign postal-batch review and output flow.
2. Spreadsheet/report exports with exact frozen-snapshot evidence.
3. Consent, suppression, preferences, deduplication, merge, and quality UI.
4. CSV/XLSX and directory/database migration profiles.
5. Distribution-list expansion and Campaign integration.
### Priority 3: Beyond AdreMa
1. Direct governed print jobs and secure release.
2. returned-mail and correction workflows.
3. postal-provider/franking integration and delivery reconciliation.
4. scheduled/event-driven segment refresh and recurring campaigns.
5. address analytics, geocoding where policy permits, and quality trends.
## Completion Standard For The Umbrella Feature
The AdreMa umbrella is complete when a user can define or reuse a permissioned
audience, explain and freeze the exact recipients, create reviewed label/letter
or digital outputs, send/export/print through installed modules, and later
prove exactly which source data, rules, template, actor, and delivery outcome
were involved. The same flow must degrade cleanly when optional modules such as
Mail, Campaign, Templates, Workflow, Reporting, or Print are absent.
+3 -2
View File
@@ -216,12 +216,13 @@ Tasks:
- Exchange/Microsoft 365 contacts connector - Exchange/Microsoft 365 contacts connector
- Google Contacts connector - Google Contacts connector
- CSV/XLSX/LDIF import mapping profiles - CSV/XLSX/LDIF import mapping profiles
- classical address-list UI and static/dynamic address-domain segments - classical address-list UI; reusable static/dynamic operational segments move
to `govoplan-dist-lists`
- operational distribution lists move to `govoplan-dist-lists` - operational distribution lists move to `govoplan-dist-lists`
- consent, legal-basis, suppression, and communication preferences - consent, legal-basis, suppression, and communication preferences
- deduplication and merge workflow - deduplication and merge workflow
- address quality checks and normalization - address quality checks and normalization
- relationship/household/organization editing - richer vCard `KIND`/`RELATED` round-trip and stable links to IDM/Organizations
Exit criteria: Exit criteria: