396 lines
14 KiB
JSON
396 lines
14 KiB
JSON
{
|
|
"package_id": "product.service-to-decision",
|
|
"name": "Governed Service To Decision",
|
|
"version": "0.1.0",
|
|
"package_class": "product",
|
|
"description": "Carry one exact institutional context from service discovery and case intake through parties, authority, formal outcome, communication evidence, and review.",
|
|
"publisher": "GovOPlaN",
|
|
"category": "institutional-governance",
|
|
"license": "AGPL-3.0-or-later",
|
|
"required_modules": [
|
|
{"module_id": "access"},
|
|
{"module_id": "audit"},
|
|
{"module_id": "cases"},
|
|
{"module_id": "decisions"},
|
|
{"module_id": "forms"},
|
|
{"module_id": "forms_runtime"},
|
|
{"module_id": "mandates"},
|
|
{"module_id": "parties"},
|
|
{"module_id": "payments"},
|
|
{"module_id": "policy"},
|
|
{"module_id": "portal"},
|
|
{"module_id": "services"},
|
|
{"module_id": "tasks"},
|
|
{"module_id": "workflow_engine"}
|
|
],
|
|
"required_capabilities": [
|
|
"access.configuration",
|
|
"cases.party_context",
|
|
"cases.service_intake",
|
|
"decisions.registry",
|
|
"forms.configuration",
|
|
"forms.definitions",
|
|
"mandates.resolver",
|
|
"parties.resolver",
|
|
"payments.requests",
|
|
"portal.service_directory",
|
|
"services.availability",
|
|
"services.definitions",
|
|
"workflow.configuration"
|
|
],
|
|
"optional_modules": [
|
|
{"module_id": "approvals"},
|
|
{"module_id": "committee"},
|
|
{"module_id": "files"},
|
|
{"module_id": "postbox"},
|
|
{"module_id": "records"},
|
|
{"module_id": "search"}
|
|
],
|
|
"data_requirements": [
|
|
{
|
|
"key": "responsible_group_slug",
|
|
"label": "Responsible permit group key",
|
|
"data_type": "string",
|
|
"required": true,
|
|
"secret": false,
|
|
"description": "Tenant-local stable key for the group that reviews resident parking permit applications."
|
|
},
|
|
{
|
|
"key": "responsible_group_name",
|
|
"label": "Responsible permit group name",
|
|
"data_type": "string",
|
|
"required": true,
|
|
"secret": false,
|
|
"description": "Human-readable tenant-local name shown for the responsible permit group."
|
|
}
|
|
],
|
|
"fragments": [
|
|
{
|
|
"module_id": "access",
|
|
"fragment_type": "roles",
|
|
"fragment_id": "resident-parking-permit-clerk",
|
|
"payload": {
|
|
"items": [
|
|
{
|
|
"slug": "resident-parking-permit-clerk",
|
|
"name": "Resident parking permit clerk",
|
|
"description": "Reviews resident parking permit submissions, workflow handoffs, cases, decisions, and payment evidence.",
|
|
"permissions": [
|
|
"cases:case:read",
|
|
"cases:case:create",
|
|
"cases:case:update",
|
|
"decisions:decision:read",
|
|
"decisions:decision:write",
|
|
"forms:definition:read",
|
|
"forms_runtime:workspace:read",
|
|
"forms_runtime:workspace:write",
|
|
"payments:payment:read",
|
|
"payments:payment:write",
|
|
"tasks:item:read",
|
|
"tasks:item:write",
|
|
"workflow:definition:read",
|
|
"workflow:instance:read",
|
|
"workflow:instance:start",
|
|
"workflow:instance:transition"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"module_id": "access",
|
|
"fragment_type": "groups",
|
|
"fragment_id": "resident-parking-permit-responsibility",
|
|
"payload": {
|
|
"items": [
|
|
{
|
|
"slug": {"$data": "responsible_group_slug"},
|
|
"name": {"$data": "responsible_group_name"},
|
|
"description": "Tenant-local responsibility group for the resident parking permit reference journey."
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"module_id": "access",
|
|
"fragment_type": "group_role_assignments",
|
|
"fragment_id": "resident-parking-permit-clerk-assignment",
|
|
"payload": {
|
|
"items": [
|
|
{
|
|
"group": {"$data": "responsible_group_slug"},
|
|
"role": "resident-parking-permit-clerk"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"module_id": "forms",
|
|
"fragment_type": "definition",
|
|
"fragment_id": "resident-parking-permit-application",
|
|
"payload": {
|
|
"on_conflict": "new_revision",
|
|
"change_reason": "Install the reviewed resident parking permit reference form.",
|
|
"fragment": {
|
|
"kind": "govoplan.forms.definition",
|
|
"contract_version": "0.1.0",
|
|
"definition": {
|
|
"reference": {
|
|
"kind": "form",
|
|
"owner_module": "forms",
|
|
"object_id": "resident-parking-permit-application",
|
|
"tenant_id": "reference-package",
|
|
"version": "3",
|
|
"valid_at": null,
|
|
"label": null
|
|
},
|
|
"key": "resident-parking-permit-application",
|
|
"temporal": {
|
|
"revision": "3",
|
|
"valid_from": null,
|
|
"valid_to": null,
|
|
"recorded_at": "2026-08-22T00:00:00+00:00",
|
|
"superseded_at": null,
|
|
"change_reason": "Reference package revision."
|
|
},
|
|
"title": "Resident parking permit",
|
|
"description": "Apply for a resident parking permit through a digital or assisted channel.",
|
|
"fields": [
|
|
{
|
|
"key": "applicant_name",
|
|
"label": "Name",
|
|
"value_type": "text",
|
|
"required": true,
|
|
"help_text": null,
|
|
"options": [],
|
|
"constraints": {"min_length": 2, "max_length": 200},
|
|
"default_value": null
|
|
},
|
|
{
|
|
"key": "applicant_email",
|
|
"label": "Email",
|
|
"value_type": "text",
|
|
"required": true,
|
|
"help_text": null,
|
|
"options": [],
|
|
"constraints": {"format": "email"},
|
|
"default_value": null
|
|
},
|
|
{
|
|
"key": "residence_address",
|
|
"label": "Primary residence",
|
|
"value_type": "text",
|
|
"required": true,
|
|
"help_text": null,
|
|
"options": [],
|
|
"constraints": {"max_length": 500},
|
|
"default_value": null
|
|
},
|
|
{
|
|
"key": "licence_plate",
|
|
"label": "Licence plate",
|
|
"value_type": "text",
|
|
"required": true,
|
|
"help_text": null,
|
|
"options": [],
|
|
"constraints": {"max_length": 20},
|
|
"default_value": null
|
|
}
|
|
],
|
|
"publication_state": "published",
|
|
"allow_drafts": true,
|
|
"max_attachments": 4,
|
|
"signature_requirement": "none",
|
|
"policy_refs": [
|
|
"law:resident-parking-permit",
|
|
"records:resident-parking-permit"
|
|
],
|
|
"handoff_kinds": ["case", "workflow"],
|
|
"metadata": {},
|
|
"pages": [
|
|
{
|
|
"key": "application",
|
|
"title": "Application",
|
|
"description": null,
|
|
"sections": [
|
|
{
|
|
"key": "applicant-and-vehicle",
|
|
"title": "Applicant and vehicle",
|
|
"description": null,
|
|
"field_keys": [
|
|
"applicant_name",
|
|
"applicant_email",
|
|
"residence_address",
|
|
"licence_plate"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"localizations": [
|
|
{
|
|
"locale": "de",
|
|
"title": "Anwohnerparkausweis beantragen",
|
|
"description": "Einen Anwohnerparkausweis digital oder mit Unterstützung beantragen.",
|
|
"field_labels": {
|
|
"applicant_name": "Name",
|
|
"applicant_email": "E-Mail-Adresse",
|
|
"residence_address": "Hauptwohnsitz",
|
|
"licence_plate": "Kennzeichen"
|
|
},
|
|
"field_help_texts": {},
|
|
"option_labels": {},
|
|
"page_titles": {"application": "Antrag"},
|
|
"section_titles": {
|
|
"applicant-and-vehicle": "Antragstellende Person und Fahrzeug"
|
|
}
|
|
}
|
|
],
|
|
"fallback_locale": "de"
|
|
},
|
|
"definition_sha256": "7dc108002d532c07e5e7f3b14029a9d4deb3836ebb65d97fb6b51166a70e0ed4",
|
|
"provenance": {
|
|
"owner_module": "forms",
|
|
"tenant_id": "reference-package",
|
|
"form_id": "resident-parking-permit-application",
|
|
"revision": "3",
|
|
"exported_at": "2026-08-22T12:00:00+00:00",
|
|
"exported_by": "GovOPlaN reference package"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"module_id": "workflow_engine",
|
|
"fragment_type": "workflow_definitions",
|
|
"fragment_id": "resident-parking-permit-workflow",
|
|
"payload": {
|
|
"schema_version": 1,
|
|
"origin_module_id": "configuration_package.service_to_decision",
|
|
"origin_module_version": "0.1.0",
|
|
"items": [
|
|
{
|
|
"definition_key": "resident-parking-permit-review",
|
|
"name": "Resident parking permit review",
|
|
"description": "Review evidence, record the formal decision, and verify payment evidence for the resident parking permit reference journey.",
|
|
"scope_type": "tenant",
|
|
"allow_start": true,
|
|
"allow_reuse": true,
|
|
"allow_automation": false,
|
|
"execution_mode": "guided",
|
|
"activate_on_install": true,
|
|
"graph": {
|
|
"schema_version": 1,
|
|
"nodes": [
|
|
{
|
|
"id": "start",
|
|
"type": "workflow.start.manual",
|
|
"label": "Application received",
|
|
"config": {"input_schema_ref": "form:resident-parking-permit-application"}
|
|
},
|
|
{
|
|
"id": "review-evidence",
|
|
"type": "workflow.review",
|
|
"label": "Review application evidence",
|
|
"config": {
|
|
"title": "Review resident parking permit evidence",
|
|
"reviewer": {
|
|
"kind": "group",
|
|
"id": {"$data": "responsible_group_slug"},
|
|
"label": {"$data": "responsible_group_name"}
|
|
},
|
|
"due_after": "P14D",
|
|
"required_evidence": [
|
|
"identity",
|
|
"primary_residence",
|
|
"vehicle_registration"
|
|
],
|
|
"view_surface_ids": []
|
|
}
|
|
},
|
|
{
|
|
"id": "record-decision",
|
|
"type": "workflow.activity",
|
|
"label": "Record formal decision",
|
|
"config": {
|
|
"title": "Record the resident parking permit decision",
|
|
"instructions": "Record the operative result, reasoning, legal basis, remedy, and exact evidence references through the Decisions capability.",
|
|
"assignee": {
|
|
"kind": "group",
|
|
"id": {"$data": "responsible_group_slug"},
|
|
"label": {"$data": "responsible_group_name"}
|
|
},
|
|
"due_after": "P7D",
|
|
"view_surface_ids": []
|
|
}
|
|
},
|
|
{
|
|
"id": "verify-payment",
|
|
"type": "workflow.activity",
|
|
"label": "Verify payment evidence",
|
|
"config": {
|
|
"title": "Verify the resident parking permit fee",
|
|
"instructions": "Verify the EUR 30.00 obligation, immutable receipt evidence, currency, amount, and transaction reference before completion.",
|
|
"assignee": {
|
|
"kind": "group",
|
|
"id": {"$data": "responsible_group_slug"},
|
|
"label": {"$data": "responsible_group_name"}
|
|
},
|
|
"due_after": "P14D",
|
|
"view_surface_ids": []
|
|
}
|
|
},
|
|
{
|
|
"id": "completed",
|
|
"type": "workflow.end.completed",
|
|
"label": "Permit journey complete",
|
|
"config": {"output_mapping": {}}
|
|
}
|
|
],
|
|
"edges": [
|
|
{"id": "start-review", "source": "start", "target": "review-evidence"},
|
|
{"id": "review-decision", "source": "review-evidence", "source_port": "approved", "target": "record-decision"},
|
|
{"id": "decision-payment", "source": "record-decision", "target": "verify-payment"},
|
|
{"id": "payment-completed", "source": "verify-payment", "target": "completed"}
|
|
],
|
|
"metadata": {
|
|
"reference_journey": "resident-parking-permit",
|
|
"locale": "de-DE",
|
|
"payment_amount_minor": 3000,
|
|
"payment_currency": "EUR"
|
|
}
|
|
},
|
|
"metadata": {
|
|
"reference_package": "product.service-to-decision",
|
|
"form_id": "resident-parking-permit-application"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
],
|
|
"evidence": [
|
|
{
|
|
"kind": "documentation",
|
|
"reference": "packages/product/service-to-decision/README.md",
|
|
"summary": "Defines the package boundary, authority path, recovery contract, and known operational limits."
|
|
},
|
|
{
|
|
"kind": "target_test",
|
|
"reference": "tests/fixtures/resident_parking_permit_journey.json",
|
|
"summary": "Pins the resident parking permit actors, channels, exact inputs, work item, formal outcome, filing target, and remaining manual acceptance gates."
|
|
},
|
|
{
|
|
"kind": "target_test",
|
|
"reference": "tests/test_institutional_governance_journey.py",
|
|
"summary": "Executes the SQL-backed provider composition from service discovery through persisted formal Decision reconstruction."
|
|
},
|
|
{
|
|
"kind": "target_test",
|
|
"reference": "tests/test_institutional_service_journey.py",
|
|
"summary": "Executes Portal delegation from an exact Service revision through an exact immutable Form revision to a replay-safe persisted submission."
|
|
}
|
|
],
|
|
"tags": ["service", "case", "mandate", "party", "decision", "public-sector"]
|
|
}
|