You've already forked HR-atlase-vertesana
Import UAPF package
Import UAPF package: HR-atlase-vertesana-ProcessGit-v0.1.1.uapf
This commit is contained in:
87
algorithms/candidate-profiler.card.yaml
Normal file
87
algorithms/candidate-profiler.card.yaml
Normal file
@@ -0,0 +1,87 @@
|
||||
kind: uapf.algorithm.card
|
||||
id: algo.openhr.candidate_profiler
|
||||
version: "0.1.0"
|
||||
name: "OpenHR kandidāta daudzdimensionālais profilētājs"
|
||||
intent: >-
|
||||
Izvērtēt tikai ar amatu saistītus kandidāta pierādījumus un izveidot
|
||||
profesionālo, prasmju, darba uzvedības un riska profilu HR speciālista
|
||||
strukturētai pārskatīšanai. Algoritms nepieņem nodarbinātības lēmumu.
|
||||
algorithm_kind: classifier
|
||||
determinism: learned
|
||||
side_effects: external_call
|
||||
|
||||
io:
|
||||
inputs:
|
||||
- id: vacancy_profile
|
||||
type: object
|
||||
schema: schemas/vacancy-profile.schema.json
|
||||
- id: pseudonymous_candidate_id
|
||||
type: string
|
||||
- id: redacted_cv_text
|
||||
type: string
|
||||
- id: structured_questionnaire
|
||||
type: object
|
||||
outputs:
|
||||
- id: candidate_profile
|
||||
type: object
|
||||
schema: schemas/candidate-profile-output.schema.json
|
||||
|
||||
implementation:
|
||||
type: external
|
||||
medium: http_api
|
||||
uri: "processgit://AI_Sandbox/HR-atlase-vertesana/services/candidate-profiler/v1"
|
||||
hash: "sha256:0000000000000000000000000000000000000000000000000000000000000000"
|
||||
runtime:
|
||||
method: POST
|
||||
path: /evaluate
|
||||
timeoutSeconds: 90
|
||||
contentType: application/json
|
||||
|
||||
owners:
|
||||
- type: organization
|
||||
id: algomation-ai
|
||||
contact: info@algomation.io
|
||||
|
||||
lifecycle:
|
||||
status: draft
|
||||
maturity: proof-of-concept
|
||||
|
||||
confidence:
|
||||
type: probability
|
||||
threshold: 0.70
|
||||
below_threshold: enhanced_human_review
|
||||
|
||||
failure_mode:
|
||||
action: stop_and_request_human_review
|
||||
retryable: true
|
||||
maximumRetries: 1
|
||||
|
||||
limitations:
|
||||
- "Rezultāts ir atkarīgs no iesniegto pierādījumu pilnīguma un kvalitātes."
|
||||
- "Darba uzvedības profils nav personības, psiholoģisks vai medicīnisks novērtējums."
|
||||
- "Algoritms nedrīkst izmantot aizsargātas vai darbam nebūtiskas pazīmes."
|
||||
- "Algoritms nedrīkst pieņemt galīgo atlases lēmumu."
|
||||
|
||||
validation:
|
||||
last_validated: "2026-07-24"
|
||||
methodology: "POC schema, deterministic fixtures and mandatory human review"
|
||||
test_suite: tests/candidate-profiler-tests.yaml
|
||||
metrics:
|
||||
schemaValidityTarget: 1.0
|
||||
evidenceCoverageTarget: 0.85
|
||||
|
||||
audit:
|
||||
log_inputs: metadata_only
|
||||
log_outputs: true
|
||||
retention: P5Y
|
||||
|
||||
privacy:
|
||||
personalData: true
|
||||
technique: pseudonymisation_and_redaction
|
||||
reIdentificationRisk: low
|
||||
|
||||
risk:
|
||||
aiActRiskClass: high
|
||||
domain: employment
|
||||
humanOversight: mandatory
|
||||
consequentialDecisionAllowed: false
|
||||
111
bpmn/candidate-selection-evaluation.bpmn
Normal file
111
bpmn/candidate-selection-evaluation.bpmn
Normal file
@@ -0,0 +1,111 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
|
||||
xmlns:uapf="https://uapf.dev/bpmn/v2.4"
|
||||
id="Definitions_OpenHR_CandidateEvaluation"
|
||||
targetNamespace="https://processgit.org/AI_Sandbox/HR-atlase-vertesana">
|
||||
<bpmn:process id="Process_CandidateSelectionEvaluation"
|
||||
name="Candidate selection evaluation"
|
||||
isExecutable="true">
|
||||
<bpmn:startEvent id="Start_ApplicationReceived" name="Application received">
|
||||
<bpmn:outgoing>Flow_01</bpmn:outgoing>
|
||||
</bpmn:startEvent>
|
||||
|
||||
<bpmn:userTask id="Task_RegisterApplication" name="Register application">
|
||||
<bpmn:incoming>Flow_01</bpmn:incoming><bpmn:outgoing>Flow_02</bpmn:outgoing>
|
||||
</bpmn:userTask>
|
||||
|
||||
<bpmn:serviceTask id="Task_RedactInput" name="Prepare pseudonymous evaluation input">
|
||||
<bpmn:incoming>Flow_02</bpmn:incoming><bpmn:outgoing>Flow_03</bpmn:outgoing>
|
||||
</bpmn:serviceTask>
|
||||
|
||||
<bpmn:businessRuleTask id="Task_InputAdmissibility" name="DMN: Check input admissibility">
|
||||
<bpmn:incoming>Flow_03</bpmn:incoming><bpmn:outgoing>Flow_04</bpmn:outgoing>
|
||||
</bpmn:businessRuleTask>
|
||||
|
||||
<bpmn:exclusiveGateway id="Gateway_Admissibility" name="Input admissible?">
|
||||
<bpmn:incoming>Flow_04</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_Profile</bpmn:outgoing>
|
||||
<bpmn:outgoing>Flow_RequestInfo</bpmn:outgoing>
|
||||
<bpmn:outgoing>Flow_ManualOnly</bpmn:outgoing>
|
||||
</bpmn:exclusiveGateway>
|
||||
|
||||
<bpmn:userTask id="Task_RequestInformation" name="Request missing information">
|
||||
<bpmn:incoming>Flow_RequestInfo</bpmn:incoming><bpmn:outgoing>Flow_EndInfo</bpmn:outgoing>
|
||||
</bpmn:userTask>
|
||||
<bpmn:endEvent id="End_WaitingInformation" name="Waiting for information">
|
||||
<bpmn:incoming>Flow_EndInfo</bpmn:incoming>
|
||||
</bpmn:endEvent>
|
||||
|
||||
<bpmn:userTask id="Task_DataProtectionReview" name="Manual data protection review">
|
||||
<bpmn:incoming>Flow_ManualOnly</bpmn:incoming><bpmn:outgoing>Flow_ToHumanReview</bpmn:outgoing>
|
||||
</bpmn:userTask>
|
||||
|
||||
<bpmn:serviceTask id="Task_ProfileCandidate"
|
||||
name="External algorithm: generate candidate profile"
|
||||
uapf:algorithmCardRef="algo.openhr.candidate_profiler">
|
||||
<bpmn:incoming>Flow_Profile</bpmn:incoming><bpmn:outgoing>Flow_05</bpmn:outgoing>
|
||||
<bpmn:ioSpecification>
|
||||
<bpmn:dataInput id="Profile_in_vacancy_profile" name="vacancy_profile : object"/>
|
||||
<bpmn:dataInput id="Profile_in_candidate_id" name="pseudonymous_candidate_id : string"/>
|
||||
<bpmn:dataInput id="Profile_in_cv" name="redacted_cv_text : string"/>
|
||||
<bpmn:dataInput id="Profile_in_questionnaire" name="structured_questionnaire : object"/>
|
||||
<bpmn:dataOutput id="Profile_out_profile" name="candidate_profile : object"/>
|
||||
<bpmn:inputSet>
|
||||
<bpmn:dataInputRefs>Profile_in_vacancy_profile</bpmn:dataInputRefs>
|
||||
<bpmn:dataInputRefs>Profile_in_candidate_id</bpmn:dataInputRefs>
|
||||
<bpmn:dataInputRefs>Profile_in_cv</bpmn:dataInputRefs>
|
||||
<bpmn:dataInputRefs>Profile_in_questionnaire</bpmn:dataInputRefs>
|
||||
</bpmn:inputSet>
|
||||
<bpmn:outputSet><bpmn:dataOutputRefs>Profile_out_profile</bpmn:dataOutputRefs></bpmn:outputSet>
|
||||
</bpmn:ioSpecification>
|
||||
</bpmn:serviceTask>
|
||||
|
||||
<bpmn:businessRuleTask id="Task_ReviewPriority" name="DMN: Determine human-review priority">
|
||||
<bpmn:incoming>Flow_05</bpmn:incoming><bpmn:outgoing>Flow_06</bpmn:outgoing>
|
||||
</bpmn:businessRuleTask>
|
||||
|
||||
<bpmn:callActivity id="Task_ExceptionCase" name="Open exception review case" calledElement="Case_CandidateReview">
|
||||
<bpmn:incoming>Flow_06</bpmn:incoming><bpmn:outgoing>Flow_07</bpmn:outgoing>
|
||||
</bpmn:callActivity>
|
||||
|
||||
<bpmn:userTask id="Task_HumanReview" name="HR reviews profile and evidence">
|
||||
<bpmn:incoming>Flow_07</bpmn:incoming>
|
||||
<bpmn:incoming>Flow_ToHumanReview</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_08</bpmn:outgoing>
|
||||
</bpmn:userTask>
|
||||
|
||||
<bpmn:userTask id="Task_RecordDecision" name="Record accountable human decision">
|
||||
<bpmn:incoming>Flow_08</bpmn:incoming><bpmn:outgoing>Flow_09</bpmn:outgoing>
|
||||
</bpmn:userTask>
|
||||
|
||||
<bpmn:serviceTask id="Task_WriteAudit" name="Write immutable assessment audit event">
|
||||
<bpmn:incoming>Flow_09</bpmn:incoming><bpmn:outgoing>Flow_10</bpmn:outgoing>
|
||||
</bpmn:serviceTask>
|
||||
|
||||
<bpmn:endEvent id="End_AssessmentCompleted" name="Assessment completed">
|
||||
<bpmn:incoming>Flow_10</bpmn:incoming>
|
||||
</bpmn:endEvent>
|
||||
|
||||
<bpmn:sequenceFlow id="Flow_01" sourceRef="Start_ApplicationReceived" targetRef="Task_RegisterApplication"/>
|
||||
<bpmn:sequenceFlow id="Flow_02" sourceRef="Task_RegisterApplication" targetRef="Task_RedactInput"/>
|
||||
<bpmn:sequenceFlow id="Flow_03" sourceRef="Task_RedactInput" targetRef="Task_InputAdmissibility"/>
|
||||
<bpmn:sequenceFlow id="Flow_04" sourceRef="Task_InputAdmissibility" targetRef="Gateway_Admissibility"/>
|
||||
<bpmn:sequenceFlow id="Flow_Profile" sourceRef="Gateway_Admissibility" targetRef="Task_ProfileCandidate">
|
||||
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">status = "ADMISSIBLE"</bpmn:conditionExpression>
|
||||
</bpmn:sequenceFlow>
|
||||
<bpmn:sequenceFlow id="Flow_RequestInfo" sourceRef="Gateway_Admissibility" targetRef="Task_RequestInformation">
|
||||
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">status = "INCOMPLETE" or status = "NOT_ADMISSIBLE"</bpmn:conditionExpression>
|
||||
</bpmn:sequenceFlow>
|
||||
<bpmn:sequenceFlow id="Flow_ManualOnly" sourceRef="Gateway_Admissibility" targetRef="Task_DataProtectionReview">
|
||||
<bpmn:conditionExpression xsi:type="bpmn:tFormalExpression" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">status = "REDACTION_REQUIRED"</bpmn:conditionExpression>
|
||||
</bpmn:sequenceFlow>
|
||||
<bpmn:sequenceFlow id="Flow_EndInfo" sourceRef="Task_RequestInformation" targetRef="End_WaitingInformation"/>
|
||||
<bpmn:sequenceFlow id="Flow_ToHumanReview" sourceRef="Task_DataProtectionReview" targetRef="Task_HumanReview"/>
|
||||
<bpmn:sequenceFlow id="Flow_05" sourceRef="Task_ProfileCandidate" targetRef="Task_ReviewPriority"/>
|
||||
<bpmn:sequenceFlow id="Flow_06" sourceRef="Task_ReviewPriority" targetRef="Task_ExceptionCase"/>
|
||||
<bpmn:sequenceFlow id="Flow_07" sourceRef="Task_ExceptionCase" targetRef="Task_HumanReview"/>
|
||||
<bpmn:sequenceFlow id="Flow_08" sourceRef="Task_HumanReview" targetRef="Task_RecordDecision"/>
|
||||
<bpmn:sequenceFlow id="Flow_09" sourceRef="Task_RecordDecision" targetRef="Task_WriteAudit"/>
|
||||
<bpmn:sequenceFlow id="Flow_10" sourceRef="Task_WriteAudit" targetRef="End_AssessmentCompleted"/>
|
||||
</bpmn:process>
|
||||
</bpmn:definitions>
|
||||
19
cmmn/candidate-review-case.cmmn
Normal file
19
cmmn/candidate-review-case.cmmn
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<cmmn:definitions xmlns:cmmn="http://www.omg.org/spec/CMMN/20151109/MODEL"
|
||||
id="Definitions_CandidateReview"
|
||||
targetNamespace="https://processgit.org/AI_Sandbox/HR-atlase-vertesana/cmmn">
|
||||
<cmmn:case id="Case_CandidateReview" name="Candidate exception and review case">
|
||||
<cmmn:casePlanModel id="CasePlanModel_CandidateReview" name="Candidate review">
|
||||
<cmmn:planItem id="PI_VerifyEvidence" definitionRef="HT_VerifyEvidence"/>
|
||||
<cmmn:planItem id="PI_IndependentReview" definitionRef="HT_IndependentReview"/>
|
||||
<cmmn:planItem id="PI_DataProtectionReview" definitionRef="HT_DataProtectionReview"/>
|
||||
<cmmn:planItem id="PI_RequestInformation" definitionRef="HT_RequestInformation"/>
|
||||
<cmmn:planItem id="PI_Reconsideration" definitionRef="HT_Reconsideration"/>
|
||||
<cmmn:humanTask id="HT_VerifyEvidence" name="Verify evidence inconsistencies" isBlocking="true"/>
|
||||
<cmmn:humanTask id="HT_IndependentReview" name="Independent assessment for low confidence" isBlocking="true"/>
|
||||
<cmmn:humanTask id="HT_DataProtectionReview" name="Review prohibited-attribute exposure" isBlocking="true"/>
|
||||
<cmmn:humanTask id="HT_RequestInformation" name="Request missing candidate evidence" isBlocking="true"/>
|
||||
<cmmn:humanTask id="HT_Reconsideration" name="Handle correction or reconsideration request" isBlocking="true"/>
|
||||
</cmmn:casePlanModel>
|
||||
</cmmn:case>
|
||||
</cmmn:definitions>
|
||||
39
dmn/01-input-admissibility.dmn
Normal file
39
dmn/01-input-admissibility.dmn
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/"
|
||||
xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/"
|
||||
xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/"
|
||||
id="Definitions_InputAdmissibility"
|
||||
name="Candidate input admissibility"
|
||||
namespace="https://processgit.org/AI_Sandbox/HR-atlase-vertesana/dmn">
|
||||
<decision id="Decision_InputAdmissibility" name="Input admissibility">
|
||||
<decisionTable id="DecisionTable_InputAdmissibility" hitPolicy="FIRST">
|
||||
<input id="Input_Consent" label="Consent confirmed">
|
||||
<inputExpression id="Expr_Consent" typeRef="boolean"><text>consentConfirmed</text></inputExpression>
|
||||
</input>
|
||||
<input id="Input_Cv" label="CV text present">
|
||||
<inputExpression id="Expr_Cv" typeRef="boolean"><text>cvTextPresent</text></inputExpression>
|
||||
</input>
|
||||
<input id="Input_Protected" label="Prohibited attributes detected">
|
||||
<inputExpression id="Expr_Protected" typeRef="boolean"><text>prohibitedAttributesDetected</text></inputExpression>
|
||||
</input>
|
||||
<output id="Output_Status" label="Status" name="status" typeRef="string"/>
|
||||
<output id="Output_Action" label="Action" name="action" typeRef="string"/>
|
||||
<rule id="Rule_NoConsent">
|
||||
<inputEntry><text>false</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry>
|
||||
<outputEntry><text>"NOT_ADMISSIBLE"</text></outputEntry><outputEntry><text>"REQUEST_CONSENT"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="Rule_NoCv">
|
||||
<inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>-</text></inputEntry>
|
||||
<outputEntry><text>"INCOMPLETE"</text></outputEntry><outputEntry><text>"REQUEST_INFORMATION"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="Rule_Protected">
|
||||
<inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry>
|
||||
<outputEntry><text>"REDACTION_REQUIRED"</text></outputEntry><outputEntry><text>"REDACT_AND_RECHECK"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="Rule_Admissible">
|
||||
<inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry>
|
||||
<outputEntry><text>"ADMISSIBLE"</text></outputEntry><outputEntry><text>"PROFILE"</text></outputEntry>
|
||||
</rule>
|
||||
</decisionTable>
|
||||
</decision>
|
||||
</definitions>
|
||||
46
dmn/02-review-priority.dmn
Normal file
46
dmn/02-review-priority.dmn
Normal file
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/"
|
||||
id="Definitions_ReviewPriority"
|
||||
name="Candidate review priority"
|
||||
namespace="https://processgit.org/AI_Sandbox/HR-atlase-vertesana/dmn">
|
||||
<decision id="Decision_ReviewPriority" name="Review priority">
|
||||
<decisionTable id="DecisionTable_ReviewPriority" hitPolicy="FIRST">
|
||||
<input id="Input_Confidence" label="Confidence">
|
||||
<inputExpression id="Expr_Confidence" typeRef="number"><text>confidence</text></inputExpression>
|
||||
</input>
|
||||
<input id="Input_Gaps" label="Material evidence gaps">
|
||||
<inputExpression id="Expr_Gaps" typeRef="boolean"><text>materialEvidenceGaps</text></inputExpression>
|
||||
</input>
|
||||
<input id="Input_Conflict" label="Material inconsistencies">
|
||||
<inputExpression id="Expr_Conflict" typeRef="boolean"><text>materialInconsistencies</text></inputExpression>
|
||||
</input>
|
||||
<input id="Input_Leakage" label="Prohibited attribute leakage">
|
||||
<inputExpression id="Expr_Leakage" typeRef="boolean"><text>prohibitedAttributeLeakage</text></inputExpression>
|
||||
</input>
|
||||
<output id="Output_Recommendation" name="recommendation" typeRef="string"/>
|
||||
<output id="Output_Priority" name="priority" typeRef="string"/>
|
||||
<output id="Output_Check" name="requiredCheck" typeRef="string"/>
|
||||
|
||||
<rule id="Rule_Leakage">
|
||||
<inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>true</text></inputEntry>
|
||||
<outputEntry><text>"MANUAL_ONLY"</text></outputEntry><outputEntry><text>"URGENT"</text></outputEntry><outputEntry><text>"DATA_PROTECTION_REVIEW"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="Rule_Conflict">
|
||||
<inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry>
|
||||
<outputEntry><text>"ENHANCED_REVIEW"</text></outputEntry><outputEntry><text>"HIGH"</text></outputEntry><outputEntry><text>"VERIFY_INCONSISTENCIES"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="Rule_Gaps">
|
||||
<inputEntry><text>-</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry>
|
||||
<outputEntry><text>"REQUEST_INFORMATION"</text></outputEntry><outputEntry><text>"HIGH"</text></outputEntry><outputEntry><text>"COLLECT_MISSING_EVIDENCE"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="Rule_LowConfidence">
|
||||
<inputEntry><text>< 0.70</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry>
|
||||
<outputEntry><text>"ENHANCED_REVIEW"</text></outputEntry><outputEntry><text>"HIGH"</text></outputEntry><outputEntry><text>"INDEPENDENT_HUMAN_ASSESSMENT"</text></outputEntry>
|
||||
</rule>
|
||||
<rule id="Rule_Normal">
|
||||
<inputEntry><text>>= 0.70</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry>
|
||||
<outputEntry><text>"NORMAL_REVIEW"</text></outputEntry><outputEntry><text>"NORMAL"</text></outputEntry><outputEntry><text>"STRUCTURED_HR_REVIEW"</text></outputEntry>
|
||||
</rule>
|
||||
</decisionTable>
|
||||
</decision>
|
||||
</definitions>
|
||||
11
docs/CHANGELOG.md
Normal file
11
docs/CHANGELOG.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Changelog
|
||||
|
||||
## 0.1.0 — 2026-07-24
|
||||
|
||||
- sākotnējais kandidātu izvērtēšanas BPMN process;
|
||||
- ievades pieļaujamības un pārskatīšanas prioritātes DMN tabulas;
|
||||
- CMMN izņēmumu un cilvēka pārskatīšanas lieta;
|
||||
- ārējā kandidātu profilētāja Algorithm Card;
|
||||
- OpenHR resursu un spēju kartējums;
|
||||
- ievades un izvades JSON shēmas;
|
||||
- testa piemēri.
|
||||
58
examples/candidate-input.example.json
Normal file
58
examples/candidate-input.example.json
Normal file
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"vacancy": {
|
||||
"id": "vacancy-demo-001",
|
||||
"title": "Senior IT / kiberdrošības projektu vadītājs",
|
||||
"description": "Vada sarežģītus IT un kiberdrošības projektus.",
|
||||
"profile": {
|
||||
"roleTitle": "Senior IT / kiberdrošības projektu vadītājs",
|
||||
"mandatoryRequirements": [
|
||||
{
|
||||
"id": "experience",
|
||||
"description": "Vismaz 5 gadu atbilstoša pieredze"
|
||||
},
|
||||
{
|
||||
"id": "project-management",
|
||||
"description": "Pieredze sarežģītu projektu vadībā"
|
||||
},
|
||||
{
|
||||
"id": "cybersecurity",
|
||||
"description": "Kiberdrošības un riska pārvaldības izpratne"
|
||||
}
|
||||
],
|
||||
"profileDimensions": [
|
||||
{
|
||||
"id": "professional",
|
||||
"name": "Profesionālais profils"
|
||||
},
|
||||
{
|
||||
"id": "skills",
|
||||
"name": "Prasmju profils"
|
||||
},
|
||||
{
|
||||
"id": "behavioural",
|
||||
"name": "Darba uzvedības profils"
|
||||
},
|
||||
{
|
||||
"id": "risk",
|
||||
"name": "Riska un pierādījumu profils"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"candidate": {
|
||||
"id": "candidate-pseudo-001",
|
||||
"displayName": "Kandidāts 001"
|
||||
},
|
||||
"application": {
|
||||
"consentConfirmed": true,
|
||||
"cvText": "10 gadu pieredze IT un kiberdrošības projektu vadībā...",
|
||||
"questionnaire": {
|
||||
"largestProject": "Daudzorganizāciju drošības transformācijas programma",
|
||||
"riskExample": "Riska reģistrs, kontroles un eskalācijas kārtība",
|
||||
"stakeholderExample": "Vadības, IT, drošības un piegādātāju koordinācija"
|
||||
}
|
||||
},
|
||||
"reviewerContext": {
|
||||
"language": "lv"
|
||||
}
|
||||
}
|
||||
96
examples/candidate-profile-output.example.json
Normal file
96
examples/candidate-profile-output.example.json
Normal file
@@ -0,0 +1,96 @@
|
||||
{
|
||||
"algorithm": {
|
||||
"id": "algo.openhr.candidate_profiler",
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"professionalProfile": {
|
||||
"cybersecurityCompetence": {
|
||||
"score": 82,
|
||||
"confidence": 0.81,
|
||||
"evidence": [
|
||||
"cv:security-program"
|
||||
]
|
||||
},
|
||||
"itProjectManagement": {
|
||||
"score": 88,
|
||||
"confidence": 0.86,
|
||||
"evidence": [
|
||||
"questionnaire:largestProject"
|
||||
]
|
||||
},
|
||||
"governanceAndRisk": {
|
||||
"score": 79,
|
||||
"confidence": 0.78,
|
||||
"evidence": [
|
||||
"questionnaire:riskExample"
|
||||
]
|
||||
},
|
||||
"stakeholderManagement": {
|
||||
"score": 84,
|
||||
"confidence": 0.8,
|
||||
"evidence": [
|
||||
"questionnaire:stakeholderExample"
|
||||
]
|
||||
}
|
||||
},
|
||||
"skillsProfile": {
|
||||
"technicalSkills": [
|
||||
"cybersecurity governance",
|
||||
"risk management",
|
||||
"enterprise IT"
|
||||
],
|
||||
"managementSkills": [
|
||||
"programme delivery",
|
||||
"stakeholder management"
|
||||
],
|
||||
"missingRequiredSkills": [],
|
||||
"transferableSkills": [
|
||||
"consulting",
|
||||
"business analysis"
|
||||
]
|
||||
},
|
||||
"behaviouralProfile": {
|
||||
"structuredWork": {
|
||||
"score": 81,
|
||||
"basis": "Evidence-backed work examples"
|
||||
},
|
||||
"decisionMaking": {
|
||||
"score": 77,
|
||||
"basis": "Risk and escalation example"
|
||||
},
|
||||
"collaboration": {
|
||||
"score": 83,
|
||||
"basis": "Cross-functional stakeholder example"
|
||||
}
|
||||
},
|
||||
"riskProfile": {
|
||||
"evidenceGaps": [
|
||||
"Certification evidence not attached"
|
||||
],
|
||||
"claimInconsistencies": [],
|
||||
"prohibitedAttributeLeakage": false,
|
||||
"roleMismatchRisks": [],
|
||||
"confidenceLimitations": [
|
||||
"No structured interview evidence"
|
||||
]
|
||||
},
|
||||
"recommendation": "NORMAL_REVIEW",
|
||||
"confidence": 0.79,
|
||||
"reasons": [
|
||||
"Strong role-related project evidence",
|
||||
"Human verification of certifications required"
|
||||
],
|
||||
"requiredHumanChecks": [
|
||||
"Verify employment chronology",
|
||||
"Verify certifications"
|
||||
],
|
||||
"limitations": [
|
||||
"Profile is based on CV and questionnaire only"
|
||||
],
|
||||
"evidenceReferences": [
|
||||
{
|
||||
"id": "cv:security-program",
|
||||
"source": "redacted_cv_text"
|
||||
}
|
||||
]
|
||||
}
|
||||
8
metadata/lifecycle.yaml
Normal file
8
metadata/lifecycle.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
status: draft
|
||||
version: 0.1.1
|
||||
maturity: proof-of-concept
|
||||
firstPublished: '2026-07-24'
|
||||
lastModified: '2026-07-24'
|
||||
changeControl:
|
||||
model: git-review
|
||||
requiresHumanApproval: true
|
||||
11
metadata/ownership.yaml
Normal file
11
metadata/ownership.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
owners:
|
||||
- type: team
|
||||
id: openhr-poc
|
||||
contact: info@algomation.io
|
||||
- type: role
|
||||
id: hr-process-owner
|
||||
contact: info@algomation.io
|
||||
accountability:
|
||||
finalDecisionOwner: hr-process-owner
|
||||
algorithmOwner: openhr-poc
|
||||
dataProtectionReviewer: data-protection-reviewer
|
||||
61
policies/candidate-evaluation-policy.yaml
Normal file
61
policies/candidate-evaluation-policy.yaml
Normal file
@@ -0,0 +1,61 @@
|
||||
kind: openhr.candidate-evaluation.policy
|
||||
id: policy.hr.candidate-evaluation.poc
|
||||
version: "0.1.0"
|
||||
|
||||
purpose:
|
||||
allowed:
|
||||
- assess_job_related_evidence
|
||||
- identify_evidence_gaps
|
||||
- create_review_priority
|
||||
- support_structured_human_review
|
||||
prohibited:
|
||||
- infer_medical_condition
|
||||
- infer_mental_health
|
||||
- infer_political_opinion
|
||||
- infer_religion
|
||||
- infer_sexual_orientation
|
||||
- infer_ethnicity
|
||||
- infer_trade_union_membership
|
||||
- use_family_status
|
||||
- use_candidate_photo
|
||||
- automatic_rejection
|
||||
- automatic_hiring
|
||||
- automatic_shortlisting
|
||||
|
||||
dataMinimization:
|
||||
algorithmReceives:
|
||||
- pseudonymousCandidateId
|
||||
- redactedCvText
|
||||
- structuredQuestionnaire
|
||||
- vacancyProfile
|
||||
excluded:
|
||||
- fullName
|
||||
- personalIdentityNumber
|
||||
- birthDate
|
||||
- gender
|
||||
- nationality
|
||||
- photo
|
||||
- homeAddress
|
||||
- familyStatus
|
||||
|
||||
humanOversight:
|
||||
mandatory: true
|
||||
reviewerMustSee:
|
||||
- algorithmId
|
||||
- algorithmVersion
|
||||
- packageVersion
|
||||
- evidenceReferences
|
||||
- confidence
|
||||
- limitations
|
||||
- requiredHumanChecks
|
||||
overrideRequiresRationale: true
|
||||
finalDecisionOwner: role.hr_reviewer
|
||||
|
||||
confidence:
|
||||
minimumForNormalReview: 0.70
|
||||
belowThresholdAction: enhanced_human_review
|
||||
|
||||
retention:
|
||||
assessmentSnapshot: P2Y
|
||||
auditEvents: P5Y
|
||||
rawCv: deployment_policy
|
||||
34
resources/guardrails.yaml
Normal file
34
resources/guardrails.yaml
Normal file
@@ -0,0 +1,34 @@
|
||||
kind: uapf.guardrails
|
||||
id: guardrails.openhr.candidate-evaluation
|
||||
version: 0.1.1
|
||||
rules:
|
||||
- id: human-decision-required
|
||||
effect: require
|
||||
action: authorized_hr_human_review
|
||||
- id: no-automatic-rejection
|
||||
effect: deny
|
||||
action: automatic_rejection
|
||||
- id: no-automatic-hiring
|
||||
effect: deny
|
||||
action: automatic_hiring
|
||||
- id: no-automatic-shortlisting
|
||||
effect: deny
|
||||
action: automatic_shortlisting
|
||||
- id: protected-attributes-excluded
|
||||
effect: deny
|
||||
inputs:
|
||||
- birthDate
|
||||
- gender
|
||||
- nationality
|
||||
- photo
|
||||
- familyStatus
|
||||
- ethnicity
|
||||
- religion
|
||||
- politicalOpinion
|
||||
- sexualOrientation
|
||||
- healthData
|
||||
- id: low-confidence-human-review
|
||||
effect: require
|
||||
when:
|
||||
confidenceBelow: 0.7
|
||||
action: enhanced_human_review
|
||||
15
resources/host-manifest.example.yaml
Normal file
15
resources/host-manifest.example.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
kind: uapf.host.manifest
|
||||
host:
|
||||
id: openhr
|
||||
name: OpenHR
|
||||
capabilities:
|
||||
- id: hr.application.prepare_evaluation_input@1
|
||||
inputSchema: schemas/candidate-evaluation-input.schema.json
|
||||
output:
|
||||
- pseudonymous_candidate_id
|
||||
- redacted_cv_text
|
||||
- structured_questionnaire
|
||||
- vacancy_profile
|
||||
- id: hr.assessment.review@1
|
||||
- id: hr.decision.record@1
|
||||
- id: event.emit@1
|
||||
98
resources/mappings.yaml
Normal file
98
resources/mappings.yaml
Normal file
@@ -0,0 +1,98 @@
|
||||
kind: uapf.resource.mappings
|
||||
version: "0.1.0"
|
||||
|
||||
targets:
|
||||
- id: role.hr_operator
|
||||
type: human_role
|
||||
name: "HR operators"
|
||||
- id: role.hr_reviewer
|
||||
type: human_role
|
||||
name: "Pilnvarots HR vērtētājs"
|
||||
- id: role.data_protection_reviewer
|
||||
type: human_role
|
||||
name: "Datu aizsardzības pārskatītājs"
|
||||
- id: system.openhr
|
||||
type: system_api
|
||||
name: "OpenHR"
|
||||
baseUrlRef: OPENHR_HOST_BASE_URL
|
||||
- id: system.dmn_engine
|
||||
type: system_api
|
||||
name: "UAPF DMN engine"
|
||||
- id: service.candidate_profiler
|
||||
type: external_service
|
||||
name: "Candidate profiler service"
|
||||
endpointRef: PROCESSGIT_CANDIDATE_PROFILER_URL
|
||||
- id: system.audit_log
|
||||
type: system_api
|
||||
name: "OpenHR audit event store"
|
||||
|
||||
bindings:
|
||||
- source: {type: bpmn.userTask, ref: Task_RegisterApplication}
|
||||
targetId: role.hr_operator
|
||||
mode: manual
|
||||
|
||||
- source: {type: bpmn.serviceTask, ref: Task_RedactInput}
|
||||
targetId: system.openhr
|
||||
mode: autonomous
|
||||
capability: hr.application.prepare_evaluation_input@1
|
||||
|
||||
- source: {type: bpmn.businessRuleTask, ref: Task_InputAdmissibility}
|
||||
targetId: system.dmn_engine
|
||||
mode: autonomous
|
||||
usesDecision: dmn/01-input-admissibility.dmn#Decision_InputAdmissibility
|
||||
|
||||
- source: {type: bpmn.serviceTask, ref: Task_ProfileCandidate}
|
||||
targetId: service.candidate_profiler
|
||||
mode: assisted
|
||||
algorithmCardRef: algo.openhr.candidate_profiler
|
||||
|
||||
- source: {type: bpmn.businessRuleTask, ref: Task_ReviewPriority}
|
||||
targetId: system.dmn_engine
|
||||
mode: autonomous
|
||||
usesDecision: dmn/02-review-priority.dmn#Decision_ReviewPriority
|
||||
|
||||
- source: {type: bpmn.userTask, ref: Task_DataProtectionReview}
|
||||
targetId: role.data_protection_reviewer
|
||||
mode: manual
|
||||
|
||||
- source: {type: bpmn.userTask, ref: Task_HumanReview}
|
||||
targetId: role.hr_reviewer
|
||||
mode: manual
|
||||
capability: hr.assessment.review@1
|
||||
|
||||
- source: {type: bpmn.userTask, ref: Task_RecordDecision}
|
||||
targetId: role.hr_reviewer
|
||||
mode: manual
|
||||
capability: hr.decision.record@1
|
||||
|
||||
- source: {type: bpmn.serviceTask, ref: Task_WriteAudit}
|
||||
targetId: system.audit_log
|
||||
mode: autonomous
|
||||
capability: event.emit@1
|
||||
|
||||
- source: {type: cmmn.humanTask, ref: HT_VerifyEvidence}
|
||||
targetId: role.hr_reviewer
|
||||
mode: manual
|
||||
discretionary: true
|
||||
|
||||
- source: {type: cmmn.humanTask, ref: HT_IndependentReview}
|
||||
targetId: role.hr_reviewer
|
||||
mode: manual
|
||||
discretionary: true
|
||||
|
||||
- source: {type: cmmn.humanTask, ref: HT_DataProtectionReview}
|
||||
targetId: role.data_protection_reviewer
|
||||
mode: manual
|
||||
discretionary: true
|
||||
|
||||
audit:
|
||||
targetId: system.audit_log
|
||||
events:
|
||||
- application_registered
|
||||
- evaluation_input_prepared
|
||||
- admissibility_checked
|
||||
- candidate_profile_generated
|
||||
- review_priority_determined
|
||||
- exception_review_opened
|
||||
- human_review_completed
|
||||
- human_decision_recorded
|
||||
47
schemas/candidate-evaluation-input.schema.json
Normal file
47
schemas/candidate-evaluation-input.schema.json
Normal file
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://processgit.org/schemas/openhr/candidate-evaluation-input.schema.json",
|
||||
"title": "Candidate evaluation input",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"vacancy",
|
||||
"candidate",
|
||||
"application"
|
||||
],
|
||||
"properties": {
|
||||
"vacancy": {
|
||||
"type": "object"
|
||||
},
|
||||
"candidate": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string"
|
||||
},
|
||||
"displayName": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"application": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"cvText": {
|
||||
"type": "string"
|
||||
},
|
||||
"questionnaire": {
|
||||
"type": "object"
|
||||
},
|
||||
"consentConfirmed": {
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
},
|
||||
"reviewerContext": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
}
|
||||
82
schemas/candidate-profile-output.schema.json
Normal file
82
schemas/candidate-profile-output.schema.json
Normal file
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://processgit.org/schemas/openhr/candidate-profile-output.schema.json",
|
||||
"title": "Candidate multidimensional profile",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"algorithm",
|
||||
"professionalProfile",
|
||||
"skillsProfile",
|
||||
"behaviouralProfile",
|
||||
"riskProfile",
|
||||
"recommendation",
|
||||
"confidence"
|
||||
],
|
||||
"properties": {
|
||||
"algorithm": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"version"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string"
|
||||
},
|
||||
"version": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"professionalProfile": {
|
||||
"type": "object"
|
||||
},
|
||||
"skillsProfile": {
|
||||
"type": "object"
|
||||
},
|
||||
"behaviouralProfile": {
|
||||
"type": "object"
|
||||
},
|
||||
"riskProfile": {
|
||||
"type": "object"
|
||||
},
|
||||
"recommendation": {
|
||||
"enum": [
|
||||
"NORMAL_REVIEW",
|
||||
"ENHANCED_REVIEW",
|
||||
"REQUEST_INFORMATION",
|
||||
"MANUAL_ONLY"
|
||||
]
|
||||
},
|
||||
"confidence": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"maximum": 1
|
||||
},
|
||||
"reasons": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"requiredHumanChecks": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"limitations": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"evidenceReferences": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
37
schemas/vacancy-profile.schema.json
Normal file
37
schemas/vacancy-profile.schema.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://processgit.org/schemas/openhr/vacancy-profile.schema.json",
|
||||
"title": "OpenHR vacancy profile",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"roleTitle",
|
||||
"mandatoryRequirements",
|
||||
"profileDimensions"
|
||||
],
|
||||
"properties": {
|
||||
"roleTitle": {
|
||||
"type": "string"
|
||||
},
|
||||
"mandatoryRequirements": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"profileDimensions": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"weights": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "number",
|
||||
"minimum": 0,
|
||||
"maximum": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
}
|
||||
27
tests/candidate-profiler-tests.yaml
Normal file
27
tests/candidate-profiler-tests.yaml
Normal file
@@ -0,0 +1,27 @@
|
||||
kind: uapf.algorithm.tests
|
||||
algorithmCardRef: algo.openhr.candidate_profiler
|
||||
cases:
|
||||
- id: complete-evidence
|
||||
input: examples/candidate-input.example.json
|
||||
assertions:
|
||||
- path: $.algorithm.id
|
||||
equals: algo.openhr.candidate_profiler
|
||||
- path: $.confidence
|
||||
minimum: 0.0
|
||||
maximum: 1.0
|
||||
- path: $.requiredHumanChecks
|
||||
type: array
|
||||
- path: $.recommendation
|
||||
oneOf: [NORMAL_REVIEW, ENHANCED_REVIEW, REQUEST_INFORMATION, MANUAL_ONLY]
|
||||
- id: protected-attribute-leakage
|
||||
fixture:
|
||||
prohibitedAttributeLeakage: true
|
||||
expected:
|
||||
recommendation: MANUAL_ONLY
|
||||
requiredCheck: DATA_PROTECTION_REVIEW
|
||||
- id: low-confidence
|
||||
fixture:
|
||||
confidence: 0.45
|
||||
expected:
|
||||
recommendation: ENHANCED_REVIEW
|
||||
requiredCheck: INDEPENDENT_HUMAN_ASSESSMENT
|
||||
82
uapf.yaml
Normal file
82
uapf.yaml
Normal file
@@ -0,0 +1,82 @@
|
||||
kind: uapf.package
|
||||
id: lv.ai-sandbox.hr.candidate-selection-evaluation
|
||||
name: HR atlase un kandidātu daudzdimensionālā vērtēšana
|
||||
description: UAPF Level-4 pakotne kandidāta pieteikuma pieļaujamības pārbaudei, ārēja
|
||||
daudzdimensionāla profila izveidei un obligātai HR cilvēka pārskatīšanai.
|
||||
level: 4
|
||||
version: 0.1.1
|
||||
cornerstones:
|
||||
bpmn: true
|
||||
dmn: true
|
||||
cmmn: true
|
||||
resources: true
|
||||
paths:
|
||||
bpmn: bpmn
|
||||
dmn: dmn
|
||||
cmmn: cmmn
|
||||
resources: resources
|
||||
metadata: metadata
|
||||
owners:
|
||||
- type: team
|
||||
id: openhr-poc
|
||||
contact: info@algomation.io
|
||||
- type: role
|
||||
id: hr-process-owner
|
||||
contact: info@algomation.io
|
||||
lifecycle: draft
|
||||
artifacts:
|
||||
bpmn:
|
||||
- path: bpmn/candidate-selection-evaluation.bpmn
|
||||
role: primary-process
|
||||
dmn:
|
||||
- path: dmn/01-input-admissibility.dmn
|
||||
role: input-gate
|
||||
- path: dmn/02-review-priority.dmn
|
||||
role: review-priority
|
||||
cmmn:
|
||||
- path: cmmn/candidate-review-case.cmmn
|
||||
role: exception-review
|
||||
resources:
|
||||
- path: resources/mappings.yaml
|
||||
role: resource-mapping
|
||||
- path: resources/guardrails.yaml
|
||||
role: guardrails
|
||||
- path: algorithms/candidate-profiler.card.yaml
|
||||
role: algorithm-card
|
||||
- path: schemas/candidate-evaluation-input.schema.json
|
||||
role: input-schema
|
||||
- path: schemas/candidate-profile-output.schema.json
|
||||
role: output-schema
|
||||
inputs:
|
||||
- vacancy
|
||||
- candidate
|
||||
- application
|
||||
- reviewerContext
|
||||
outputs:
|
||||
- admissibilityResult
|
||||
- candidateProfile
|
||||
- reviewPriority
|
||||
- requiredHumanChecks
|
||||
- processRecommendation
|
||||
- auditTrail
|
||||
requires_capabilities:
|
||||
- hr.application.prepare_evaluation_input@1
|
||||
- hr.assessment.review@1
|
||||
- hr.decision.record@1
|
||||
- event.emit@1
|
||||
profiles_supported:
|
||||
- uapf-ip-orchestrated
|
||||
guardrails: resources/guardrails.yaml
|
||||
exposure:
|
||||
mcp:
|
||||
enabled: true
|
||||
runnable: true
|
||||
exposedEntrypoints:
|
||||
- process: Process_CandidateSelectionEvaluation
|
||||
tool: evaluate_candidate
|
||||
exposedArtifacts:
|
||||
- manifest
|
||||
- bpmn
|
||||
- dmn
|
||||
- cmmn
|
||||
- tests
|
||||
Reference in New Issue
Block a user