# GovOPlaN Capability and IT-Infrastructure Fit Assessment ## Assessment record | Field | Value | | --- | --- | | Assessment ID | `campaign-reference-2026-07-22` | | Schema | `govoplan.fit-assessment/0.1.0` | | Assessed on | 2026-07-22 | | Product snapshot | Live Ed25519-signed stable catalog sequence `202607220843`: Core `v0.1.13` and Campaign `v0.1.10` | | Configuration basis | Root `.env.example` and the production-like development profile | | Scope | Campaign-centric internal pilot and small-production candidate | | Explicitly postponed | Workflow and workflow-driven user stories | | Machine-readable companion | [`capability-fit-current.json`](capability-fit-current.json) | | Input schema | [`capability-fit.schema.json`](capability-fit.schema.json) | This is a fit assessment, not a production approval or security certification. It deliberately does not infer implementation from a repository, issue, or manifest existing. A conclusion needs code plus a route/contract, test, operational drill, configured example, or explicit evidence that the capability is absent. The release baseline below is reproducible at its tagged source and package references. Later main-branch commits do not become release capabilities merely because they are committed, pushed, or code-tested. This assessment therefore distinguishes code-tested, package-integrated, target-tested, and production-approved evidence explicitly. ## Controlled status vocabulary | Status | Meaning | | --- | --- | | `verified` | The stated capability is implemented and directly exercised by evidence appropriate to the stated scope. Conditions and target-environment proof may still remain. | | `available_unconfigured` | An implementation and supporting evidence exist, but the target endpoint, credentials, policy, or deployment component has not been configured and exercised. | | `partial` | A useful subset exists, but one or more material parts of the stated journey or operational requirement are missing or unproved. | | `scaffold` | Contracts, models, routes, or UI structure exist, but the end-to-end capability is not yet usable. | | `external_system` | GovOPlaN expects the deployment or another system to supply this capability; integration requirements must still be assessed. | | `planned` | The capability is represented only by a concept, backlog item, or design direction. | | `not_fit` | Evidence shows that the current composition cannot meet the stated requirement. | | `not_assessed` | The requirement or target environment is not sufficiently known to reach a conclusion. | Status alone is not enough. Every row also states its evidence scope and conditions. For example, a unit-tested SMTP adapter is `available_unconfigured`, not `verified` for an organization's mail system. ## Executive conclusion GovOPlaN is a credible candidate for a controlled, Campaign-centric internal pilot using local accounts, PostgreSQL, durable single-node file storage, and a non-production SMTP/IMAP service. The module contract, Campaign authoring and validation paths, managed attachments, mail-profile boundary, local audit records, and operator status surface all have direct code/test evidence. The signed catalog resolves the earlier source/package reproducibility gap, but it does not make the composition production-approved. The production-like profile intentionally runs only PostgreSQL and Redis in containers; API, WebUI, worker, and scheduler processes still run from editable source trees. A target deployment must supply TLS termination, process supervision, secret injection, monitoring, backup storage, and recovery procedures. The open [Core backup/restore issue #29](https://git.add-ideas.de/add-ideas/govoplan-core/issues/29) is a production gate. Identity federation, external audit export, and a tested disaster-recovery plan are also not complete. The current recommendation is therefore: - **Pilot:** fit with conditions and a bounded proof of concept. - **Small production:** partial fit; do not approve until the proof checks and operational gates below pass against the signed release and target environment. - **Workflow:** planned and postponed; it is not part of either recommended composition in this assessment. ## Pinned composition The configured reference composition comes from the meta repository's `ENABLED_MODULES`. Versions and refs below are pinned by the live stable catalog; commits are the commits peeled from those annotated tags. | Module | Tagged source commit | Catalog version/ref | Role in this assessment | | --- | --- | --- | --- | | Core runtime | `govoplan-core@d487726f4d2c` | `0.1.13` / `v0.1.13` | API, registry, migration orchestration, shared WebUI, sessions and kernel contracts | | `tenancy` | `govoplan-tenancy@efbec827616b` | `0.1.8` / `v0.1.8` | tenant context and lifecycle | | `organizations` | `govoplan-organizations@39c081c4fb8f` | `0.1.8` / `v0.1.8` | organization model | | `identity` | `govoplan-identity@7a1710af896f` | `0.1.8` / `v0.1.8` | normalized internal identity directory | | `access` | `govoplan-access@f1d64d247e12` | `0.1.11` / `v0.1.11` | local authentication, sessions, API keys and RBAC | | `admin` | `govoplan-admin@11ecf362a36d` | `0.1.8` / `v0.1.8` | administration surfaces | | `dashboard` | `govoplan-dashboard@4b960ad37f0d` | `0.1.8` / `v0.1.8` | module-aware home surface | | `policy` | `govoplan-policy@1063622d311a` | `0.1.9` / `v0.1.9` | policy explanation/configuration boundary | | `audit` | `govoplan-audit@d3d2c60d7dc1` | `0.1.8` / `v0.1.8` | database audit records and retrying audit outbox | | `campaigns` | `govoplan-campaign@735e874bd03c` | `0.1.10` / `v0.1.10` | Campaign authoring, build, delivery control and reporting | | `files` | `govoplan-files@2b34f6e30578` | `0.1.9` / `v0.1.9` | managed files and Campaign attachments | | `mail` | `govoplan-mail@3e2302909022` | `0.1.10` / `v0.1.10` | SMTP/IMAP profiles and transports | | `calendar` | `govoplan-calendar@9bcf41bb1fbb` | `0.1.8` / `v0.1.8` | optional calendar; not needed by the Campaign pilot | | `docs` | `govoplan-docs@be52b716caed` | `0.1.10` / `v0.1.10` | configured-system documentation | | `ops` | `govoplan-ops@341773a4ff8a` | `0.1.8` / `v0.1.8` | readiness and deployment-profile visibility | Stable catalog sequence `202607220843` is valid, signed by trusted key `release-key-1`, and pins matching Python and WebUI refs where applicable. This proves release source/package selection and provenance, not behavior in a target environment. No configuration revision/package is pinned yet, so deployment configuration remains a separate reproducibility and promotion gate. The static contract scan found 43 interface contracts, 33 providers, and no contract errors in the current workspace. That proves the scanned manifest graph is internally consistent; it does not prove every provider or production journey. `govoplan-addresses@93dddbb8c52a` (`0.1.9` / `v0.1.9`) is an optional catalogued extension for reusable recipient sources. It is not enabled in the pinned root profile and must be added explicitly when the pilot needs address lists or CardDAV. ## Recommended scenarios ### Campaign pilot Use one internal tenant or office, controlled operators, local GovOPlaN accounts, and non-critical recipient volumes. Enable: ```text tenancy,organizations,identity,access,admin,dashboard,policy,audit,campaigns,files,mail,docs,ops ``` Add `addresses` only when reusable address books/lists or CardDAV are in scope. Leave Calendar and Workflow out unless the pilot has an explicit journey for them. The minimum topology is one supervised API process, one built WebUI, one PostgreSQL database, durable local file storage, and one Redis/Celery worker when asynchronous delivery is enabled. Use a dedicated non-production SMTP/IMAP account and a restricted recipient allow-list. ### Small-production candidate Use a reverse proxy/TLS endpoint, built WebUI assets, separately supervised API and worker processes, PostgreSQL with measured backup/restore, Redis with persistence, and durable shared or object storage. Run one scheduler only when a selected module needs scheduled recovery. Multiple scheduler replicas require leader election or an external lock, which is not established by this report. This topology is a recommendation from the [Ops scalability profiles](https://git.add-ideas.de/add-ideas/govoplan-ops/src/branch/main/docs/SCALABILITY_PROFILES.md), not a currently shipped production Compose/Kubernetes/systemd package. ## Functional capability matrix | Capability | Status | Evidence and scope | Conditions, gaps, or exclusions | | --- | --- | --- | --- | | Module-aware API/WebUI composition | `verified` | Core registry tests cover installed manifests, route contribution, missing modules, and module permutations; the static contract scan passed; stable catalog sequence `202607220843` has a valid trusted signature and matching package refs. | Package integration is verified; repeat the module-permutation checks on the installed target composition. | | Local tenants, accounts, sessions, API keys and RBAC | `verified` | Access/tenancy manifests, auth dependency tests, cookie/CSRF API smoke tests, and role/permission contracts. | External identity providers are not included in this conclusion. | | Campaign draft authoring, validation, recipient import, build, execution snapshot and mock send | `verified` | Core API smoke tests exercise create/validate/build/mock-send, frozen delivery configuration, policy gates, job deltas and reconciliation; Campaign-focused tests passed; Campaign `v0.1.10` and Core `v0.1.13` are package-integrated in the signed stable catalog. | Code and package integration are verified; usability and target-provider acceptance remain separate. | | Managed Campaign attachments and local file storage | `verified` | Files capability/route tests, Campaign attachment-build tests, and local-storage backend code. | The deployment must provide a durable path and include files in database/storage backup plans. | | SMTP send, IMAP append and mailbox/profile policy | `available_unconfigured` | Mail adapters, encrypted profile model, helper tests, Campaign mail-policy smoke tests, and a GreenMail-oriented runbook/testbed. | No target mail server, TLS chain, throttling, sender policy, bounce/reply process, or real delivery receipt was exercised here. | | Delivery retry, uncertainty and reconciliation | `partial` | Campaign API smoke tests include worker-loss/outcome-unknown reconciliation and frozen job evidence; those paths are present in catalogued Campaign `v0.1.10`. | A target-provider failure drill and operational alerting are still required; package integration does not prove provider behavior. | | Reusable address lists and Campaign recipient-source integration | `available_unconfigured` | Address list/recipient capability and Campaign optional lookup tests passed; manifests expose optional interfaces. | `addresses` is not in the pinned profile. Configure permissions and data governance before use. | | CardDAV address synchronization | `available_unconfigured` | Discovery, preview/conflict, two-way create/update/delete and disconnect tests passed in the current Addresses workspace. | Requires target-server interoperability, credentials, CA/TLS, rate-limit, conflict and restore drills. | | File connectors (WebDAV/Nextcloud/Seafile/SMB/S3 import) | `partial` | Provider descriptors and browse/import helper tests exist; S3 connector tests passed. | Coverage varies by provider and optional dependency. No target content system was exercised; connector egress and provenance policy need review. | | Local audit log and governed-event retry outbox | `verified` | Audit module contract plus enqueue/dispatch/failure-for-retry tests passed. | Central audit/SIEM export, retention enforcement and operational monitoring are not verified. | | Configured-system documentation and Ops status pages | `verified` | Docs/Ops manifests contribute protected routes and WebUI packages; Ops code checks database, Redis, workers, storage and deployment-security settings. | This does not replace external monitoring or a target runbook. | | Calendar/CalDAV integration | `partial` | Calendar `v0.1.8` supplies the catalogued storage/sync foundation. The durable external-write outbox, worker recovery, reconciliation, and retention work is committed, tested, and pushed on Calendar `main` after that tag. | The post-tag outbox work is remote-integrated source, not local-only WIP, but it is not in the signed stable package baseline and has not passed a target CalDAV drill. Bulk synchronized-calendar migration semantics remain separate work. | | External LDAP/AD, OIDC/SAML or SCIM identity integration | `scaffold` | IDM owns normalized assignment APIs and documents connector boundaries. | Provider connectors, login callback flow and target directory reconciliation are not an implemented end-to-end capability. Use local accounts for this pilot. | | Export-control/embargo-list screening | `planned` | Product-level [GovOPlaN #12](https://git.add-ideas.de/add-ideas/govoplan/issues/12) defines the consumer-independent user story. | No screening provider, list provenance, matching policy, review flow or legal evidence exists in this composition. | | Workflow-driven journeys and views | `planned` | Workflow contracts/concepts exist outside this assessment. | Explicitly postponed. Do not include Workflow in pilot or production claims from this report. | ## Infrastructure matrix | Component | Status | Current evidence | Target requirement / gap | | --- | --- | --- | --- | | WebUI and API | `verified` | FastAPI app, module routes, shared WebUI host, health endpoint, dev smoke and module-permutation tests; the catalog pins matching Core/Campaign backend and WebUI refs. | Materialize and supervise immutable artifacts in the target; no production image/service bundle is supplied here. | | Background workers | `available_unconfigured` | Celery app, Campaign queues, Redis configuration and production-like launcher. | Run target broker/worker heartbeat and failure drills; split queues when provider limits or load justify it. | | Scheduler | `partial` | A separately launched Celery beat process exists; Calendar recovery scheduling is committed and pushed after the catalogued `v0.1.8` tag. | The Calendar recovery slice is not stable-package-integrated. Keep single-instance until leader election/locking is proved; add process supervision and missed-schedule alerts. | | PostgreSQL | `verified` | Production target in settings/operator docs, migration tracks and a disposable integration-check harness. | Target HA, patching, connection limits, WAL/archive policy and restore time are external deployment decisions. | | Redis/queues | `available_unconfigured` | Redis-backed Celery configuration, health ping and append-only production-like container. | Target availability, persistence, eviction, authentication/TLS and queue-loss behavior were not assessed. | | Local file storage | `verified` | Local backend, configured root, fallback-root tests and Ops writability check. | Suitable only for a durable single-node/shared path with backup; it blocks independent API scaling when node-local. | | S3-compatible object storage | `partial` | S3 backend and connector code plus mocked browse/import tests. | Exercise the chosen service, credentials, CA, versioning, lifecycle, multipart/size behavior, restore and consistency expectations. | | Reverse proxy and TLS | `external_system` | Core validates explicit CORS and secure-cookie posture; Ops reports unsafe production settings. | Deployment must provide certificates, proxy/header policy, request limits, logs and renewal monitoring. | | Local identity and authorization | `verified` | Password/session/API-key/RBAC capabilities and tests. | Establish account lifecycle, MFA expectation, protected bootstrap and break-glass procedure. | | Federated identity | `scaffold` | IDM boundary and assignment APIs. | Select and implement/test the actual OIDC/SAML/LDAP/SCIM path before requiring federation. | | Application secret encryption | `verified` | Stable `MASTER_KEY_B64` contract and encrypted mail-credential paths. | Rotation and loss-recovery procedure need target validation. | | Secret store and injection | `external_system` | Environment/file references are supported and templates avoid populated secrets. | Choose Vault/KMS/Kubernetes/systemd/environment mechanism, restrict access, rotate credentials and prevent secret exposure in logs/backups. | | SMTP/IMAP and other connectors | `available_unconfigured` | Protocol adapters and development testbeds. | Target endpoints, egress, DNS, CA, throttling, service accounts and data-processing terms remain environment-specific. | | Health/readiness | `verified` | `/health`, protected `/health/details`, and Ops checks for DB, Redis, workers, storage, maintenance and cookie/CORS posture. | Add external probes and distinguish liveness from dependency readiness for the chosen orchestrator. | | Metrics, logs and alerting | `partial` | Correlation IDs, slow-request/query metrics in logs, worker inspection and operator status are implemented. | No bundled metrics exporter, log collector, dashboards, queue-depth alerts, pager route or SLO is verified. | | Audit | `partial` | Local audit tables and retry outbox are verified. | Retention, tamper-evident export, privileged access review and SIEM integration are unproved. | | Backup and restore | `partial` | Operator guide and installer hooks describe `pg_dump`/`pg_restore`; SQLite and simulated installer rollback drills exist. | [Core #29](https://git.add-ideas.de/add-ideas/govoplan-core/issues/29) remains open. No target PostgreSQL + files + secrets restore drill or measured RTO/RPO exists. | | Disaster recovery | `not_assessed` | The Ops guide asks for RPO/RTO and restore drills. | No agreed RPO/RTO, off-site copy, failover topology, dependency recovery order, communications plan or exercise evidence was supplied. | The scalability and sizing documentation delivered the documentation portions of [Core #217](https://git.add-ideas.de/add-ideas/govoplan-core/issues/217) and [Core #219](https://git.add-ideas.de/add-ideas/govoplan-core/issues/219). [Core #28](https://git.add-ideas.de/add-ideas/govoplan-core/issues/28) records the operator-documentation slice. These closed tickets are evidence of documented models, not evidence that an organization's production environment has passed them. ## Trust, data-flow and network boundaries | Boundary / flow | Data and trust | Required controls | | --- | --- | --- | | Browser -> reverse proxy -> WebUI/API | Session and CSRF cookies, campaign content, recipient personal data and managed files cross the public/client boundary. | HTTPS, exact origins, secure cookies, request/body limits, tenant/RBAC enforcement, security headers and access logs. | | API -> PostgreSQL | Tenants, identities, permissions, campaign drafts/snapshots/jobs, connector metadata and audit evidence enter the primary trusted data store. | Dedicated DB identity, encrypted transport where networked, least privilege, migration control, backup/restore and retention. | | API/worker -> file/object storage | Campaign attachments and generated evidence may contain personal or confidential content. | Private buckets/paths, encryption, scoped credentials, malware/content policy where required, lifecycle and coordinated restore. | | API -> Redis -> worker | Queue messages and job identifiers cross from request processing to an asynchronous trust zone. PostgreSQL remains the durable business-state authority. | Private/authenticated broker, bounded payloads, idempotent claims, queue monitoring and worker isolation. | | Worker -> SMTP/IMAP | Recipient addresses, message bodies and attachments leave GovOPlaN; IMAP append stores a sent copy externally. | Approved service account, TLS/CA policy, recipient/sender policy, rate limits, outcome reconciliation and disclosure/legal basis. | | Connector worker -> CardDAV/WebDAV/Seafile/SMB/S3/CalDAV | Address data, files or calendars cross an organizational/system boundary in both directions depending on connector mode. | Explicit direction, scoped credentials, endpoint allow-list, provenance, conflict policy, retry/reconciliation and target interoperability test. | | Operator -> installer/catalog/migration plane | A highly privileged process can mutate packages, schemas and desired module state. | Separate operator identity, signed/pinned catalogs, maintenance mode, immutable run records, backups, rollback checks and restricted network access. | | API/audit -> monitoring or SIEM | Operational metadata and potentially personal audit context may leave GovOPlaN. | Data minimization, retention/access policy, authenticated transport, integrity and documented processor/location. No sink is verified today. | Typical network requirements are inbound HTTPS to the deployment proxy and private connectivity from API/workers to PostgreSQL and Redis. Outbound access may be required to SMTP submission, IMAP, HTTPS-based connectors/object storage, DNS, NTP, certificate validation, monitoring and the signed module catalog. Ports and destinations must come from the selected infrastructure; common defaults such as PostgreSQL 5432, Redis 6379, SMTP 465/587 and IMAP 993 are not an allow-list. ## Known assumptions, gaps and risks Facts: - The production-like profile is a development validation composition, not a production deployment artifact. - The assessed package baseline is the trusted, signed stable catalog sequence `202607220843`; it pins Core `v0.1.13` and Campaign `v0.1.10`. - Workflow is postponed. - The default composition does not enable Addresses. - Health/readiness checks exist; an external monitoring stack does not. Assumptions that require confirmation: - The pilot can use local accounts and one internal tenant/office. - A controlled non-production SMTP/IMAP account and safe recipients are available. - Campaign volume is below the measured limits of a single worker and database. - Local durable storage is acceptable for the pilot and all recipient data has an approved legal basis and retention policy. Highest risks: 1. A signed, reproducible package selection can still be installed or configured incorrectly and has not been accepted in the target environment. 2. Real SMTP/IMAP behavior, throttling and ambiguous outcomes have not been proven against the target provider. 3. Backup/restore and disaster recovery are not demonstrated across database, files, keys and deployment configuration. 4. External identity, monitoring, secret-store and reverse-proxy controls are deployment gaps rather than GovOPlaN-delivered components. 5. Post-tag Calendar work is committed and pushed but remains outside the signed stable package baseline; branch integration must not be mistaken for a release. 6. Data classification, retention, recipient consent/legal basis and external disclosure rules are not assessed for a concrete organization. ## Proof checks before promotion 1. Materialize the signed catalog into an isolated installation and rerun the contract, migration, module-permutation, and focused acceptance gates against the installed artifacts. 2. Run a target-like Campaign from import through validation, attachment build, queue, SMTP acceptance, IMAP append, reporting and audit using safe data. 3. Drill transient SMTP failure, accepted-but-local-commit-lost uncertainty, worker restart, Redis interruption and manual reconciliation without a duplicate send. 4. Restore PostgreSQL, managed files, configuration and encrypted credentials into an isolated environment; measure RPO and RTO. 5. Validate proxy/TLS, CORS, cookies, headers, body limits, account bootstrap, maintenance access and secret redaction. 6. Measure representative recipient/file volume, queue age, database growth, send rate and provider throttling; set capacity and alert thresholds. 7. Confirm audit/retention/privacy/legal requirements and any SIEM or archive export before using production personal data. ## Reusable assessment questionnaire Answers should contain no secrets and no unnecessary personal data. Each answer must be marked `answered`, `assumed`, `not_applicable`, or `not_assessed` and may link evidence. ### Scope and outcomes - What outcome and reference journey must GovOPlaN support? - Which users, roles, tenants, organization units and delegated functions take part? - Which journey steps are mandatory, optional, manual, external, or explicitly postponed? - What constitutes pilot success and production acceptance? ### Data, privacy, records and policy - Which data classes enter database, files, messages, calendars, addresses, logs and audit evidence? - What are the legal basis, purpose, minimization, access, residency, retention, deletion, archive and legal-hold requirements? - Which external systems/processors receive data, and in which jurisdictions? - Which decisions require four-eyes approval, explainability or immutable evidence? ### Identity and integrations - Are local accounts acceptable, or are OIDC, SAML, LDAP/AD or SCIM mandatory? - What are the MFA, joiner/mover/leaver, service-account and break-glass rules? - Which SMTP/IMAP, file/DMS, CardDAV/CalDAV, ERP, API or event endpoints are in scope? Record protocol/version, direction, auth, CA, rate limit and owner. - Which integrations may be unavailable, and what degraded/manual behavior is acceptable? ### Workload and growth - Tenants, named/active/concurrent users and peak requests? - Campaigns per period, recipients per Campaign, send window, attachment sizes, import size and retry peak? - Managed files, database and audit volume now and over the retention window? - Connector batches, queue depth/age, scheduled jobs and external rate limits? ### Availability, hosting and operations - Required service hours, planned maintenance, availability, RPO and RTO? - Hosting, network zones, egress/proxy/DNS/NTP/CA, data-residency and air-gap constraints? - Who operates PostgreSQL, Redis, storage, TLS, identity, secrets, monitoring, backups and incident response? - What deployment, patch, migration, rollback, restore and DR drills must pass? ### Procurement and decisions - Required open-source/license, support, accessibility, security, certification, interoperability and procurement conditions? - Which requirements are blockers, accepted risks, residual risks or later roadmap work? - Who owns each decision, evidence item and next review date? For every capability and infrastructure conclusion, record the requirement, status from the controlled vocabulary, evidence scope, evidence links, assumptions, gaps, risks, recommendation and proof check. Reassessment must pin a new composition and review any row whose code, evidence, configuration or target requirement changed. ### Repeatable release rerun The release-aware rerun tool validates the machine-readable assessment against its JSON Schema, verifies the catalog's Ed25519 signature against an independently pinned local trust keyring, and separately verifies the canonical hash of the published or candidate keyring pinned by the signed catalog. The downloaded keyring is therefore never its own sole trust root. The tool compares catalog sequence and module versions and—when local checkouts are available—checks annotated release tags against assessed commits. For repositories represented in signed `release.selected_units`, both the peeled commit and annotated tag-object ID must match exactly; re-annotating an unchanged commit requires review. Release drift produces a machine-readable list of affected capability and infrastructure conclusions instead of silently carrying their prior status forward: ```bash ./.venv/bin/python tools/assessments/capability-fit.py \ --public \ --trusted-keyring /srv/govoplan/trust/catalog-keyring.json ``` Use `--catalog CATALOG --keyring PUBLISHED_OR_CANDIDATE_KEYRING --trusted-keyring PINNED_LOCAL_KEYRING` for an offline or release-candidate rerun. `GOVOPLAN_MODULE_PACKAGE_CATALOG_TRUSTED_KEYS_FILE` may provide the independently managed local trust-root path instead. During key rotation this local file may contain both current and `next` keys within their validity windows. Only `active` and `next` entries are trusted; unknown statuses, duplicate key IDs and malformed structured keyrings fail closed, while revoked, disabled and retired entries are ignored. Do not establish this trust file by downloading it in the same rerun. Public JSON responses are bounded to 16 MiB. Use `--json` or `--output PATH` for automation. Evidence and report files are written through a bounded same-directory atomic replacement, with mode `0600` and file and directory `fsync`. All parent directories must already exist, no parent component may be a symlink, and an existing symlink or non-regular output target is rejected. Exit status `0` means the assessed release metadata is current, `2` means explicit review is required, and `1` means the schema or trust checks are blocked. The machine report distinguishes independent signature trust, published-keyring hash agreement, and local-tag proof. Local-tag proof is only marked checked when every composition entry is available for comparison and was attempted. A successful rerun proves only the assessment schema, signed catalog metadata, published-keyring integrity and optional local tag provenance; it does not prove installed artifacts, target providers, target infrastructure, or production fitness. Those remain separate proof checks above. ### Installed-composition evidence The same rerun can inspect the Python environment in which it executes and bind that observation to the assessment and signed catalog: ```bash ./.venv/bin/python tools/assessments/capability-fit.py \ --public \ --trusted-keyring /srv/govoplan/trust/catalog-keyring.json \ --collect-installed-evidence /var/tmp/govoplan-installed-evidence.json \ --output /var/tmp/govoplan-fit-review.json ``` The collector follows the strict version `0.3.0` [`installed-composition-evidence.schema.json`](installed-composition-evidence.schema.json) contract. It enumerates all installed distributions whose normalized name starts with `govoplan-`, compares the enabled assessed package and module-manifest versions, and identifies missing, duplicate and extra GovOPlaN distributions. Those differences produce stable review targets for the affected composition entries and evidence-backed conclusions. For each distribution, the collector also: - reads the installed wheel `RECORD` file directly, with a 4 MiB metadata bound, rather than relying on an interpreted distribution file list; missing files, duplicate or malformed declarations, mismatched declared sizes and hashes all prevent a `verified` result; - verifies every supported SHA-256 wheel-payload declaration in that local metadata, within fixed limits of 256 GovOPlaN distributions, 10,000 files and 512 MiB hashed per distribution, 50,000 files and 2 GiB hashed for one collection, and 64 MiB for any single file; - accepts package-owned data-file targets below the installation prefix and declared `console_scripts`, while rejecting other traversal, undeclared scripts, paths outside the prefix and leaf symlinks before opening a file; - reports pip-generated, unhashed `__pycache__/*.pyc` entries separately only when their derived source is a hashed payload entry, including generated files below a confined package-owned runtime-data prefix; - labels every PEP 610 observation with the explicit `local-pep610-metadata` basis and distinguishes coherent declared Git commits and archive hashes from editable installs, local directories, package-index/unknown origins and malformed metadata; - compares a non-editable VCS commit with the assessment commit and, when one is present, the signed catalog `selected_units` commit; - records only package/module identifiers, versions, bounded counters, hashes and stable error codes. It never writes direct URLs, paths, hostnames, usernames, exception text or file contents. `RECORD` `verified` means complete matching coverage of the wheel payload declared by the local metadata, not every runtime byte and not a release-origin binding. The proof scope exposes the aggregate count of generated unhashed bytecode; runtime activation remains unchecked. `RECORD` agreement proves that payload files agree with installed metadata, but does not make self-consistent metadata a trusted release origin. Similarly, a version string is not artifact integrity. PEP 610 VCS metadata is accepted only for `vcs: git`, a full 40–64 hexadecimal commit, one mutually exclusive provenance form and a coherent bounded URL shape. Editable and directory-backed installs remain mutable even when their small editable-install `RECORD` is valid. Archive or index artifacts without a hash anchored by the assessed release remain unanchored. A matching declaration is reported under `installed_source_provenance` as local consistency only, with `release_origin_bound: false`. The separate `installed_release_origin` scope remains unchecked until an independently anchored artifact digest or signed installer receipt binds each installed payload to the signed catalog. The tool does not accept a digest merely asserted inside the installed evidence document. Only evidence produced in-process by `--collect-installed-evidence` is a local observation, and it must be no more than five minutes old (with at most 30 seconds of future clock skew) at the selected verification time. Use `--installed-evidence PATH` to compare evidence collected in a separate environment. Imported JSON is unsigned and therefore always carries a blocker: it can identify differences but cannot establish checked or valid installed proof. A future signed collector-attestation format is required to cross that boundary. The proof scope records observation mode, collection/evaluation time, freshness, and whether evaluation used current time or an explicit historical override. Evidence input and output are bounded to 4 MiB. Collection loads the `govoplan.modules` entry-point factories in order to read module IDs and manifest versions; that executes installed GovOPlaN manifest code. Run it only inside the installation being assessed and with the same isolation expected for other installed-artifact acceptance checks. This collector does not observe which modules a running service activated, migrations, configuration, health, or reference-journey behavior. Runtime activation therefore remains an explicit unchecked boundary. ### Target, provider and production proof boundary Installed evidence cannot approve a target environment, an external provider, or production use. These scopes use a separate, expiring [`capability-fit-boundary-evidence.schema.json`](capability-fit-boundary-evidence.schema.json) bundle. The bundle is bound to the assessment ID, assessment release and exact installed-evidence SHA-256 digest. It contains only opaque subject/control/result IDs and content hashes, not endpoints, credentials, people or raw result files. Boundary evidence is accepted only when at least one Ed25519 signature validates against a separately provisioned [`capability-fit-proof-authority-keyring.schema.json`](capability-fit-proof-authority-keyring.schema.json). Each authority key explicitly lists the scopes it may attest. Target and provider claims use `passed` or `failed`; production claims use `approved` or `rejected`. One claim per scope, unique control/artifact IDs, `issued_at < expires_at`, current validity and exact digest binding are mandatory. Any schema, binding, time, signature or authority blocker leaves every supplied boundary claim unchecked; one malformed authority member or invalid validity interval invalidates the supplied authority set as a whole. An authorized negative result is checked but requires review only after every prerequisite, including installed release-origin binding, is established. Signatures cover UTF-8 JSON with the `signatures` member omitted, object keys sorted, compact `,`/`:` separators and non-ASCII characters escaped, matching the tool's deterministic canonicalization. ```bash ./.venv/bin/python tools/assessments/capability-fit.py \ --public \ --trusted-keyring /srv/govoplan/trust/catalog-keyring.json \ --installed-evidence /srv/govoplan/evidence/installed.json \ --boundary-evidence /srv/govoplan/evidence/target-proof.json \ --boundary-authority-keyring /srv/govoplan/trust/proof-authorities.json \ --expected-external-provider-subject provider-production ``` With `--installed-evidence`, this command performs comparison and proof-binding diagnostics only: the imported installed document is unsigned, so neither it nor the boundary claim becomes accepted proof. Direct in-process collection removes that unsigned-import gap, but still establishes only local metadata consistency. No boundary claim is admitted by the current format because it has no separately anchored artifact digest or signed installer receipt. A future evidence contract must bind such an independently trusted release-artifact receipt to the installed evidence digest; a signed collector-attestation format should also make that exchange durable across processes. Target-environment and production-approval claims must use the assessment's `deployment_profile.id` as `subject_id`. External-provider claims require the operator to supply a bounded opaque expected subject with `--expected-external-provider-subject`; without it, such a claim remains unchecked and blocks. Expected and observed IDs are retained in proof scope. The authority keyring is a governance trust root. Do not download or generate it from the proof bundle being checked. The checker rejects proof-authority public keys reused by either the published or independently trusted catalog keyring, and rejects the same proof public-key material assigned to multiple authority IDs. A malformed key, an invalid or empty validity interval, or ambiguous key identity invalidates the supplied authority set. Authority `not_after` is exclusive. A target operator or approver must validate the referenced drill/result artifacts before signing. The rerun verifies the attestation and its bindings; it does not fetch or reinterpret those artifacts. `--verification-time` exists only for reproducible historical review. Supplying it always marks the machine and human report as a **HISTORICAL override**; callers cannot relabel it as current. Live admission must omit it and use the actual current time. No boundary bundle or production authority has been supplied for this current assessment. Target environment, provider and production proof therefore remain explicitly unchecked rather than inferred from the local GreenMail journey, source tests or signed release metadata. ## Evidence used in this slice - [Production-like profile](../dev/production-like/README.md) and [Compose dependencies](../dev/production-like/docker-compose.yml) - [Module contracts and install boundaries](MODULE_CONTRACTS_AND_INSTALLS.md) - [Core deployment operator guide](https://git.add-ideas.de/add-ideas/govoplan-core/src/branch/main/docs/DEPLOYMENT_OPERATOR_GUIDE.md) - [Ops scalability profiles](https://git.add-ideas.de/add-ideas/govoplan-ops/src/branch/main/docs/SCALABILITY_PROFILES.md) - Actual module manifests in the pinned repositories and the static contract checker in this meta repository - Core module-system/API smoke/auth/install-config tests, plus focused Campaign, Files, Mail, Audit and Addresses tests - [Campaign delivery runbook](https://git.add-ideas.de/add-ideas/govoplan-campaign/src/branch/main/docs/CAMPAIGN_DELIVERY_RUNBOOK.md) - [Live signed stable catalog](https://govoplan.add-ideas.de/catalogs/v1/channels/stable.json) and [published keyring](https://govoplan.add-ideas.de/catalogs/v1/keyring.json), verified against a separately provisioned local trust keyring - Annotated source tags `govoplan-core/v0.1.13` and `govoplan-campaign/v0.1.10`, including their catalogued Python and WebUI refs - Installed-composition, boundary-proof and independently scoped proof-authority schemas plus their deterministic review tests; no current target or production proof bundle is asserted Checks retained from the first assessment slice against its then-current workspace: - static manifest/interface contract scan: 43 contracts, 29 providers, no issues - selected Core module-composition, auth/CSRF, health, Campaign journey, reconciliation and install-configuration tests: 14 passed - Campaign tests: 14 passed - Files tests: 14 passed - Mail tests: 22 passed - Audit tests: 5 passed - Addresses tests: 14 passed (one non-failing SQLite resource warning) - JSON Schema validation of the machine-readable assessment: passed Refresh checks on 2026-07-22: - live stable catalog sequence `202607220843`: valid Ed25519 signature trusted through `release-key-1`, no validator warnings - current static contract scan: 43 modules, 33 providers, 19 requirements, no contract errors - catalog-selected commits: Core `d487726f4d2c` at `v0.1.13` and Campaign `735e874bd03c` at `v0.1.10`; local and remote release refs agree - Campaign's immutable `v0.1.10` tag object and peeled commit exactly match the remote tag and catalog record; Calendar durable outbox work is committed and pushed after catalogued `v0.1.8` - JSON Schema validation of the refreshed machine-readable assessment: passed These checks are evidence for the rows above; they are not a substitute for the installed-release and target-environment proof checks.