kind: uapf.algorithm.card id: algo.incident_triage.evaluate_dmn version: 1.0.0 name: DMN decision evaluator intent: | Wraps a DMN 1.3 decision-table evaluation as a callable UAPF-IP capability. The triage BPMN invokes the three DMN tables in this package (priority, ownership, routing) natively via businessRuleTask; this card describes the dmn.evaluate@1 capability for cases where the same evaluation is needed outside the BPMN runtime (operator manual re-evaluation, batch backfill, regression testing). Engine-internal DMN evaluation and this capability call return the same output for the same input — that property is the only thing this card asserts. algorithm_kind: rule_table io: inputs: - id: package_id type: string documentation: UAPF package id whose dmn/ cornerstone holds the table. - id: decision_id type: string constraints: enum: [priority, ownership, routing] documentation: Which DMN decision to evaluate in this package. - id: inputs type: object documentation: | Decision-input columns as a flat object. For priority: {severity, service_tier, ai_suggested_priority, classification}. For ownership: {classification, host_domain, source}. For routing: {classification, priority, ownership}. outputs: - id: output type: object documentation: | Object with the decision-output columns. priority -> {priority}. ownership -> {ownership}. routing -> {group_slug}. - id: hit_rule_ids type: array documentation: Rule ids that matched (FIRST hit-policy produces 1; ANY may produce N). - id: hit_policy type: string constraints: enum: [FIRST, UNIQUE, ANY, PRIORITY, OUTPUT_ORDER, COLLECT, RULE_ORDER] implementation: type: external medium: mcp_tool uri: uapf-ip://capability/dmn.evaluate@1 hash: sha256:0000000000000000000000000000000000000000000000000000000000000000 runtime: capability: dmn.evaluate@1 note: | Host-fulfilled UAPF-IP capability. The OpenITSM host reads the DMN file from the package's dmn/ cornerstone and applies the DMN 1.3 hit-policy semantics. Same decision artifact, same output as the in-process engine evaluation. determinism: deterministic side_effects: pure complexity: typical_latency_ms: 5 max_latency_ms: 5000 failure_mode: | Throws if the requested package_id is not loaded by the runtime, or if the named decision_id is not present in that package's dmn/ directory. Triage callers fall back to safe defaults (P4, lvrtc, helpdesk-l1) so the case still completes. owners: - type: team id: openitsm-stewards contact: stewards@openitsm.algomation.io lifecycle: status: draft tests: - name: priority-critical-tier1 description: | The priority table should rule P1 for a critical+tier_1 input regardless of AI suggestion. inputs: package_id: "lv.itsm.incident.triage" decision_id: "priority" inputs: severity: "critical" service_tier: "tier_1" ai_suggested_priority: "P3" classification: "network.outage.link_down" expected_outputs: output: priority: "P1" hit_policy: "FIRST" - name: routing-security-to-soc description: | Routing of a security.incident at P1 should land on soc-l2. inputs: package_id: "lv.itsm.incident.triage" decision_id: "routing" inputs: classification: "security.incident" priority: "P1" ownership: "lvrtc" expected_outputs: output: group_slug: "soc-l2" hit_policy: "FIRST"