feat(decisions): add governed DSAR coverage

This commit is contained in:
2026-08-21 12:06:09 +02:00
parent 3845e068de
commit e6ea0d6b72
3 changed files with 524 additions and 0 deletions
@@ -22,6 +22,10 @@ from govoplan_core.core.provider_governance import declared_module_architecture
from govoplan_core.core.search import SearchSourceProviderRegistration
from govoplan_core.db.base import Base
from govoplan_decisions.backend.db import models as decision_models
from govoplan_decisions.backend.dsar_provider import (
DECISIONS_DSAR_CAPABILITY,
DecisionsDsarProvider,
)
from govoplan_decisions.backend.record_source import (
CAPABILITY_RECORD_SOURCE_DECISIONS,
create_decisions_record_source,
@@ -63,6 +67,10 @@ def _registry(_context: ModuleContext) -> SqlDecisionRegistry:
return SqlDecisionRegistry()
def _dsar_provider(_context: ModuleContext) -> DecisionsDsarProvider:
return DecisionsDsarProvider()
manifest = ModuleManifest(
id=MODULE_ID,
name=MODULE_NAME,
@@ -85,6 +93,7 @@ manifest = ModuleManifest(
ModuleInterfaceProvider(
name=CAPABILITY_RECORD_SOURCE_DECISIONS, version="1.0.0"
),
ModuleInterfaceProvider(name=DECISIONS_DSAR_CAPABILITY, version="0.1.0"),
),
permissions=(
_permission(
@@ -126,6 +135,7 @@ manifest = ModuleManifest(
capability_factories={
CAPABILITY_DECISION_REGISTRY: _registry,
CAPABILITY_RECORD_SOURCE_DECISIONS: create_decisions_record_source,
DECISIONS_DSAR_CAPABILITY: _dsar_provider,
},
capability_documentation={
CAPABILITY_DECISION_REGISTRY: CapabilityDocumentation(
@@ -138,6 +148,14 @@ manifest = ModuleManifest(
summary="Resolves complete, currently authorized immutable Decision revisions for Records filing.",
contract_version="1.0.0",
),
DECISIONS_DSAR_CAPABILITY: CapabilityDocumentation(
label="Decisions data-subject request provider",
summary=(
"Exports minimized formal-Decision creator attribution without "
"protected reasoning, outcomes, conditions, or payloads."
),
contract_version="0.1.0",
),
},
migration_spec=MigrationSpec(
module_id=MODULE_ID,
@@ -161,6 +179,40 @@ manifest = ModuleManifest(
),
),
documentation=(
DocumentationTopic(
id="decisions.data-subject-requests",
title="Formal Decision data-subject requests",
summary=(
"Export minimized creator attribution from immutable formal Decision "
"revisions without exposing protected Decision content."
),
body=(
"Decisions searches exact account, membership, identity, or explicit "
"actor identifiers inside the active tenant. An optional Decision "
"identifier only narrows that verified actor search and cannot disclose "
"a Decision by itself. The access record contains revision, type, state, "
"valid-time, recorded-time, and creator activity only. Protected "
"reasoning, operative results, conditions, evidence payloads, and "
"digests remain excluded. Formal Decision history is immutable legal "
"and institutional evidence, so the provider publishes retain-only "
"erasure outcomes and never rewrites a revision."
),
layer="configured",
documentation_types=("admin", "user"),
audience=("user", "operator", "module_admin", "auditor"),
related_modules=("core", "approvals", "committee", "records"),
metadata={
"help_contexts": ["privacy.data-subject-requests"],
"consequence_classes": {
"export_creator_attribution": (
"Returns lifecycle and creator context without protected payloads."
),
"retain_formal_history": (
"Preserves immutable institutional and legal evidence."
),
},
},
),
DocumentationTopic(
id="decisions.formal-outcome",
title="Formal institutional Decisions",