MCP Server
Active
1
0

Import UAPF package: HR-atlase-vertesana-ProcessGit-v0.1.1.uapf

This commit is contained in:
2026-07-24 09:05:23 +00:00
parent 26a5827223
commit 69a09fac8c
19 changed files with 969 additions and 0 deletions

View 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

View 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>

View 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>

View 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>

View 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>&lt; 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>&gt;= 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
View 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.

View 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"
}
}

View 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
View 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
View 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

View 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
View 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

View 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
View 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

View 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"
}
}
}

View 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
}

View 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
}

View 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
View 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