You've already forked dokumenta-semantiska-analize
Import UAPF package
rewrite 2.0.0: real process — extract the algorithm into DMN
The 1.x package was a single ai.extract call wrapped in three BPMN
service tasks. No decision logic, no dmn cornerstone, no weights — the
risk/routing/validation algorithm lived invisibly in host code. There
was nothing for a runtime to actually execute.
2.0.0 makes it a real process:
- dmn cornerstone added with three decision tables:
* assess-personal-data-risk — PII regex signals -> risk level
* gdpr-processing-route — risk x centralisation -> CENTRAL/LOCAL,
anonymisation, redaction level
* human-validation-gate — confidence thresholds + PII re-scan
-> REJECTED/PENDING_REVIEW/APPROVED_AUTO
- BPMN expanded 3 -> 6 nodes (3 serviceTask + 3 businessRuleTask),
with horizontal DI.
- Task ids, mappings, docs, manifest (dmn:true), uapf.yaml, lifecycle
and eval-set updated; added a PII-bearing fixture.
Only the semantic extraction remains a model step. Risk classification,
GDPR routing and validation gating are now explicit ranked DMN rules —
inspectable, versioned, portable. Breaking change: structure + outputs.
This commit is contained in:
60
dmn/gdpr-processing-route.dmn
Normal file
60
dmn/gdpr-processing-route.dmn
Normal file
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<dmn:definitions xmlns:dmn="https://www.omg.org/spec/DMN/20191111/MODEL/"
|
||||
id="Definitions_GdprProcessingRoute"
|
||||
namespace="https://uapf.dev/processes/semantic-document-analysis">
|
||||
<dmn:decision id="gdpr-processing-route" name="GDPR processing route">
|
||||
<dmn:decisionTable hitPolicy="FIRST">
|
||||
<dmn:input id="i_risk" label="Personal-data risk">
|
||||
<dmn:inputExpression typeRef="string"><dmn:text>personalDataRisk</dmn:text></dmn:inputExpression>
|
||||
</dmn:input>
|
||||
<dmn:input id="i_central" label="Centralisation permitted">
|
||||
<dmn:inputExpression typeRef="boolean"><dmn:text>allowCentralization</dmn:text></dmn:inputExpression>
|
||||
</dmn:input>
|
||||
<dmn:output id="o_route" label="Processing route" name="processingRoute" typeRef="string"/>
|
||||
<dmn:output id="o_anon" label="Anonymisation required" name="anonymizationRequired" typeRef="boolean"/>
|
||||
<dmn:output id="o_redact" label="Redaction level" name="redactionLevel" typeRef="string"/>
|
||||
<dmn:rule id="R1_sensitive_local">
|
||||
<dmn:inputEntry><dmn:text>"HIGH","MEDIUM"</dmn:text></dmn:inputEntry>
|
||||
<dmn:inputEntry><dmn:text>false</dmn:text></dmn:inputEntry>
|
||||
<dmn:outputEntry><dmn:text>"LOCAL"</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>true</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>"FULL"</dmn:text></dmn:outputEntry>
|
||||
</dmn:rule>
|
||||
<dmn:rule id="R2_any_local">
|
||||
<dmn:inputEntry><dmn:text>-</dmn:text></dmn:inputEntry>
|
||||
<dmn:inputEntry><dmn:text>false</dmn:text></dmn:inputEntry>
|
||||
<dmn:outputEntry><dmn:text>"LOCAL"</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>false</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>"PARTIAL"</dmn:text></dmn:outputEntry>
|
||||
</dmn:rule>
|
||||
<dmn:rule id="R3_sensitive_central">
|
||||
<dmn:inputEntry><dmn:text>"HIGH","MEDIUM"</dmn:text></dmn:inputEntry>
|
||||
<dmn:inputEntry><dmn:text>true</dmn:text></dmn:inputEntry>
|
||||
<dmn:outputEntry><dmn:text>"CENTRAL"</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>true</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>"FULL"</dmn:text></dmn:outputEntry>
|
||||
</dmn:rule>
|
||||
<dmn:rule id="R4_low_central">
|
||||
<dmn:inputEntry><dmn:text>"LOW"</dmn:text></dmn:inputEntry>
|
||||
<dmn:inputEntry><dmn:text>true</dmn:text></dmn:inputEntry>
|
||||
<dmn:outputEntry><dmn:text>"CENTRAL"</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>false</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>"PARTIAL"</dmn:text></dmn:outputEntry>
|
||||
</dmn:rule>
|
||||
<dmn:rule id="R5_none_central">
|
||||
<dmn:inputEntry><dmn:text>"NONE"</dmn:text></dmn:inputEntry>
|
||||
<dmn:inputEntry><dmn:text>true</dmn:text></dmn:inputEntry>
|
||||
<dmn:outputEntry><dmn:text>"CENTRAL"</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>false</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>"NONE"</dmn:text></dmn:outputEntry>
|
||||
</dmn:rule>
|
||||
<dmn:rule id="R6_default">
|
||||
<dmn:inputEntry><dmn:text>-</dmn:text></dmn:inputEntry>
|
||||
<dmn:inputEntry><dmn:text>-</dmn:text></dmn:inputEntry>
|
||||
<dmn:outputEntry><dmn:text>"CENTRAL"</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>false</dmn:text></dmn:outputEntry>
|
||||
<dmn:outputEntry><dmn:text>"PARTIAL"</dmn:text></dmn:outputEntry>
|
||||
</dmn:rule>
|
||||
</dmn:decisionTable>
|
||||
</dmn:decision>
|
||||
</dmn:definitions>
|
||||
Reference in New Issue
Block a user