MCP Server
Active
1
0
This commit is contained in:
2026-03-07 13:11:16 +02:00
commit a9204290b5
19 changed files with 1856 additions and 0 deletions

224
README.md Normal file
View File

@@ -0,0 +1,224 @@
# MI Sandbox Atlases Process — UAPF/ProcessGit Demo
Šis repozitorijs ir **UAPF Level 4 pakotne**, kas modelē VDAA publicēto
**Speciālās regulatīvās vides mākslīgā intelekta sistēmu attīstībai
projektu iesniegumu atlases nolikumu** kā mašīnlasāmu, versionējamu
un izpildāmu procesa + lēmumu + gadījumu modeli.
> **⚠ Svarīgi.** Šis ir demonstrācijas projekts. Tas nav oficiāls VDAA
> vai MI centra vērtēšanas instruments, nav juridiski saistošs un neaizstāj
> nolikuma tekstu vai iestādes pieņemto lēmumu.
---
## Ko šis demo parāda
1. **Process (BPMN)** — iesnieguma plūsma no saņemšanas līdz lēmumam,
ieskaitot trūkumu novēršanas apakšplūsmu ar 5 d.d. taimeri.
2. **Algoritms (DMN)** — trīs lēmumu modeļi: atbilstības vārti,
svērtais punktu aprēķins, TRL līmeņu kartējums.
3. **Gadījuma pārvaldība (CMMN)** — komisijas vērtēšana ar obligātiem
un diskrecionāriem soļiem (ārējie eksperti, AI iepriekšējais novērtējums).
4. **Resursu kartējums** — kas izpilda katru uzdevumu: cilvēki, sistēmas, AI aģenti.
5. **AI aģenta koncepts** — kā piesaistīt MI vērtēšanas asistentu ar
guardrails ierobežojumiem un EU AI Act atbilstību.
6. **ProcessGit viewer GUI** — interaktīvs komisijas vērtēšanas panelis,
kas ielādējas ProcessGit saskarnē.
---
## UAPF struktūra
```text
enterprise/
enterprise.yaml # L0 — darbvietas indekss
processes/L4/vdaa.mi.sandbox.atlase/ # L4 — izpildāmā pakotne
uapf.yaml # UAPF manifests (kind: uapf.package)
agent.chat.yaml # ProcessGit AI čata konfigurācija
processgit.viewer.json # Pielāgota GUI deklarācija
bpmn/
mi-sandbox-atlase.bpmn.xml # Galvenais process
dmn/
01-atbilstiba-un-izsledzosie.dmn.xml # Atbilstības un izslēdzošo nosacījumu DMN
02-vertesanas-punkti.dmn.xml # 5 kritēriju svērtais punktu aprēķins
03-trl-vertejums.dmn.xml # TRL → 0–5 vērtējuma kartējums
cmmn/
vertesanas-lieta.cmmn.xml # Komisijas vērtēšanas gadījums
resources/
mappings.yaml # Targets + bindings (UAPF formāts)
guardrails/
ai-evaluation-rules.yaml # AI aģenta ierobežojumi un EU AI Act
metadata/
ownership.yaml # Īpašnieki un pārskatīšana
lifecycle.yaml # Dzīves cikla statuss un ierobežojumi
examples/
candidate-input.example.json # Piemēra iesnieguma dati
expected-output.example.json # Sagaidāmais rezultāts (ar AI novērtējumu)
viewer/
komisija-vertesana.html # Interaktīvs vērtēšanas panelis
docs/
source-reference.md # Nolikuma punktu kartējums uz artefaktiem
CHANGELOG.md # Izmaiņu žurnāls
```
---
## Kā tas darbojas
### 1. Iesnieguma saņemšana un reģistrācija
BPMN process sākas ar elektronisku iesniegumu (info@ailatvia.lv).
Lietvedības darbinieks reģistrē un veic sākotnējo pārbaudi.
### 2. Formālā atbilstība (DMN 01)
Lēmumu tabula ar `FIRST` hit policy pārbauda 7 nosacījumus secīgi:
juridiskais statuss → jurisdikcija (LV/EU/EEA/CH) → termiņš →
valoda → e-paraksts → aizliegtā prakse → izslēdzošie nosacījumi.
Trīs iespējamie iznākumi: `ELIGIBLE`, `FIX_OR_REJECT`, `REJECT`.
### 3. Trūkumu novēršana (Nolikuma 12.p.)
Ja rezultāts ir `FIX_OR_REJECT`, BPMN aktivizē apakšplūsmu:
pieprasījums → gaidīšana ar 5 darba dienu taimeri → atkārtota pārbaude
vai noraidīšana pēc termiņa beigām.
### 4. Kompetento institūciju atzinumi (Nolikuma 13.–14.p.)
Process nosūta iesniegumu kompetentajām institūcijām 3 darbdienu laikā
un gaida atzinumus MK noteikumu 14.p. termiņā.
### 5. Komisijas vērtēšana (Nolikuma 16.–19.p.)
Komisija piešķir 0–5 vērtējumus pieciem kritērijiem. CMMN modelis
ļauj diskrecionāri piesaistīt ārējos ekspertus vai AI aģentu.
### 6. Punktu aprēķins (DMN 02 + DMN 03)
TRL līmenis vispirms tiek kartēts uz 0–5 skalu (DMN 03, 2.pielikums),
pēc tam svērtais punktu aprēķins visiem kritērijiem:
```
kritērija_punkti = svars × (vērtējums / 5)
gala_summa = Σ visu kritēriju punkti
```
| Nr. | Kritērijs | Svars |
|-----|-----------|-------|
| 1 | Inovitāte un tirgus nepilnību novēršana | 20 |
| 2 | Ieguldījums digitālās transformācijas mērķos | 15 |
| 3 | Tehniskā gatavība un resursu nodrošinājums | 30 |
| 4 | Augsta riska MI sistēmas kvalifikācija | 10 |
| 5 | Regulatīvās vides pamatojums | 25 |
Neizšķirtā gadījumā prioritāte: Kr.3 → Kr.5 → Kr.1.
### 7. Lēmums (Nolikuma 20., 22.p.)
Ne vairāk kā 3 MI sistēmas ar augstāko punktu skaitu tiek iekļautas
speciālajā regulatīvajā vidē. Paziņojums ≤45 dienas.
---
## AI aģenta koncepts
### Arhitektūra
AI aģents darbojas **asistētā režīmā** (`mode: assisted`) — tas sniedz
strukturētu ieteikumu, bet galīgais lēmums ir cilvēka (komisijas) ziņā.
```
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Iesnieguma │────▸│ AI Aģents │────▸│ Komisijas │
│ dati │ │ (asistents) │ │ panelis │
└─────────────┘ └──────┬───────┘ └────────┬────────┘
│ │
┌──────▼───────┐ ┌─────▼──────┐
│ Guardrails │ │ Galīgais │
│ validācija │ │ lēmums │
└──────────────┘ └────────────┘
```
### MCP rīki
AI aģentam ir pieejami trīs MCP rīki, kas izpilda DMN modeļus:
- `check_eligibility` — pārbauda atbilstību
- `calculate_score` — aprēķina punktus
- `map_trl_level` — kartē TRL līmeni
### Guardrails
Fails `guardrails/ai-evaluation-rules.yaml` definē:
- **4 obligātos principus**: cilvēka lēmums, pārredzamība, vērtējumu nemainīšana, audits
- **Ievades validāciju**: shēmas pārbaude, diapazona kontrole, GDPR redakcija
- **Izvades ierobežojumus**: strukturēts JSON ar pamatojumu un atsaucēm
- **Aizliegtās darbības**: 6 konkrēti aizliegumi
- **EU AI Act atbilstību**: atsauces uz Regulas 3., 10., 13., 14. pantu
### Kāpēc tas ir nozīmīgi
Šis koncepts demonstrē, kā regulatīvā procesa kontekstā var:
1. **Definēt AI iesaisti kā mašīnlasāmu konfigurāciju** (ne tikai aprakstu)
2. **Nodrošināt guardrails kā koda artefaktu** (versionējams, pārskatāms, pārbaudāms)
3. **Saglabāt pilnu audita pēdu** par AI darbībām
4. **Demonstrēt EU AI Act atbilstību** strukturēti
---
## ProcessGit viewer
Fails `processgit.viewer.json` aktivizē interaktīvu komisijas vērtēšanas
paneli, kad lietotājs atver `examples/candidate-input.example.json`.
Panelis ietver 5 cilnes:
| Cilne | Saturs |
|-------|--------|
| **Atbilstība** | Formālās atbilstības pārbaude ar DMN 01 loģiku |
| **Vērtēšana** | Kritēriju vērtējumu ievade, punktu aprēķins, TRL kartējums |
| **AI Aģents** | AI iepriekšējā novērtējuma palaišana un rezultāta pārskatīšana |
| **Guardrails** | AI ierobežojumu un EU AI Act atbilstības vizualizācija |
| **Audits** | Notikumu žurnāls ar laika zīmogiem |
Viewer izmanto PGV (ProcessGit Viewer) protokolu un var saglabāt izmaiņas
atpakaļ repozitorijā caur `PGV_REQUEST_SAVE`.
---
## Kā izmantot
1. Atver repozitoriju ProcessGit vidē (`processgit.org` vai `processgit.dev`).
2. Atver `bpmn/mi-sandbox-atlase.bpmn.xml` — grafiski redzams process.
3. Atver `dmn/*.dmn.xml` — lēmumu tabulas ar skaidrojumiem.
4. Atver `cmmn/vertesanas-lieta.cmmn.xml` — gadījuma modelis.
5. Atver `examples/candidate-input.example.json` — ielādējas viewer GUI.
6. Noklikšķini uz `agent.chat.yaml` — atveras AI čata panelis (🏛️).
---
## UAPF atbilstība
| Prasība | Statuss |
|---------|--------|
| `kind: uapf.package` manifestā | ✅ |
| `cornerstones` deklarācija (BPMN+DMN+CMMN+Resources) | ✅ |
| `owners` ar kontaktu | ✅ |
| `lifecycle` statuss | ✅ |
| L0 enterprise index ar `kind: uapf.enterprise.index` | ✅ |
| `.bpmn.xml` / `.dmn.xml` / `.cmmn.xml` paplašinājumi | ✅ |
| `resources/mappings.yaml` ar targets + bindings | ✅ |
| `metadata/` ar ownership + lifecycle | ✅ |
| MCP endpoint deklarācija (`exposure.mcp`) | ✅ |
---
## Licences un ierobežojumi
- **Demo pakotne** — nav paredzēta oficiālai lēmumu pieņemšanai.
- **AI aģenta ieteikums nav saistošs** — tikai komisijas lēmums ir galīgs.
- **Piemēra dati ir fiktīvi** — nesatur personas datus.
- UAPF specifikācija: [github.com/UAPFormat/UAPF-specification](https://github.com/UAPFormat/UAPF-specification)
- ProcessGit: [github.com/Algomation-AI/ProcessGit](https://github.com/Algomation-AI/ProcessGit)

View File

@@ -0,0 +1,22 @@
kind: uapf.enterprise.index
level: 0
enterprise:
id: lv.vdaa.mi-sandbox
name: "VDAA MI sistēmu atlases regulatīvā vide"
description: >-
Demonstrācijas darbvieta, kas parāda, kā Speciālās regulatīvās vides
MI sistēmu attīstībai projektu iesniegumu atlases nolikumu modelēt kā
UAPF/ProcessGit projektu ar procesa, lēmumu loģikas un AI aģentu nodalīšanu.
packages:
- ref: ../processes/L4/vdaa.mi.sandbox.atlase
level: 4
domain: public-sector-regulation
tags:
- ai-act
- sandbox
- evaluation
- latvia
owners:
- type: team
id: algomation
contact: info@algomation.io

View File

@@ -0,0 +1,67 @@
# ProcessGit AI Chat Agent konfigurācija
# Šis fails aktivizē 🤖 ikonu ProcessGit repozitorija failā kokā
# un ielādē MI vērtēšanas asistentu, kad lietotājs to atver.
ui:
name: "MI Atlases Asistents"
icon: "🏛️"
bubbles:
- "Pārbaudi iesnieguma atbilstību"
- "Aprēķini punktus no šiem vērtējumiem"
- "Kāds TRL līmenis atbilst mūsu sistēmai?"
- "Izskaidro neizšķirta gadījuma loģiku"
- "Parādi vērtēšanas kritēriju svarus"
theme:
primary: "#1a365d"
accent: "#e53e3e"
llm:
provider: anthropic
model: claude-sonnet-4-20250514
api_key_ref: ANTHROPIC_API_KEY
max_tokens: 4096
system_prompt: |
Tu esi MI sistēmu atlases procesa asistents, kas palīdz komisijas locekļiem
un iesniedzējiem izprast VDAA speciālās regulatīvās vides atlases nolikumu.
Tavas galvenās spējas:
1. Pārbaudīt iesnieguma formālo atbilstību (DMN: 01-atbilstiba-un-izsledzosie.dmn.xml)
2. Aprēķināt svērtos punktus no komisijas vērtējumiem (DMN: 02-vertesanas-punkti.dmn.xml)
3. Kartēt TRL līmeņus uz 0-5 skalu (DMN: 03-trl-vertejums.dmn.xml)
4. Izskaidrot vērtēšanas kritērijus, svarus un enkurus
5. Parādīt neizšķirta gadījuma atrisināšanas loģiku
SVARĪGI IEROBEŽOJUMI:
- Tu esi ASISTENTS, nevis lēmumu pieņēmējs. Galīgais lēmums ir komisijas.
- Tu nedrīksti mainīt komisijas piešķirtos vērtējumus.
- Tu nedrīksti salīdzināt konkrētus iesniedzējus savā starpā.
- Katram ieteikumam pievieno atsauci uz nolikuma punktu.
- Ja nav pietiekamu datu, saki to skaidri, nevis izdomā.
Atbildi latviešu valodā, ja vien lietotājs neraksta angliski.
mcp:
use_repo_mcp: true
additional_servers: []
allowed_tools:
- check_eligibility
- calculate_score
- map_trl_level
- search_process
- get_decision_table
history:
storage: git-branch
branch: chat-history
retention_days: 90
batch_commit_interval: 300
access:
roles:
- commission-member
- case-officer
- external-expert
- demo-viewer
rate_limit:
requests_per_minute: 10
daily_budget_usd: 5.00

View File

@@ -0,0 +1,174 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
id="Definitions_VDAA_MI_Sandbox"
targetNamespace="https://processgit.org/VDAA/mi-sandbox-atlase">
<bpmn:process id="Process_MI_Sandbox_Atlase" name="MI sistēmu atlases process (Nolikums)" isExecutable="false">
<!-- ===== START ===== -->
<bpmn:startEvent id="Start_ApplicationReceived" name="Saņemts iesniegums (e-pasts info@ailatvia.lv)">
<bpmn:outgoing>Flow_01</bpmn:outgoing>
</bpmn:startEvent>
<!-- ===== PHASE 1: Registration & Formal Check ===== -->
<bpmn:userTask id="Task_Register" name="Reģistrēt iesniegumu">
<bpmn:documentation>Nolikuma 7.p. — iesniegums nosūtīts elektroniski, parakstīts ar drošu e-parakstu ar laika zīmogu.</bpmn:documentation>
<bpmn:incoming>Flow_01</bpmn:incoming>
<bpmn:outgoing>Flow_02</bpmn:outgoing>
</bpmn:userTask>
<bpmn:businessRuleTask id="Task_EligibilityDMN" name="DMN: Atbilstība un izslēdzošie nosacījumi">
<bpmn:documentation>Nolikuma 6.p., 13.p. — pārbauda juridisko statusu, jurisdikciju, termiņu, valodu, e-parakstu, aizliegtās prakses un izslēdzošos nosacījumus.</bpmn:documentation>
<bpmn:incoming>Flow_02</bpmn:incoming>
<bpmn:outgoing>Flow_03</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:exclusiveGateway id="GW_EligibilityResult" name="Atbilstības rezultāts">
<bpmn:incoming>Flow_03</bpmn:incoming>
<bpmn:outgoing>Flow_Eligible</bpmn:outgoing>
<bpmn:outgoing>Flow_NeedsFixing</bpmn:outgoing>
<bpmn:outgoing>Flow_Rejected</bpmn:outgoing>
</bpmn:exclusiveGateway>
<!-- ===== Deficiency correction sub-flow (Nolikuma 12.p.) ===== -->
<bpmn:sendTask id="Task_RequestFix" name="Pieprasīt trūkumu novēršanu (5 darba dienas)">
<bpmn:documentation>Nolikuma 12.p. — Centrs pieprasa novērst trūkumus 5 darba dienu laikā.</bpmn:documentation>
<bpmn:incoming>Flow_NeedsFixing</bpmn:incoming>
<bpmn:outgoing>Flow_WaitFix</bpmn:outgoing>
</bpmn:sendTask>
<bpmn:receiveTask id="Task_ReceiveFix" name="Saņemt precizējumu">
<bpmn:incoming>Flow_WaitFix</bpmn:incoming>
<bpmn:outgoing>Flow_ReCheck</bpmn:outgoing>
</bpmn:receiveTask>
<bpmn:boundaryEvent id="Timer_FixDeadline" name="5 darba dienas" attachedToRef="Task_ReceiveFix" cancelActivity="true">
<bpmn:timerEventDefinition id="TimerDef_Fix">
<bpmn:timeDuration>P5D</bpmn:timeDuration>
</bpmn:timerEventDefinition>
<bpmn:outgoing>Flow_FixTimeout</bpmn:outgoing>
</bpmn:boundaryEvent>
<bpmn:sequenceFlow id="Flow_ReCheck" sourceRef="Task_ReceiveFix" targetRef="Task_EligibilityDMN"/>
<bpmn:sequenceFlow id="Flow_FixTimeout" sourceRef="Timer_FixDeadline" targetRef="End_NotSubmitted"/>
<bpmn:endEvent id="End_NotSubmitted" name="Atzīts par neiesniegtu (trūkumi nenovērsti)">
<bpmn:incoming>Flow_FixTimeout</bpmn:incoming>
</bpmn:endEvent>
<!-- ===== PHASE 2: Competent Authority Opinion (Nolikuma 13.-14.p.) ===== -->
<bpmn:sendTask id="Task_SendToAuthority" name="Nosūtīt kompetentajām institūcijām (3 darba dienu laikā)">
<bpmn:documentation>Nolikuma 13.p. — nosūta 3 darbdienu laikā no saņemšanas.</bpmn:documentation>
<bpmn:incoming>Flow_Eligible</bpmn:incoming>
<bpmn:outgoing>Flow_04</bpmn:outgoing>
</bpmn:sendTask>
<bpmn:receiveTask id="Task_ReceiveOpinion" name="Saņemt kompetento institūciju atzinumus">
<bpmn:documentation>Nolikuma 14.p. — atzinums MK noteikumu 14.p. termiņā.</bpmn:documentation>
<bpmn:incoming>Flow_04</bpmn:incoming>
<bpmn:outgoing>Flow_05</bpmn:outgoing>
</bpmn:receiveTask>
<!-- ===== PHASE 3: Commission Evaluation (Nolikuma 16.-19.p.) ===== -->
<bpmn:userTask id="Task_CommissionScoring" name="Komisija: piešķirt 0–5 vērtējumus 5 kritērijiem">
<bpmn:documentation>Nolikuma 18.-19.p. — Komisija vērtē atbilstoši 1.pielikuma metodoloģijai. Var piesaistīt ārējos ekspertus.</bpmn:documentation>
<bpmn:incoming>Flow_05</bpmn:incoming>
<bpmn:outgoing>Flow_06</bpmn:outgoing>
</bpmn:userTask>
<bpmn:businessRuleTask id="Task_TRLMapping" name="DMN: TRL → 0–5 vērtējums">
<bpmn:documentation>Nolikuma 2.pielikums — TRL1-9 pārvēršana 0-5 skalā kritērijam Nr.3.</bpmn:documentation>
<bpmn:incoming>Flow_06</bpmn:incoming>
<bpmn:outgoing>Flow_06b</bpmn:outgoing>
</bpmn:businessRuleTask>
<bpmn:businessRuleTask id="Task_ScoringDMN" name="DMN: Aprēķināt svērtos punktus un reitingu">
<bpmn:documentation>Nolikuma 1.pielikums — formula: svars × (vērtējums / 5). Neizšķirta gadījumā: Kr.3 → Kr.5 → Kr.1.</bpmn:documentation>
<bpmn:incoming>Flow_06b</bpmn:incoming>
<bpmn:outgoing>Flow_07</bpmn:outgoing>
</bpmn:businessRuleTask>
<!-- ===== PHASE 4: Decision (Nolikuma 20., 22.p.) ===== -->
<bpmn:userTask id="Task_PrepareDecision" name="Sagatavot pamatotu lēmumu">
<bpmn:documentation>Nolikuma 20.p. — Komisija sagatavo vērtējumu un pieņem pamatotu lēmumu. Ne vairāk kā 3 MI sistēmas ar augstāko punktu skaitu (22.p.).</bpmn:documentation>
<bpmn:incoming>Flow_07</bpmn:incoming>
<bpmn:outgoing>Flow_08</bpmn:outgoing>
</bpmn:userTask>
<bpmn:sendTask id="Task_NotifyApplicant" name="Paziņot lēmumu iesniedzējam (≤45 dienas)">
<bpmn:documentation>Nolikuma 15.p. — ne vēlāk kā 45 dienu laikā no iesniegšanas beigu datuma.</bpmn:documentation>
<bpmn:incoming>Flow_08</bpmn:incoming>
<bpmn:outgoing>Flow_09</bpmn:outgoing>
</bpmn:sendTask>
<bpmn:endEvent id="End_DecisionIssued" name="Lēmums paziņots">
<bpmn:incoming>Flow_09</bpmn:incoming>
</bpmn:endEvent>
<bpmn:endEvent id="End_Rejected" name="Iesniegums noraidīts (neatbilst)">
<bpmn:incoming>Flow_Rejected</bpmn:incoming>
</bpmn:endEvent>
<!-- ===== SEQUENCE FLOWS ===== -->
<bpmn:sequenceFlow id="Flow_01" sourceRef="Start_ApplicationReceived" targetRef="Task_Register"/>
<bpmn:sequenceFlow id="Flow_02" sourceRef="Task_Register" targetRef="Task_EligibilityDMN"/>
<bpmn:sequenceFlow id="Flow_03" sourceRef="Task_EligibilityDMN" targetRef="GW_EligibilityResult"/>
<bpmn:sequenceFlow id="Flow_Eligible" name="ELIGIBLE" sourceRef="GW_EligibilityResult" targetRef="Task_SendToAuthority"/>
<bpmn:sequenceFlow id="Flow_NeedsFixing" name="FIX_OR_REJECT" sourceRef="GW_EligibilityResult" targetRef="Task_RequestFix"/>
<bpmn:sequenceFlow id="Flow_Rejected" name="REJECT" sourceRef="GW_EligibilityResult" targetRef="End_Rejected"/>
<bpmn:sequenceFlow id="Flow_WaitFix" sourceRef="Task_RequestFix" targetRef="Task_ReceiveFix"/>
<bpmn:sequenceFlow id="Flow_04" sourceRef="Task_SendToAuthority" targetRef="Task_ReceiveOpinion"/>
<bpmn:sequenceFlow id="Flow_05" sourceRef="Task_ReceiveOpinion" targetRef="Task_CommissionScoring"/>
<bpmn:sequenceFlow id="Flow_06" sourceRef="Task_CommissionScoring" targetRef="Task_TRLMapping"/>
<bpmn:sequenceFlow id="Flow_06b" sourceRef="Task_TRLMapping" targetRef="Task_ScoringDMN"/>
<bpmn:sequenceFlow id="Flow_07" sourceRef="Task_ScoringDMN" targetRef="Task_PrepareDecision"/>
<bpmn:sequenceFlow id="Flow_08" sourceRef="Task_PrepareDecision" targetRef="Task_NotifyApplicant"/>
<bpmn:sequenceFlow id="Flow_09" sourceRef="Task_NotifyApplicant" targetRef="End_DecisionIssued"/>
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_MI_Sandbox_Atlase">
<!-- Row 1: Main happy path -->
<bpmndi:BPMNShape id="S_Start" bpmnElement="Start_ApplicationReceived"><dc:Bounds x="80" y="200" width="36" height="36"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_Register" bpmnElement="Task_Register"><dc:Bounds x="160" y="178" width="140" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_EligDMN" bpmnElement="Task_EligibilityDMN"><dc:Bounds x="340" y="178" width="180" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_GW_Elig" bpmnElement="GW_EligibilityResult" isMarkerVisible="true"><dc:Bounds x="560" y="193" width="50" height="50"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_SendAuth" bpmnElement="Task_SendToAuthority"><dc:Bounds x="660" y="178" width="160" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_RecvOpin" bpmnElement="Task_ReceiveOpinion"><dc:Bounds x="860" y="178" width="160" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_CommScore" bpmnElement="Task_CommissionScoring"><dc:Bounds x="1060" y="178" width="180" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_TRL" bpmnElement="Task_TRLMapping"><dc:Bounds x="1280" y="178" width="160" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_ScoreDMN" bpmnElement="Task_ScoringDMN"><dc:Bounds x="1480" y="178" width="180" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_Decision" bpmnElement="Task_PrepareDecision"><dc:Bounds x="1700" y="178" width="160" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_Notify" bpmnElement="Task_NotifyApplicant"><dc:Bounds x="1900" y="178" width="160" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_End" bpmnElement="End_DecisionIssued"><dc:Bounds x="2100" y="200" width="36" height="36"/></bpmndi:BPMNShape>
<!-- Row 2: Fix sub-flow -->
<bpmndi:BPMNShape id="S_ReqFix" bpmnElement="Task_RequestFix"><dc:Bounds x="460" y="340" width="180" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_RecvFix" bpmnElement="Task_ReceiveFix"><dc:Bounds x="460" y="460" width="180" height="80"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_Timer" bpmnElement="Timer_FixDeadline"><dc:Bounds x="622" y="522" width="36" height="36"/></bpmndi:BPMNShape>
<bpmndi:BPMNShape id="S_EndNS" bpmnElement="End_NotSubmitted"><dc:Bounds x="720" y="522" width="36" height="36"/></bpmndi:BPMNShape>
<!-- Row 3: Rejection -->
<bpmndi:BPMNShape id="S_EndRej" bpmnElement="End_Rejected"><dc:Bounds x="660" y="100" width="36" height="36"/></bpmndi:BPMNShape>
<!-- Edges -->
<bpmndi:BPMNEdge id="E_01" bpmnElement="Flow_01"><di:waypoint x="116" y="218"/><di:waypoint x="160" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_02" bpmnElement="Flow_02"><di:waypoint x="300" y="218"/><di:waypoint x="340" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_03" bpmnElement="Flow_03"><di:waypoint x="520" y="218"/><di:waypoint x="560" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_Elig" bpmnElement="Flow_Eligible"><di:waypoint x="610" y="218"/><di:waypoint x="660" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_Fix" bpmnElement="Flow_NeedsFixing"><di:waypoint x="585" y="243"/><di:waypoint x="585" y="380"/><di:waypoint x="460" y="380"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_Rej" bpmnElement="Flow_Rejected"><di:waypoint x="585" y="193"/><di:waypoint x="585" y="118"/><di:waypoint x="660" y="118"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_WFix" bpmnElement="Flow_WaitFix"><di:waypoint x="550" y="420"/><di:waypoint x="550" y="460"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_ReChk" bpmnElement="Flow_ReCheck"><di:waypoint x="460" y="500"/><di:waypoint x="380" y="500"/><di:waypoint x="380" y="258"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_Tmout" bpmnElement="Flow_FixTimeout"><di:waypoint x="658" y="540"/><di:waypoint x="720" y="540"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_04" bpmnElement="Flow_04"><di:waypoint x="820" y="218"/><di:waypoint x="860" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_05" bpmnElement="Flow_05"><di:waypoint x="1020" y="218"/><di:waypoint x="1060" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_06" bpmnElement="Flow_06"><di:waypoint x="1240" y="218"/><di:waypoint x="1280" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_06b" bpmnElement="Flow_06b"><di:waypoint x="1440" y="218"/><di:waypoint x="1480" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_07" bpmnElement="Flow_07"><di:waypoint x="1660" y="218"/><di:waypoint x="1700" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_08" bpmnElement="Flow_08"><di:waypoint x="1860" y="218"/><di:waypoint x="1900" y="218"/></bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="E_09" bpmnElement="Flow_09"><di:waypoint x="2060" y="218"/><di:waypoint x="2100" y="218"/></bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmmn:definitions xmlns:cmmn="http://www.omg.org/spec/CMMN/20151109/MODEL"
xmlns:cmmndi="http://www.omg.org/spec/CMMN/20151109/CMMNDI"
xmlns:dc="http://www.omg.org/spec/CMMN/20151109/DC"
id="Definitions_EvaluationCase"
targetNamespace="https://processgit.org/VDAA/mi-sandbox-atlase/cmmn">
<cmmn:case id="Case_ProjectEvaluation" name="MI projekta iesnieguma vērtēšanas lieta">
<cmmn:casePlanModel id="CPM_Evaluation" name="Vērtēšanas lieta">
<!-- === Required stages === -->
<cmmn:stage id="Stage_FormalCheck" name="Formālā pārbaude">
<cmmn:planItem id="PI_RegisterApp" definitionRef="HT_RegisterApp"/>
<cmmn:planItem id="PI_RunEligibility" definitionRef="PT_RunEligibility"/>
<cmmn:planItem id="PI_RequestFix" definitionRef="HT_RequestFix">
<cmmn:entryCriterion id="EC_NeedsFix" sentryRef="Sentry_NeedsFix"/>
</cmmn:planItem>
</cmmn:stage>
<cmmn:stage id="Stage_ExpertOpinion" name="Kompetento institūciju atzinumi">
<cmmn:planItem id="PI_SendToAuthority" definitionRef="HT_SendToAuthority"/>
<cmmn:planItem id="PI_CollectOpinions" definitionRef="HT_CollectOpinions"/>
</cmmn:stage>
<cmmn:stage id="Stage_CommissionEval" name="Komisijas vērtēšana">
<cmmn:planItem id="PI_ScoreCriteria" definitionRef="HT_ScoreCriteria"/>
<cmmn:planItem id="PI_RunScoring" definitionRef="PT_RunScoring"/>
<!-- Discretionary: commission may involve external experts (Nolikuma 19.p.) -->
<cmmn:planItem id="PI_ExternalExpert" definitionRef="HT_ExternalExpert">
<cmmn:itemControl><cmmn:manualActivationRule/></cmmn:itemControl>
</cmmn:planItem>
<!-- Discretionary: AI agent pre-assessment -->
<cmmn:planItem id="PI_AIPreAssessment" definitionRef="PT_AIPreAssessment">
<cmmn:itemControl><cmmn:manualActivationRule/></cmmn:itemControl>
</cmmn:planItem>
</cmmn:stage>
<cmmn:stage id="Stage_Decision" name="Lēmuma pieņemšana">
<cmmn:planItem id="PI_PrepareDecision" definitionRef="HT_PrepareDecision"/>
<cmmn:planItem id="PI_NotifyApplicant" definitionRef="HT_NotifyApplicant"/>
</cmmn:stage>
<!-- === Milestones === -->
<cmmn:milestone id="MS_Eligible" name="Iesniegums atzīts par atbilstošu"/>
<cmmn:milestone id="MS_OpinionsReceived" name="Visi atzinumi saņemti"/>
<cmmn:milestone id="MS_Scored" name="Punkti aprēķināti"/>
<!-- === Sentries === -->
<cmmn:sentry id="Sentry_NeedsFix">
<cmmn:planItemOnPart sourceRef="PI_RunEligibility">
<cmmn:standardEvent>complete</cmmn:standardEvent>
</cmmn:planItemOnPart>
<cmmn:ifPart><cmmn:condition>eligibilityResult.status = "FIX_OR_REJECT"</cmmn:condition></cmmn:ifPart>
</cmmn:sentry>
</cmmn:casePlanModel>
<!-- === Task Definitions === -->
<cmmn:humanTask id="HT_RegisterApp" name="Reģistrēt iesniegumu"/>
<cmmn:processTask id="PT_RunEligibility" name="Izpildīt atbilstības DMN" processRef="dmn/01-atbilstiba-un-izsledzosie.dmn.xml"/>
<cmmn:humanTask id="HT_RequestFix" name="Pieprasīt trūkumu novēršanu (5 d.d.)"/>
<cmmn:humanTask id="HT_SendToAuthority" name="Nosūtīt kompetentajām institūcijām"/>
<cmmn:humanTask id="HT_CollectOpinions" name="Apkopot saņemtos atzinumus"/>
<cmmn:humanTask id="HT_ScoreCriteria" name="Piešķirt 0–5 vērtējumus katram kritērijam"/>
<cmmn:processTask id="PT_RunScoring" name="Izpildīt punktu aprēķina DMN" processRef="dmn/02-vertesanas-punkti.dmn.xml"/>
<cmmn:humanTask id="HT_ExternalExpert" name="Piesaistīt ārējo ekspertu (Nolikuma 19.p.)"/>
<cmmn:processTask id="PT_AIPreAssessment" name="AI aģenta iepriekšējais novērtējums (demo)"/>
<cmmn:humanTask id="HT_PrepareDecision" name="Sagatavot pamatotu lēmumu"/>
<cmmn:humanTask id="HT_NotifyApplicant" name="Paziņot lēmumu (≤45 dienas)"/>
</cmmn:case>
</cmmn:definitions>

View File

@@ -0,0 +1,93 @@
<?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/DD/20100524/DC/"
id="Definitions_Eligibility"
name="Atbilstība un izslēdzošie nosacījumi"
namespace="https://processgit.org/VDAA/mi-sandbox-atlase/dmn/eligibility">
<!-- === INPUT DATA === -->
<inputData id="In_IsLegalEntity" name="isLegalEntity"/>
<inputData id="In_Jurisdiction" name="jurisdiction"/>
<inputData id="In_SubmittedInTime" name="submittedInTime"/>
<inputData id="In_DocumentsInLatvian" name="documentsInLatvian"/>
<inputData id="In_HasESignature" name="hasQualifiedESignatureAndTimestamp"/>
<inputData id="In_IsForbiddenAI" name="isForbiddenAIPractice"/>
<inputData id="In_HasExclusion" name="hasExclusionUnderLaw8p3"/>
<!-- === JURISDICTION CHECK (Nolikuma 6.1.p.) === -->
<decision id="Decision_JurisdictionOk" name="JurisdictionCheck">
<variable name="jurisdictionOk" typeRef="boolean"/>
<informationRequirement><requiredInput href="#In_Jurisdiction"/></informationRequirement>
<decisionTable id="DT_Jurisdiction" hitPolicy="UNIQUE">
<input id="JIn_1"><inputExpression typeRef="string"><text>jurisdiction</text></inputExpression></input>
<output id="JOut_1" name="jurisdictionOk" typeRef="boolean"/>
<rule id="JR_LV"><inputEntry><text>"LV"</text></inputEntry><outputEntry><text>true</text></outputEntry></rule>
<rule id="JR_EU"><inputEntry><text>"EU"</text></inputEntry><outputEntry><text>true</text></outputEntry></rule>
<rule id="JR_EEA"><inputEntry><text>"EEA"</text></inputEntry><outputEntry><text>true</text></outputEntry></rule>
<rule id="JR_CH"><inputEntry><text>"CH"</text></inputEntry><outputEntry><text>true</text></outputEntry></rule>
<rule id="JR_Other"><inputEntry><text>not("LV","EU","EEA","CH")</text></inputEntry><outputEntry><text>false</text></outputEntry></rule>
</decisionTable>
</decision>
<!-- === MAIN ELIGIBILITY DECISION (Nolikuma 6., 7., 10., 13.p.) === -->
<decision id="Decision_Eligibility" name="EligibilityDecision">
<variable name="eligibilityResult" typeRef="string"/>
<informationRequirement><requiredInput href="#In_IsLegalEntity"/></informationRequirement>
<informationRequirement><requiredDecision href="#Decision_JurisdictionOk"/></informationRequirement>
<informationRequirement><requiredInput href="#In_SubmittedInTime"/></informationRequirement>
<informationRequirement><requiredInput href="#In_DocumentsInLatvian"/></informationRequirement>
<informationRequirement><requiredInput href="#In_HasESignature"/></informationRequirement>
<informationRequirement><requiredInput href="#In_IsForbiddenAI"/></informationRequirement>
<informationRequirement><requiredInput href="#In_HasExclusion"/></informationRequirement>
<decisionTable id="DT_Eligibility" hitPolicy="FIRST">
<input id="IC_1"><inputExpression typeRef="boolean"><text>isLegalEntity</text></inputExpression></input>
<input id="IC_2"><inputExpression typeRef="boolean"><text>jurisdictionOk</text></inputExpression></input>
<input id="IC_3"><inputExpression typeRef="boolean"><text>submittedInTime</text></inputExpression></input>
<input id="IC_4"><inputExpression typeRef="boolean"><text>documentsInLatvian</text></inputExpression></input>
<input id="IC_5"><inputExpression typeRef="boolean"><text>hasQualifiedESignatureAndTimestamp</text></inputExpression></input>
<input id="IC_6"><inputExpression typeRef="boolean"><text>isForbiddenAIPractice</text></inputExpression></input>
<input id="IC_7"><inputExpression typeRef="boolean"><text>hasExclusionUnderLaw8p3</text></inputExpression></input>
<output id="OC_Status" name="status" typeRef="string"/>
<output id="OC_Reason" name="reason" typeRef="string"/>
<output id="OC_Ref" name="nolikumaReference" typeRef="string"/>
<!-- Hard rejections -->
<rule id="R01">
<inputEntry><text>false</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry>
<outputEntry><text>"REJECT"</text></outputEntry><outputEntry><text>"Iesniedzējs nav juridiska persona"</text></outputEntry><outputEntry><text>"6.1.p."</text></outputEntry>
</rule>
<rule id="R02">
<inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry>
<outputEntry><text>"REJECT"</text></outputEntry><outputEntry><text>"Jurisdikcija nav LV/ES/EEZ/CH"</text></outputEntry><outputEntry><text>"6.1.p."</text></outputEntry>
</rule>
<rule id="R03">
<inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry>
<outputEntry><text>"REJECT"</text></outputEntry><outputEntry><text>"Iesniegums nav saņemts termiņā"</text></outputEntry><outputEntry><text>"7.p., 8.p."</text></outputEntry>
</rule>
<rule id="R04">
<inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>-</text></inputEntry>
<outputEntry><text>"REJECT"</text></outputEntry><outputEntry><text>"MI sistēma ir aizliegtā prakse (Regulas 5.p.)"</text></outputEntry><outputEntry><text>"6.2.p."</text></outputEntry>
</rule>
<rule id="R05">
<inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>true</text></inputEntry>
<outputEntry><text>"REJECT"</text></outputEntry><outputEntry><text>"Uz iesniedzēju attiecas Likuma 8.p.3.d. izslēdzošie nosacījumi"</text></outputEntry><outputEntry><text>"6.3.p."</text></outputEntry>
</rule>
<!-- Fixable deficiencies -->
<rule id="R06">
<inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>-</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry>
<outputEntry><text>"FIX_OR_REJECT"</text></outputEntry><outputEntry><text>"Dokumenti nav latviešu valodā"</text></outputEntry><outputEntry><text>"10.p., 12.p."</text></outputEntry>
</rule>
<rule id="R07">
<inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry>
<outputEntry><text>"FIX_OR_REJECT"</text></outputEntry><outputEntry><text>"Trūkst drošā elektroniskā paraksta vai laika zīmoga"</text></outputEntry><outputEntry><text>"7.p., 12.p."</text></outputEntry>
</rule>
<!-- Pass -->
<rule id="R08">
<inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>true</text></inputEntry><inputEntry><text>false</text></inputEntry><inputEntry><text>false</text></inputEntry>
<outputEntry><text>"ELIGIBLE"</text></outputEntry><outputEntry><text>"Atbilst visām prasībām — virzīt uz vērtēšanu"</text></outputEntry><outputEntry><text>"13.p."</text></outputEntry>
</rule>
</decisionTable>
</decision>
</definitions>

View File

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/"
id="Definitions_Scoring"
name="Vērtēšanas, punktu un reitinga aprēķins"
namespace="https://processgit.org/VDAA/mi-sandbox-atlase/dmn/scoring">
<!-- === INPUTS: Commission ratings 0-5 for each criterion === -->
<inputData id="In_C1_Innovation" name="innovationRating"/>
<inputData id="In_C2_Transformation" name="transformationRating"/>
<inputData id="In_C3_Readiness" name="readinessRating"/>
<inputData id="In_C4_HighRisk" name="highRiskRating"/>
<inputData id="In_C5_RegulatoryNeed" name="regulatoryNeedRating"/>
<!-- === BKM: Weighted score formula (Nolikuma 1.pielikums) === -->
<businessKnowledgeModel id="BKM_WeightedScore" name="weightedScore">
<encapsulatedLogic kind="FEEL">
<formalParameter name="weight" typeRef="number"/>
<formalParameter name="rating" typeRef="number"/>
<literalExpression><text>weight * (rating / 5)</text></literalExpression>
</encapsulatedLogic>
</businessKnowledgeModel>
<!-- === INDIVIDUAL CRITERION SCORES === -->
<!-- Kr.1: Inovitāte un tirgus nepilnību novēršana (svars 20) -->
<decision id="Dec_C1" name="InnovationScore">
<variable name="innovationScore" typeRef="number"/>
<knowledgeRequirement><requiredKnowledge href="#BKM_WeightedScore"/></knowledgeRequirement>
<informationRequirement><requiredInput href="#In_C1_Innovation"/></informationRequirement>
<literalExpression><text>weightedScore(20, innovationRating)</text></literalExpression>
</decision>
<!-- Kr.2: Ieguldījums attīstības plānošanas un digitālās transformācijas mērķos (svars 15) -->
<decision id="Dec_C2" name="TransformationScore">
<variable name="transformationScore" typeRef="number"/>
<knowledgeRequirement><requiredKnowledge href="#BKM_WeightedScore"/></knowledgeRequirement>
<informationRequirement><requiredInput href="#In_C2_Transformation"/></informationRequirement>
<literalExpression><text>weightedScore(15, transformationRating)</text></literalExpression>
</decision>
<!-- Kr.3: Tehniskā gatavība un resursu nodrošinājums (svars 30) -->
<decision id="Dec_C3" name="ReadinessScore">
<variable name="readinessScore" typeRef="number"/>
<knowledgeRequirement><requiredKnowledge href="#BKM_WeightedScore"/></knowledgeRequirement>
<informationRequirement><requiredInput href="#In_C3_Readiness"/></informationRequirement>
<literalExpression><text>weightedScore(30, readinessRating)</text></literalExpression>
</decision>
<!-- Kr.4: Augsta riska MI sistēmas kvalifikācija (svars 10) -->
<decision id="Dec_C4" name="HighRiskScore">
<variable name="highRiskScore" typeRef="number"/>
<knowledgeRequirement><requiredKnowledge href="#BKM_WeightedScore"/></knowledgeRequirement>
<informationRequirement><requiredInput href="#In_C4_HighRisk"/></informationRequirement>
<literalExpression><text>weightedScore(10, highRiskRating)</text></literalExpression>
</decision>
<!-- Kr.5: Regulatīvās vides pamatojums un nepieciešamība (svars 25) -->
<decision id="Dec_C5" name="RegulatoryNeedScore">
<variable name="regulatoryNeedScore" typeRef="number"/>
<knowledgeRequirement><requiredKnowledge href="#BKM_WeightedScore"/></knowledgeRequirement>
<informationRequirement><requiredInput href="#In_C5_RegulatoryNeed"/></informationRequirement>
<literalExpression><text>weightedScore(25, regulatoryNeedRating)</text></literalExpression>
</decision>
<!-- === TOTAL SCORE (max 100) === -->
<decision id="Dec_Total" name="TotalScore">
<variable name="totalScore" typeRef="number"/>
<informationRequirement><requiredDecision href="#Dec_C1"/></informationRequirement>
<informationRequirement><requiredDecision href="#Dec_C2"/></informationRequirement>
<informationRequirement><requiredDecision href="#Dec_C3"/></informationRequirement>
<informationRequirement><requiredDecision href="#Dec_C4"/></informationRequirement>
<informationRequirement><requiredDecision href="#Dec_C5"/></informationRequirement>
<literalExpression><text>innovationScore + transformationScore + readinessScore + highRiskScore + regulatoryNeedScore</text></literalExpression>
</decision>
<!-- === TIEBREAKER ORDER (Nolikuma 1.pielikums, Neizšķirta gadījumi) === -->
<decision id="Dec_TieBreak" name="TieBreakVector">
<variable name="tieBreakVector" typeRef="list"/>
<informationRequirement><requiredDecision href="#Dec_C3"/></informationRequirement>
<informationRequirement><requiredDecision href="#Dec_C5"/></informationRequirement>
<informationRequirement><requiredDecision href="#Dec_C1"/></informationRequirement>
<literalExpression>
<text>[readinessScore, regulatoryNeedScore, innovationScore]</text>
</literalExpression>
</decision>
</definitions>

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/"
id="Definitions_TRL"
name="TRL līmeņu pārvēršana 0-5 vērtējumā"
namespace="https://processgit.org/VDAA/mi-sandbox-atlase/dmn/trl">
<!-- Nolikuma 2.pielikums: MI sistēmas gatavības līmeņi -->
<inputData id="In_TRL" name="trlLevel"/>
<decision id="Decision_TRLMapping" name="TRLMapping">
<variable name="readinessRatingFromTRL" typeRef="number"/>
<informationRequirement><requiredInput href="#In_TRL"/></informationRequirement>
<decisionTable id="DT_TRL" hitPolicy="UNIQUE">
<input id="TRL_In"><inputExpression typeRef="number"><text>trlLevel</text></inputExpression></input>
<output id="TRL_Score" name="score" typeRef="number"/>
<output id="TRL_Label" name="label" typeRef="string"/>
<output id="TRL_Sandbox" name="sandboxReadiness" typeRef="string"/>
<rule id="TRL_R1">
<inputEntry><text>[1..2]</text></inputEntry>
<outputEntry><text>0</text></outputEntry>
<outputEntry><text>"Pamatprincipu novērojumi / formulēta koncepcija"</text></outputEntry>
<outputEntry><text>"Par agru regulatīvai videi"</text></outputEntry>
</rule>
<rule id="TRL_R2">
<inputEntry><text>[3..4]</text></inputEntry>
<outputEntry><text>2</text></outputEntry>
<outputEntry><text>"Koncepcijas pārbaude / validācija laboratorijā"</text></outputEntry>
<outputEntry><text>"Ierobežota gatavība"</text></outputEntry>
</rule>
<rule id="TRL_R3">
<inputEntry><text>5</text></inputEntry>
<outputEntry><text>3</text></outputEntry>
<outputEntry><text>"Validācija mākslīgi radītā vidē"</text></outputEntry>
<outputEntry><text>"Minimālais briedums pilotēšanai"</text></outputEntry>
</rule>
<rule id="TRL_R4">
<inputEntry><text>[6..7]</text></inputEntry>
<outputEntry><text>4</text></outputEntry>
<outputEntry><text>"Demonstrācija mākslīgi radītā / reālā vidē"</text></outputEntry>
<outputEntry><text>"Laba gatavība testēšanai"</text></outputEntry>
</rule>
<rule id="TRL_R5">
<inputEntry><text>[8..9]</text></inputEntry>
<outputEntry><text>5</text></outputEntry>
<outputEntry><text>"Sistēma pabeigta un pārbaudīta / ekspluatācijā"</text></outputEntry>
<outputEntry><text>"Pilna gatavība; regulatīvā vide atbilstības/uzraudzības jautājumiem"</text></outputEntry>
</rule>
</decisionTable>
</decision>
</definitions>

View File

@@ -0,0 +1,35 @@
# Changelog
## [0.2.0] — 2026-03-07
### Pievienots
- UAPF SSOT atbilstība: `kind`, `cornerstones`, `owners`, `lifecycle` manifestā
- Enterprise index ar `kind: uapf.enterprise.index` un L0 līmeni
- Pareiza L4 pakotnes struktūra: `processes/L4/vdaa.mi.sandbox.atlase/`
- DMN 03: TRL līmeņu kartējums (2.pielikums) kā atsevišķs lēmumu modelis
- DMN failu pārsaukšana uz `.dmn.xml` (UAPF spec / bpmn.io saderība)
- CMMN gadījuma modelis komisijas vērtēšanai ar diskrecionāriem soļiem
- Resursu kartējums UAPF `targets + bindings` formātā
- AI aģenta konfigurācija (`agent.chat.yaml`) ar MCP rīku saistījumiem
- AI novērtēšanas guardrails (`guardrails/ai-evaluation-rules.yaml`)
- ProcessGit viewer GUI (`processgit.viewer.json` + `viewer/komisija-vertesana.html`)
- Trūkumu novēršanas apakšplūsma BPMN ar 5 d.d. taimeri (Nolikuma 12.p.)
- Jurisdikcijas pārbaude DMN (LV/EU/EEA/CH, Nolikuma 6.1.p.)
- MCP endpoint deklarācija manifestā (`exposure.mcp`)
- Audita notikumu definīcija resursu kartējumā
- EU AI Act atbilstības dokumentācija guardrails failā
### Mainīts
- Manifestu formāts no custom JSON uz UAPF-spec YAML
- Enterprise index no custom uz UAPF `kind: uapf.enterprise.index`
- Atsevišķi resources/mapping faili apvienoti `resources/mappings.yaml`
- BPMN papildināts ar jauniem uzdevumu tipiem (sendTask, receiveTask, boundaryEvent)
### Noņemts
- `manifest.json` (aizstāts ar `uapf.yaml`)
- Vecais DMN bez `.xml` paplašinājuma
- Tukšais `cmmn/.gitkeep`
## [0.1.0-demo] — 2026-03-07
- Sākotnējais demonstrācijas melnraksts

View File

@@ -0,0 +1,29 @@
# Avota atsauces
Šī UAPF pakotne modelē **Speciālās regulatīvās vides mākslīgā intelekta sistēmu
attīstībai projektu iesniegumu atlases nolikumu**, ko publicē VDAA saskaņā ar
Mākslīgā intelekta centra likumu un MK noteikumiem Nr.12.
## Normatīvā bāze
| Dokuments | Atsauce modelī |
|---|---|
| Mākslīgā intelekta centra likums | Likuma 4.p.1.d., 8.p.3.d. |
| MK noteikumi Nr.12 | 10.p., 13.p., 14.p. |
| Regula (ES) 2024/1689 (EU AI Act) | 3.p.1.pk., 5.p., 3.pielikums |
| Nolikuma 1.pielikums | Vērtēšanas kritēriji, svari, enkuri |
| Nolikuma 2.pielikums | TRL līmeņi un to kartējums |
## Nolikuma sadaļu kartējums uz artefaktiem
| Nolikuma sadaļa | UAPF artefakts |
|---|---|
| III. Iesniegšanas kārtība (5.–12.p.) | `bpmn/mi-sandbox-atlase.bpmn.xml` — sākums līdz Gateway |
| Izslēdzošie nosacījumi (6.p.) | `dmn/01-atbilstiba-un-izsledzosie.dmn.xml` |
| Trūkumu novēršana (12.p.) | BPMN sub-flow ar 5 d.d. taimeri |
| Kompetento institūciju atzinumi (13.-14.p.) | BPMN send/receive uzdevumi |
| IV. Vērtēšana (16.–22.p.) | `dmn/02-vertesanas-punkti.dmn.xml` |
| 2.pielikums — TRL līmeņi | `dmn/03-trl-vertejums.dmn.xml` |
| Komisijas vērtēšana (18.-19.p.) | `cmmn/vertesanas-lieta.cmmn.xml` |
| Neizšķirta gadījumi | DMN TieBreakVector lēmums |
| Lēmuma paziņošana (15., 20., 22.p.) | BPMN beigu posms |

View File

@@ -0,0 +1,32 @@
{
"applicationId": "DEMO-001",
"applicant": {
"isLegalEntity": true,
"jurisdiction": "LV",
"hasExclusionUnderLaw8p3": false
},
"submission": {
"submittedInTime": true,
"documentsInLatvian": true,
"hasQualifiedESignatureAndTimestamp": true
},
"aiSystem": {
"name": "ProcessGit AI Classification Engine",
"isForbiddenAIPractice": false,
"trlLevel": 7,
"highRiskCandidate": true,
"euAiActAnnexIIICategory": "5 — public authority decision support"
},
"commissionRatings": {
"innovationRating": 4,
"transformationRating": 4,
"readinessRating": 5,
"highRiskRating": 4,
"regulatoryNeedRating": 5
},
"metadata": {
"submissionDate": "2026-03-15",
"callDeadline": "2026-04-15",
"evaluationDeadline": "2026-05-30"
}
}

View File

@@ -0,0 +1,59 @@
{
"applicationId": "DEMO-001",
"eligibilityResult": {
"status": "ELIGIBLE",
"reason": "Atbilst visām prasībām — virzīt uz vērtēšanu",
"nolikumaReference": "13.p.",
"jurisdictionCheck": {"jurisdiction": "LV", "jurisdictionOk": true}
},
"trlMapping": {
"trlLevel": 7,
"score": 4,
"label": "Demonstrācija mākslīgi radītā / reālā vidē",
"sandboxReadiness": "Laba gatavība testēšanai"
},
"scoringResult": {
"criteria": [
{"nr": 1, "name": "Inovitāte", "weight": 20, "rating": 4, "score": 16.0},
{"nr": 2, "name": "Digitālā transformācija", "weight": 15, "rating": 4, "score": 12.0},
{"nr": 3, "name": "Tehniskā gatavība", "weight": 30, "rating": 5, "score": 30.0},
{"nr": 4, "name": "Augsta riska MI", "weight": 10, "rating": 4, "score": 8.0},
{"nr": 5, "name": "Regulatīvās vides pamatojums", "weight": 25, "rating": 5, "score": 25.0}
],
"totalScore": 91.0,
"maxPossible": 100,
"tieBreakVector": [30.0, 25.0, 16.0]
},
"aiPreAssessment": {
"recommendation": "RECOMMEND_APPROVE",
"confidence": 0.87,
"reasoning": [
{
"criterion": "Tehniskā gatavība",
"observation": "TRL7 — sistēmas prototips demonstrēts reālā vidē. Atbilst 4/5 enkuram.",
"nolikumaRef": "1.pielikums, Kr.3; 2.pielikums"
},
{
"criterion": "Regulatīvās vides pamatojums",
"observation": "AI sistēma apstrādā valdības procesus — nepieciešama strukturēta testēšana ar kompetento iestāžu uzraudzību.",
"nolikumaRef": "1.pielikums, Kr.5"
}
],
"flags": [],
"disclaimers": [
"Šis ir AI aģenta ieteikums. Galīgais lēmums ir komisijas kompetencē."
]
},
"decisionRecommendation": "Virzīt apstiprināšanai — augstākais punktu skaits",
"auditTrail": [
{"event": "application-received", "timestamp": "2026-03-15T10:00:00Z"},
{"event": "eligibility-evaluated", "timestamp": "2026-03-15T10:01:00Z"},
{"event": "sent-to-authorities", "timestamp": "2026-03-18T09:00:00Z"},
{"event": "opinions-received", "timestamp": "2026-04-10T15:30:00Z"},
{"event": "ai-pre-assessment-run", "timestamp": "2026-04-11T08:00:00Z"},
{"event": "commission-scores-entered", "timestamp": "2026-04-12T14:00:00Z"},
{"event": "scores-calculated", "timestamp": "2026-04-12T14:01:00Z"},
{"event": "decision-prepared", "timestamp": "2026-04-14T10:00:00Z"},
{"event": "decision-issued", "timestamp": "2026-04-14T11:00:00Z"}
]
}

View File

@@ -0,0 +1,105 @@
# AI Evaluation Guardrails — MI sandbox atlases process
# Šis fails definē ierobežojumus un noteikumus AI aģenta iesaistei vērtēšanā.
#
# Konteksts: EU AI Act (Regula 2024/1689), Nolikuma prasības, human-in-the-loop princips.
# AI aģents darbojas kā "asistents" (mode: assisted), nevis kā lēmumu pieņēmējs.
guardrails:
version: "1.0"
appliesTo: agent.evaluation_assistant
# === FUNDAMENTĀLIE PRINCIPI ===
principles:
- id: HUMAN_FINAL_DECISION
rule: "AI aģenta izvade ir tikai ieteikums. Galīgais lēmums vienmēr ir komisijas."
enforcement: hard
reference: "Nolikuma 20.p."
- id: TRANSPARENCY
rule: "Katrs AI izvades elements ietver pamatojumu (reasoning chain) un atsauci uz nolikuma punktu."
enforcement: hard
- id: NO_SCORE_OVERRIDE
rule: "AI nedrīkst mainīt komisijas piešķirtos 0–5 vērtējumus. AI var tikai ieteikt."
enforcement: hard
- id: AUDIT_TRAIL
rule: "Katra AI aģenta darbība tiek reģistrēta audita žurnālā ar laika zīmogu."
enforcement: hard
# === IEVADES VALIDĀCIJA ===
input_validation:
- check: "Iesnieguma dati atbilst candidate-input shēmai"
action: reject_if_invalid
- check: "TRL līmenis ir skaitlis [1..9]"
action: reject_if_invalid
- check: "Vērtējumi ir skaitļi [0..5]"
action: reject_if_invalid
- check: "Nav personas datu ievadē (GDPR compliance)"
action: flag_and_redact
# === IZVADES IEROBEŽOJUMI ===
output_constraints:
format: structured_json
required_fields:
- field: recommendation
type: enum
values: ["RECOMMEND_APPROVE", "RECOMMEND_REVIEW", "RECOMMEND_REJECT", "INSUFFICIENT_DATA"]
- field: confidence
type: number
range: [0.0, 1.0]
- field: reasoning
type: array
minItems: 1
itemSchema:
criterion: string
observation: string
nolikumaRef: string
- field: flags
type: array
description: "Brīdinājumi, ko komisija jāpārskata"
- field: disclaimers
type: array
minItems: 1
mustInclude: "Šis ir AI aģenta ieteikums. Galīgais lēmums ir komisijas kompetencē."
# === AIZLIEGTĀS DARBĪBAS ===
prohibited_actions:
- "Piešķirt galīgo punktu skaitu"
- "Mainīt komisijas vērtējumus"
- "Pieņemt lēmumu par apstiprināšanu/noraidīšanu"
- "Salīdzināt konkrētus iesniedzējus savā starpā (bias prevention)"
- "Izmantot ārējos datus, kas nav iesnieguma daļa"
- "Sazināties tieši ar iesniedzēju"
# === UZRAUDZĪBA ===
monitoring:
logging:
destination: system.audit_log
events:
- ai-invocation-started
- ai-input-validated
- ai-output-generated
- ai-output-reviewed-by-human
- ai-output-accepted
- ai-output-overridden
alerting:
- condition: "confidence < 0.3"
action: "Flag for mandatory human review"
- condition: "AI output contradicts DMN result"
action: "Flag discrepancy, require commission justification"
drift_detection:
enabled: true
baseline: "examples/expected-output.example.json"
threshold: 0.2
# === EU AI ACT ATBILSTĪBA ===
eu_ai_act_compliance:
riskCategory: "high-risk-support-system"
article3_qualification: >-
AI aģents secina no iesnieguma datiem, kā ģenerēt novērtējuma ieteikumus,
tādējādi atbilst Regulas 3.panta 1.punkta MI sistēmas definīcijai.
humanOversight: "Regulas 14.pants — komisija pārbauda katru AI ieteikumu"
transparency: "Regulas 13.pants — pamatojums un atsauces pieejamas"
dataGovernance: "Regulas 10.pants — tikai iesnieguma dati, nav ārējie avoti"
technicalDocumentation: "Regulas 11.pants — šis guardrails fails + mappings.yaml"

View File

@@ -0,0 +1,21 @@
lifecycle:
status: draft
maturity: concept-demonstrator
firstPublished: "2026-03-07"
lastModified: "2026-03-07"
changeControl:
model: pull-request
requiresReview: true
branchProtection: true
releasePolicy:
tagging: semantic-versioning
immutableSnapshots: true
changelog: docs/CHANGELOG.md
usageConstraints:
- "Nav paredzēts oficiālai lēmumu pieņemšanai"
- "Demonstrācijas mērķiem — procesa modelēšanas pieejas validācijai"
- "AI aģenta novērtējums ir tikai ieteikums, neaizstāj komisijas lēmumu"
legalDisclaimer: >-
Šis ir demonstrācijas projekts. Tas nav oficiāls VDAA vai MI centra
vērtēšanas instruments, nav juridiski saistošs un neaizstāj nolikuma
tekstu vai iestādes pieņemto lēmumu.

View File

@@ -0,0 +1,15 @@
owner:
packageOwner: "Algomation / ProcessGit"
businessOwner: "VDAA MI centrs (demo kontekstā)"
technicalOwner: "Algomation Europe Oy"
contact: info@algomation.io
review:
approvers:
- role: business-owner
description: "Apstiprina procesa un lēmumu loģikas atbilstību nolikumam"
- role: technical-owner
description: "Apstiprina BPMN/DMN/CMMN tehnisko korektumu un UAPF atbilstību"
classification:
confidentiality: public-demo
dataClassification: non-personal
note: "Šī pakotne nesatur personas datus. Vērtēšanas piemēri ir fiktīvi."

View File

@@ -0,0 +1,32 @@
{
"version": 1,
"viewers": [
{
"id": "komisija-vertesana",
"primary_pattern": "examples/candidate-input.example.json",
"type": "html",
"entry": "viewer/komisija-vertesana.html",
"edit_allow": [
"examples/candidate-input.example.json"
],
"targets": {
"dmn_eligibility": "dmn/01-atbilstiba-un-izsledzosie.dmn.xml",
"dmn_scoring": "dmn/02-vertesanas-punkti.dmn.xml",
"dmn_trl": "dmn/03-trl-vertejums.dmn.xml",
"mappings": "resources/mappings.yaml",
"guardrails": "guardrails/ai-evaluation-rules.yaml",
"expected_output": "examples/expected-output.example.json"
}
},
{
"id": "guardrails-viewer",
"primary_pattern": "guardrails/ai-evaluation-rules.yaml",
"type": "html",
"entry": "viewer/komisija-vertesana.html",
"edit_allow": [],
"targets": {
"guardrails": "guardrails/ai-evaluation-rules.yaml"
}
}
]
}

View File

@@ -0,0 +1,154 @@
# UAPF Resource Mappings — vdaa.mi.sandbox.atlase v0.2.0
# Format: targets (who/what) + bindings (what does what)
targets:
# Human roles
- id: role.case_officer
type: human_role
name: "Centra lietvedības darbinieks"
description: "Reģistrē iesniegumus, pārbauda pilnīgumu, nosūta kompetentajām institūcijām"
- id: role.commission
type: human_role
name: "Vērtēšanas komisija"
description: "Nolikuma 16.p. — izveidota ar Centra direktora rīkojumu"
- id: role.external_expert
type: human_role
name: "Ārējais eksperts"
description: "Nolikuma 19.p. — var piesaistīt vērtēšanas vajadzībām"
- id: role.competent_authority
type: human_role
name: "Kompetentā institūcija"
description: "Nolikuma 2.10.p. — sniedz atzinumu par projekta iesniegumu"
# Systems
- id: system.dmn_engine
type: system_api
name: "DMN izpildes dzinējs"
description: "Izpilda lēmumu tabulas (atbilstība, punktu aprēķins, TRL kartējums)"
- id: system.audit_log
type: system_api
name: "Audita žurnāls"
description: "Reģistrē visus procesa notikumus ar laika zīmogu"
# AI agents
- id: agent.evaluation_assistant
type: ai_agent
name: "MI vērtēšanas asistents (demo)"
description: >-
AI aģents, kas veic iepriekšējo novērtējumu pirms komisijas sēdes:
pārbauda TRL līmeni, analizē inovācijas pamatojumu, novērtē regulatīvās
vides nepieciešamību. Darbojas tikai kā palīgs — galīgais lēmums ir komisijas.
constraints:
mode: assisted
humanOversight: mandatory
outputType: recommendation-only
guardrails: guardrails/ai-evaluation-rules.yaml
# MCP tools
- id: mcp.check_eligibility
type: mcp_tool
name: "check_eligibility"
endpoint: "dmn/01-atbilstiba-un-izsledzosie.dmn.xml#EligibilityDecision"
- id: mcp.calculate_score
type: mcp_tool
name: "calculate_score"
endpoint: "dmn/02-vertesanas-punkti.dmn.xml#TotalScore"
- id: mcp.map_trl
type: mcp_tool
name: "map_trl_level"
endpoint: "dmn/03-trl-vertejums.dmn.xml#TRLMapping"
bindings:
# Phase 1: Registration
- source: {type: bpmn.userTask, ref: Task_Register}
targetId: role.case_officer
mode: manual
output: applicationRegistered
- source: {type: bpmn.businessRuleTask, ref: Task_EligibilityDMN}
targetId: system.dmn_engine
mode: autonomous
usesDecision: dmn/01-atbilstiba-un-izsledzosie.dmn.xml#EligibilityDecision
output: eligibilityResult
# Phase 1b: Deficiency correction
- source: {type: bpmn.sendTask, ref: Task_RequestFix}
targetId: role.case_officer
mode: manual
output: deficiencyRequest
# Phase 2: Expert opinions
- source: {type: bpmn.sendTask, ref: Task_SendToAuthority}
targetId: role.case_officer
mode: manual
output: opinionRequest
- source: {type: bpmn.receiveTask, ref: Task_ReceiveOpinion}
targetId: role.competent_authority
mode: manual
output: expertOpinions
# Phase 3: Commission evaluation
- source: {type: bpmn.userTask, ref: Task_CommissionScoring}
targetId: role.commission
mode: manual
assistedBy:
- role.external_expert
- agent.evaluation_assistant
output: commissionRatings
- source: {type: bpmn.businessRuleTask, ref: Task_TRLMapping}
targetId: system.dmn_engine
mode: autonomous
usesDecision: dmn/03-trl-vertejums.dmn.xml#TRLMapping
output: trlScore
- source: {type: bpmn.businessRuleTask, ref: Task_ScoringDMN}
targetId: system.dmn_engine
mode: autonomous
usesDecision: dmn/02-vertesanas-punkti.dmn.xml#TotalScore
output: scoringResult
# Phase 4: Decision
- source: {type: bpmn.userTask, ref: Task_PrepareDecision}
targetId: role.commission
mode: manual
output: decisionRecommendation
- source: {type: bpmn.sendTask, ref: Task_NotifyApplicant}
targetId: role.case_officer
mode: manual
output: decisionNotification
# CMMN discretionary bindings
- source: {type: cmmn.humanTask, ref: HT_ExternalExpert}
targetId: role.external_expert
mode: manual
discretionary: true
- source: {type: cmmn.processTask, ref: PT_AIPreAssessment}
targetId: agent.evaluation_assistant
mode: assisted
discretionary: true
guardrails: guardrails/ai-evaluation-rules.yaml
audit:
logTarget: system.audit_log
events:
- {event: application-received, phase: registration}
- {event: eligibility-evaluated, phase: formal-check}
- {event: deficiency-requested, phase: formal-check}
- {event: deficiency-resolved, phase: formal-check}
- {event: sent-to-authorities, phase: expert-opinion}
- {event: opinions-received, phase: expert-opinion}
- {event: ai-pre-assessment-run, phase: commission, aiRelevant: true}
- {event: commission-scores-entered, phase: commission}
- {event: scores-calculated, phase: scoring}
- {event: decision-prepared, phase: decision}
- {event: decision-issued, phase: decision}

View File

@@ -0,0 +1,73 @@
kind: uapf.package
id: vdaa.mi.sandbox.atlase
name: "MI sandbox atlases process un vērtēšanas algoritms"
level: 4
version: "0.2.0"
cornerstones:
bpmn: true
dmn: true
cmmn: true
resources: true
owners:
- type: team
id: algomation
contact: info@algomation.io
lifecycle: draft
description: >-
UAPF Level 4 pakotne, kas modelē VDAA publicēto Speciālās regulatīvās vides
MI sistēmu attīstībai projektu iesniegumu atlases nolikumu kā mašīnlasāmu un
izpildāmu procesa + lēmumu modeli. Ietver BPMN procesu, DMN lēmumu tabulas,
CMMN gadījumu pārvaldību, resursu kartējumu un AI aģenta vērtēšanas konceptu.
artifacts:
bpmn:
- path: bpmn/mi-sandbox-atlase.bpmn.xml
role: primary-process
description: "Iesnieguma plūsma no saņemšanas līdz lēmumam"
dmn:
- path: dmn/01-atbilstiba-un-izsledzosie.dmn.xml
role: eligibility-gate
description: "Formālā atbilstība un izslēdzošie nosacījumi"
- path: dmn/02-vertesanas-punkti.dmn.xml
role: scoring-algorithm
description: "5 kritēriju svērtais punktu aprēķins un neizšķirta loģika"
- path: dmn/03-trl-vertejums.dmn.xml
role: trl-mapping
description: "TRL līmeņu pārvēršana 0–5 vērtējumā"
cmmn:
- path: cmmn/vertesanas-lieta.cmmn.xml
role: evaluation-case
description: "Komisijas vērtēšanas gadījuma pārvaldība ar diskrecionāriem soļiem"
resources:
- path: resources/mappings.yaml
role: execution-mapping
exposure:
mcp:
enabled: true
exposedEntrypoints:
- decision: dmn/01-atbilstiba-un-izsledzosie.dmn.xml#EligibilityDecision
tool: check_eligibility
- decision: dmn/02-vertesanas-punkti.dmn.xml#TotalScore
tool: calculate_score
- decision: dmn/03-trl-vertejums.dmn.xml#TRLMapping
tool: map_trl_level
inputs:
- application
- applicant
- aiSystem
- expertOpinions
- commissionRatings
outputs:
- eligibilityResult
- scoringResult
- rankingResult
- tieBreakResolution
- decisionRecommendation
- auditTrail

View File

@@ -0,0 +1,511 @@
<!DOCTYPE html>
<html lang="lv">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MI Sandbox — Komisijas vērtēšanas panelis</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
:root {
--bg: #0f1117; --surface: #1a1d27; --surface2: #232733; --surface3: #2d3140;
--border: #363b4d; --text: #e8eaf0; --text2: #9ca3b8; --text3: #6b7394;
--accent: #6366f1; --accent2: #818cf8; --green: #22c55e; --green-bg: rgba(34,197,94,0.1);
--red: #ef4444; --red-bg: rgba(239,68,68,0.1); --amber: #f59e0b; --amber-bg: rgba(245,158,11,0.1);
--blue: #3b82f6; --blue-bg: rgba(59,130,246,0.1);
--radius: 8px; --radius-lg: 12px;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: 'DM Sans', system-ui, sans-serif; background: var(--bg); color: var(--text); line-height: 1.5; }
.app { max-width: 960px; margin: 0 auto; padding: 20px; }
/* Header */
.header { display: flex; align-items: center; gap: 12px; margin-bottom: 24px; padding-bottom: 16px; border-bottom: 1px solid var(--border); }
.header-icon { font-size: 28px; }
.header h1 { font-size: 18px; font-weight: 600; letter-spacing: -0.3px; }
.header .badge { font-size: 11px; font-weight: 500; padding: 2px 8px; border-radius: 20px; background: var(--accent); color: white; margin-left: 8px; }
.header .sub { font-size: 13px; color: var(--text2); margin-top: 2px; }
/* Tabs */
.tabs { display: flex; gap: 2px; margin-bottom: 20px; background: var(--surface); border-radius: var(--radius); padding: 3px; }
.tab { flex: 1; padding: 8px 12px; text-align: center; font-size: 13px; font-weight: 500; cursor: pointer; border-radius: 6px; color: var(--text2); transition: all 0.15s; }
.tab:hover { color: var(--text); background: var(--surface2); }
.tab.active { background: var(--accent); color: white; }
/* Panels */
.panel { display: none; }
.panel.active { display: block; }
/* Cards */
.card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 16px; margin-bottom: 12px; }
.card-title { font-size: 13px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text2); margin-bottom: 12px; }
/* Eligibility form */
.check-grid { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center; }
.check-label { font-size: 13px; color: var(--text); }
.check-ref { font-size: 11px; color: var(--text3); font-family: 'JetBrains Mono', monospace; }
.toggle { appearance: none; width: 36px; height: 20px; border-radius: 10px; background: var(--surface3); cursor: pointer; position: relative; transition: background 0.2s; }
.toggle:checked { background: var(--green); }
.toggle::after { content: ''; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: white; transition: transform 0.2s; }
.toggle:checked::after { transform: translateX(16px); }
/* Scoring */
.criteria-table { width: 100%; border-collapse: collapse; }
.criteria-table th { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text3); text-align: left; padding: 8px 6px; border-bottom: 1px solid var(--border); }
.criteria-table td { padding: 10px 6px; font-size: 13px; border-bottom: 1px solid rgba(54,59,77,0.5); }
.criteria-table .nr { font-family: 'JetBrains Mono', monospace; color: var(--text3); width: 30px; }
.criteria-table .weight { font-family: 'JetBrains Mono', monospace; color: var(--accent2); width: 50px; text-align: center; }
.criteria-table .score { font-family: 'JetBrains Mono', monospace; font-weight: 600; width: 60px; text-align: right; }
.rating-input { width: 52px; padding: 5px 8px; font-size: 14px; font-family: 'JetBrains Mono', monospace; font-weight: 600; text-align: center; background: var(--surface2); border: 1px solid var(--border); border-radius: 6px; color: var(--text); outline: none; }
.rating-input:focus { border-color: var(--accent); box-shadow: 0 0 0 2px rgba(99,102,241,0.2); }
.rating-input.invalid { border-color: var(--red); }
select.jurisdiction { padding: 5px 8px; font-size: 13px; background: var(--surface2); border: 1px solid var(--border); border-radius: 6px; color: var(--text); outline: none; }
select.jurisdiction:focus { border-color: var(--accent); }
.trl-input { width: 52px; padding: 5px 8px; font-size: 14px; font-family: 'JetBrains Mono', monospace; font-weight: 600; text-align: center; background: var(--surface2); border: 1px solid var(--border); border-radius: 6px; color: var(--text); outline: none; }
/* Total */
.total-bar { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; background: var(--surface2); border-radius: var(--radius); margin-top: 12px; }
.total-label { font-size: 14px; font-weight: 600; }
.total-score { font-size: 28px; font-weight: 700; font-family: 'JetBrains Mono', monospace; }
.total-score.high { color: var(--green); }
.total-score.mid { color: var(--amber); }
.total-score.low { color: var(--red); }
/* Tiebreak */
.tiebreak { display: flex; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
.tiebreak-chip { font-size: 12px; font-family: 'JetBrains Mono', monospace; padding: 4px 10px; border-radius: 20px; background: var(--surface3); color: var(--text2); }
.tiebreak-chip .val { font-weight: 600; color: var(--accent2); }
/* Status badges */
.status { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; font-weight: 600; padding: 4px 10px; border-radius: 20px; }
.status.eligible { background: var(--green-bg); color: var(--green); }
.status.fix { background: var(--amber-bg); color: var(--amber); }
.status.reject { background: var(--red-bg); color: var(--red); }
/* Progress bar */
.progress-track { width: 100%; height: 8px; background: var(--surface3); border-radius: 4px; overflow: hidden; margin-top: 8px; }
.progress-fill { height: 100%; border-radius: 4px; transition: width 0.4s ease, background 0.4s ease; }
/* Guardrails panel */
.rule-card { padding: 10px 12px; background: var(--surface2); border-radius: var(--radius); margin-bottom: 8px; border-left: 3px solid var(--accent); }
.rule-id { font-size: 11px; font-family: 'JetBrains Mono', monospace; color: var(--accent2); margin-bottom: 4px; }
.rule-text { font-size: 13px; color: var(--text); }
.rule-enforcement { font-size: 11px; color: var(--red); font-weight: 600; margin-top: 4px; }
/* AI output preview */
.ai-output { background: var(--surface2); border-radius: var(--radius); padding: 12px; font-family: 'JetBrains Mono', monospace; font-size: 12px; line-height: 1.6; color: var(--text2); white-space: pre-wrap; max-height: 400px; overflow-y: auto; }
.ai-disclaimer { margin-top: 12px; padding: 10px; background: var(--amber-bg); border-radius: var(--radius); font-size: 12px; color: var(--amber); }
/* Audit */
.audit-event { display: flex; align-items: flex-start; gap: 8px; padding: 6px 0; font-size: 12px; }
.audit-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); margin-top: 5px; flex-shrink: 0; }
.audit-dot.ai { background: var(--amber); }
.audit-ts { font-family: 'JetBrains Mono', monospace; color: var(--text3); min-width: 140px; }
.audit-name { color: var(--text); }
/* Buttons */
.btn { padding: 8px 16px; font-size: 13px; font-weight: 600; border: none; border-radius: 6px; cursor: pointer; transition: all 0.15s; }
.btn-primary { background: var(--accent); color: white; }
.btn-primary:hover { background: var(--accent2); }
.btn-ghost { background: transparent; color: var(--text2); border: 1px solid var(--border); }
.btn-ghost:hover { color: var(--text); background: var(--surface2); }
.actions { display: flex; gap: 8px; margin-top: 16px; }
</style>
</head>
<body>
<div class="app">
<div class="header">
<span class="header-icon">🏛️</span>
<div>
<h1>MI Sandbox Atlase <span class="badge">DEMO</span></h1>
<div class="sub">Komisijas vērtēšanas panelis — Nolikuma process kā UAPF/ProcessGit</div>
</div>
</div>
<div class="tabs">
<div class="tab active" data-panel="eligibility">Atbilstība</div>
<div class="tab" data-panel="scoring">Vērtēšana</div>
<div class="tab" data-panel="ai-agent">AI Aģents</div>
<div class="tab" data-panel="guardrails">Guardrails</div>
<div class="tab" data-panel="audit">Audits</div>
</div>
<!-- ===== PANEL: ELIGIBILITY ===== -->
<div class="panel active" id="panel-eligibility">
<div class="card">
<div class="card-title">Formālā atbilstība (DMN: 01-atbilstiba-un-izsledzosie)</div>
<div class="check-grid">
<div><span class="check-label">Juridiska persona</span> <span class="check-ref">6.1.p.</span></div>
<input type="checkbox" class="toggle" id="ck_legal" checked>
<div><span class="check-label">Jurisdikcija</span> <span class="check-ref">6.1.p.</span></div>
<select class="jurisdiction" id="sel_jurisdiction">
<option value="LV" selected>LV — Latvija</option>
<option value="EU">EU — ES dalībvalsts</option>
<option value="EEA">EEA — EEZ valsts</option>
<option value="CH">CH — Šveice</option>
<option value="OTHER">Cita (neatbilst)</option>
</select>
<div><span class="check-label">Iesniegts termiņā</span> <span class="check-ref">7., 8.p.</span></div>
<input type="checkbox" class="toggle" id="ck_time" checked>
<div><span class="check-label">Dokumenti latviešu valodā</span> <span class="check-ref">10.p.</span></div>
<input type="checkbox" class="toggle" id="ck_latvian" checked>
<div><span class="check-label">Drošs e-paraksts ar laika zīmogu</span> <span class="check-ref">7.p.</span></div>
<input type="checkbox" class="toggle" id="ck_esign" checked>
<div><span class="check-label">NAV aizliegtā MI prakse</span> <span class="check-ref">6.2.p., Regula 5.p.</span></div>
<input type="checkbox" class="toggle" id="ck_notforbidden" checked>
<div><span class="check-label">NAV izslēdzošie nosacījumi (Likuma 8.p.3.d.)</span> <span class="check-ref">6.3.p.</span></div>
<input type="checkbox" class="toggle" id="ck_noexclusion" checked>
</div>
<div style="margin-top: 16px;">
<strong style="font-size:13px;">Rezultāts:</strong>
<span id="elig-result" class="status eligible">✓ ELIGIBLE</span>
<span id="elig-reason" style="font-size:12px; color:var(--text2); margin-left:8px;"></span>
</div>
</div>
</div>
<!-- ===== PANEL: SCORING ===== -->
<div class="panel" id="panel-scoring">
<div class="card">
<div class="card-title">TRL līmeņa kartējums (DMN: 03-trl-vertejums)</div>
<div style="display:flex; align-items:center; gap:12px;">
<span style="font-size:13px;">TRL līmenis:</span>
<input type="number" class="trl-input" id="trl_level" min="1" max="9" value="7">
<span style="font-size:13px;">→ Vērtējums:</span>
<span id="trl_score" style="font-family:'JetBrains Mono'; font-weight:700; font-size:18px; color:var(--accent2);">4</span>
<span id="trl_label" style="font-size:12px; color:var(--text2);"></span>
</div>
</div>
<div class="card">
<div class="card-title">Kritēriju vērtējumi (DMN: 02-vertesanas-punkti)</div>
<table class="criteria-table">
<thead>
<tr><th>Nr.</th><th>Kritērijs</th><th>Svars</th><th>0–5</th><th>Punkti</th></tr>
</thead>
<tbody>
<tr>
<td class="nr">1</td>
<td>Inovitāte un tirgus nepilnību novēršana</td>
<td class="weight">20</td>
<td><input type="number" class="rating-input" data-crit="1" data-weight="20" min="0" max="5" value="4"></td>
<td class="score" id="sc1">16.0</td>
</tr>
<tr>
<td class="nr">2</td>
<td>Ieguldījums digitālās transformācijas mērķos</td>
<td class="weight">15</td>
<td><input type="number" class="rating-input" data-crit="2" data-weight="15" min="0" max="5" value="4"></td>
<td class="score" id="sc2">12.0</td>
</tr>
<tr>
<td class="nr">3</td>
<td>Tehniskā gatavība un resursu nodrošinājums</td>
<td class="weight">30</td>
<td><input type="number" class="rating-input" data-crit="3" data-weight="30" min="0" max="5" value="5"></td>
<td class="score" id="sc3">30.0</td>
</tr>
<tr>
<td class="nr">4</td>
<td>Augsta riska MI sistēmas kvalifikācija</td>
<td class="weight">10</td>
<td><input type="number" class="rating-input" data-crit="4" data-weight="10" min="0" max="5" value="4"></td>
<td class="score" id="sc4">8.0</td>
</tr>
<tr>
<td class="nr">5</td>
<td>Regulatīvās vides pamatojums</td>
<td class="weight">25</td>
<td><input type="number" class="rating-input" data-crit="5" data-weight="25" min="0" max="5" value="5"></td>
<td class="score" id="sc5">25.0</td>
</tr>
</tbody>
</table>
<div class="total-bar">
<div>
<div class="total-label">Kopējais rezultāts</div>
<div class="tiebreak" id="tiebreak">
<span class="tiebreak-chip">Kr.3: <span class="val" id="tb3">30.0</span></span>
<span class="tiebreak-chip">Kr.5: <span class="val" id="tb5">25.0</span></span>
<span class="tiebreak-chip">Kr.1: <span class="val" id="tb1">16.0</span></span>
</div>
</div>
<div class="total-score high" id="total-score">91.0</div>
</div>
<div class="progress-track">
<div class="progress-fill" id="progress-fill" style="width:91%; background:var(--green);"></div>
</div>
</div>
</div>
<!-- ===== PANEL: AI AGENT ===== -->
<div class="panel" id="panel-ai-agent">
<div class="card">
<div class="card-title">AI aģenta iepriekšējais novērtējums (demo)</div>
<p style="font-size:13px; color:var(--text2); margin-bottom:12px;">
AI aģents analizē iesnieguma datus un sniedz strukturētu ieteikumu komisijai.
Šis ir <strong>asistēts režīms</strong> — galīgais lēmums vienmēr ir komisijas.
</p>
<div class="actions" style="margin-bottom:12px;">
<button class="btn btn-primary" id="btn-run-ai">▶ Palaist AI novērtējumu</button>
<button class="btn btn-ghost" id="btn-clear-ai">Notīrīt</button>
</div>
<div class="ai-output" id="ai-output">Nospied "Palaist AI novērtējumu", lai redzētu rezultātu...</div>
<div class="ai-disclaimer">
⚠ Šis ir AI aģenta ieteikums. Galīgais lēmums ir komisijas kompetencē (Nolikuma 20.p.).
AI nedrīkst mainīt komisijas piešķirtos vērtējumus (guardrails: NO_SCORE_OVERRIDE).
</div>
</div>
</div>
<!-- ===== PANEL: GUARDRAILS ===== -->
<div class="panel" id="panel-guardrails">
<div class="card">
<div class="card-title">AI novērtēšanas ierobežojumi (guardrails/ai-evaluation-rules.yaml)</div>
<div class="rule-card">
<div class="rule-id">HUMAN_FINAL_DECISION</div>
<div class="rule-text">AI aģenta izvade ir tikai ieteikums. Galīgais lēmums vienmēr ir komisijas.</div>
<div class="rule-enforcement">enforcement: HARD — Nolikuma 20.p.</div>
</div>
<div class="rule-card">
<div class="rule-id">TRANSPARENCY</div>
<div class="rule-text">Katrs AI izvades elements ietver pamatojumu un atsauci uz nolikuma punktu.</div>
<div class="rule-enforcement">enforcement: HARD</div>
</div>
<div class="rule-card">
<div class="rule-id">NO_SCORE_OVERRIDE</div>
<div class="rule-text">AI nedrīkst mainīt komisijas piešķirtos 0–5 vērtējumus. AI var tikai ieteikt.</div>
<div class="rule-enforcement">enforcement: HARD</div>
</div>
<div class="rule-card">
<div class="rule-id">AUDIT_TRAIL</div>
<div class="rule-text">Katra AI aģenta darbība tiek reģistrēta audita žurnālā ar laika zīmogu.</div>
<div class="rule-enforcement">enforcement: HARD</div>
</div>
</div>
<div class="card">
<div class="card-title">EU AI Act atbilstība</div>
<div class="rule-card" style="border-left-color: var(--blue);">
<div class="rule-id">Regulas 3.p.1.pk. — MI sistēmas definīcija</div>
<div class="rule-text">AI aģents secina no iesnieguma datiem, kā ģenerēt novērtējuma ieteikumus.</div>
</div>
<div class="rule-card" style="border-left-color: var(--blue);">
<div class="rule-id">Regulas 14.p. — Cilvēka uzraudzība</div>
<div class="rule-text">Komisija pārbauda katru AI ieteikumu pirms lēmuma pieņemšanas.</div>
</div>
<div class="rule-card" style="border-left-color: var(--blue);">
<div class="rule-id">Regulas 13.p. — Pārredzamība</div>
<div class="rule-text">Pamatojums un atsauces pieejamas katrā AI izvades elementā.</div>
</div>
<div class="rule-card" style="border-left-color: var(--blue);">
<div class="rule-id">Regulas 10.p. — Datu pārvaldība</div>
<div class="rule-text">Tikai iesnieguma dati — nav ārējie avoti.</div>
</div>
</div>
<div class="card">
<div class="card-title">Aizliegtās darbības</div>
<ul style="font-size:13px; color:var(--text); padding-left:20px; list-style: none;">
<li style="margin-bottom:6px;">🚫 Piešķirt galīgo punktu skaitu</li>
<li style="margin-bottom:6px;">🚫 Mainīt komisijas vērtējumus</li>
<li style="margin-bottom:6px;">🚫 Pieņemt lēmumu par apstiprināšanu/noraidīšanu</li>
<li style="margin-bottom:6px;">🚫 Salīdzināt konkrētus iesniedzējus savā starpā</li>
<li style="margin-bottom:6px;">🚫 Izmantot ārējos datus ārpus iesnieguma</li>
<li>🚫 Sazināties tieši ar iesniedzēju</li>
</ul>
</div>
</div>
<!-- ===== PANEL: AUDIT ===== -->
<div class="panel" id="panel-audit">
<div class="card">
<div class="card-title">Audita notikumu žurnāls (demo)</div>
<div id="audit-log"></div>
</div>
</div>
</div>
<script>
// ===== Tab switching =====
document.querySelectorAll('.tab').forEach(tab => {
tab.addEventListener('click', () => {
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
document.querySelectorAll('.panel').forEach(p => p.classList.remove('active'));
tab.classList.add('active');
document.getElementById('panel-' + tab.dataset.panel).classList.add('active');
});
});
// ===== TRL Mapping (mirrors DMN 03) =====
const TRL_MAP = {
1:{s:0,l:"Pamatprincipu novērojumi"},2:{s:0,l:"Formulēta koncepcija"},
3:{s:2,l:"Koncepcijas eksperimentālā pārbaude"},4:{s:2,l:"Validācija laboratorijā"},
5:{s:3,l:"Validācija mākslīgi radītā vidē"},6:{s:4,l:"Demonstrācija mākslīgi radītā vidē"},
7:{s:4,l:"Prototipa demonstrācija reālā vidē"},8:{s:5,l:"Sistēma pabeigta un pārbaudīta"},
9:{s:5,l:"Sekmīga ekspluatācija"}
};
function updateTRL() {
const lvl = parseInt(document.getElementById('trl_level').value) || 1;
const map = TRL_MAP[Math.min(9, Math.max(1, lvl))] || TRL_MAP[1];
document.getElementById('trl_score').textContent = map.s;
document.getElementById('trl_label').textContent = '— ' + map.l;
}
document.getElementById('trl_level').addEventListener('input', updateTRL);
updateTRL();
// ===== Eligibility (mirrors DMN 01) =====
function checkEligibility() {
const legal = document.getElementById('ck_legal').checked;
const jur = document.getElementById('sel_jurisdiction').value;
const time = document.getElementById('ck_time').checked;
const lat = document.getElementById('ck_latvian').checked;
const esign = document.getElementById('ck_esign').checked;
const notForbidden = document.getElementById('ck_notforbidden').checked;
const noExcl = document.getElementById('ck_noexclusion').checked;
const el = document.getElementById('elig-result');
const re = document.getElementById('elig-reason');
if (!legal) { el.className='status reject'; el.textContent='✗ REJECT'; re.textContent='Iesniedzējs nav juridiska persona (6.1.p.)'; return; }
if (jur === 'OTHER') { el.className='status reject'; el.textContent='✗ REJECT'; re.textContent='Jurisdikcija nav LV/ES/EEZ/CH (6.1.p.)'; return; }
if (!time) { el.className='status reject'; el.textContent='✗ REJECT'; re.textContent='Iesniegums nav saņemts termiņā (7., 8.p.)'; return; }
if (!notForbidden) { el.className='status reject'; el.textContent='✗ REJECT'; re.textContent='MI sistēma ir aizliegtā prakse (6.2.p.)'; return; }
if (!noExcl) { el.className='status reject'; el.textContent='✗ REJECT'; re.textContent='Izslēdzošie nosacījumi (6.3.p.)'; return; }
if (!lat) { el.className='status fix'; el.textContent='⚠ FIX_OR_REJECT'; re.textContent='Dokumenti nav latviešu valodā (10., 12.p.)'; return; }
if (!esign) { el.className='status fix'; el.textContent='⚠ FIX_OR_REJECT'; re.textContent='Trūkst e-paraksta/laika zīmoga (7., 12.p.)'; return; }
el.className='status eligible'; el.textContent='✓ ELIGIBLE'; re.textContent='Atbilst visām prasībām — virzīt uz vērtēšanu (13.p.)';
}
document.querySelectorAll('#panel-eligibility .toggle, #panel-eligibility select').forEach(el => el.addEventListener('change', checkEligibility));
checkEligibility();
// ===== Scoring (mirrors DMN 02) =====
function recalcScores() {
let total = 0;
const scores = {};
document.querySelectorAll('.rating-input').forEach(inp => {
const crit = inp.dataset.crit;
const weight = parseInt(inp.dataset.weight);
let rating = parseFloat(inp.value);
if (isNaN(rating) || rating < 0 || rating > 5) { inp.classList.add('invalid'); rating = 0; } else { inp.classList.remove('invalid'); }
const score = weight * (rating / 5);
scores[crit] = score;
document.getElementById('sc' + crit).textContent = score.toFixed(1);
total += score;
});
const totalEl = document.getElementById('total-score');
totalEl.textContent = total.toFixed(1);
totalEl.className = 'total-score ' + (total >= 70 ? 'high' : total >= 40 ? 'mid' : 'low');
const fill = document.getElementById('progress-fill');
fill.style.width = total + '%';
fill.style.background = total >= 70 ? 'var(--green)' : total >= 40 ? 'var(--amber)' : 'var(--red)';
document.getElementById('tb3').textContent = (scores['3'] || 0).toFixed(1);
document.getElementById('tb5').textContent = (scores['5'] || 0).toFixed(1);
document.getElementById('tb1').textContent = (scores['1'] || 0).toFixed(1);
}
document.querySelectorAll('.rating-input').forEach(inp => inp.addEventListener('input', recalcScores));
recalcScores();
// ===== AI Agent demo =====
document.getElementById('btn-run-ai').addEventListener('click', () => {
const out = document.getElementById('ai-output');
const ratings = {};
document.querySelectorAll('.rating-input').forEach(inp => {
ratings[inp.dataset.crit] = parseFloat(inp.value) || 0;
});
const trl = parseInt(document.getElementById('trl_level').value) || 1;
const trlMap = TRL_MAP[Math.min(9, Math.max(1, trl))];
const reasoning = [];
if (ratings['3'] >= 4) reasoning.push({criterion:"Tehniskā gatavība", observation:"TRL"+trl+" → vērtējums "+trlMap.s+"/5. "+trlMap.l+". Atbilst enkuram "+(trlMap.s>=4?"4/5":"3/5")+".", nolikumaRef:"1.piel. Kr.3; 2.piel."});
if (ratings['5'] >= 4) reasoning.push({criterion:"Regulatīvās vides pamatojums", observation:"Augsts vērtējums ("+ratings['5']+"/5) norāda uz skaidru nepieciešamību pēc strukturētas testēšanas.", nolikumaRef:"1.piel. Kr.5"});
if (ratings['1'] >= 4) reasoning.push({criterion:"Inovitāte", observation:"Vērtējums "+ratings['1']+"/5 norāda uz inovatīvu risinājumu ar tirgus nepilnību novēršanu.", nolikumaRef:"1.piel. Kr.1"});
if (ratings['4'] >= 3) reasoning.push({criterion:"Augsta riska MI", observation:"Kvalificējas kā augsta riska MI sistēma — regulatīvā vide sniedz pievienoto vērtību.", nolikumaRef:"1.piel. Kr.4"});
const total = Object.entries(ratings).reduce((s,[c,r]) => s + [20,15,30,10,25][c-1]*(r/5), 0);
const confidence = Math.min(0.95, Math.max(0.1, total / 110));
const rec = total >= 70 ? "RECOMMEND_APPROVE" : total >= 40 ? "RECOMMEND_REVIEW" : "RECOMMEND_REJECT";
const result = {
recommendation: rec,
confidence: parseFloat(confidence.toFixed(2)),
reasoning: reasoning,
flags: total < 60 ? ["Kopējais rezultāts zem 60 — ieteicams papildu pārskatīšana"] : [],
disclaimers: ["Šis ir AI aģenta ieteikums. Galīgais lēmums ir komisijas kompetencē."]
};
out.textContent = JSON.stringify(result, null, 2);
addAuditEvent('ai-pre-assessment-run', true);
});
document.getElementById('btn-clear-ai').addEventListener('click', () => {
document.getElementById('ai-output').textContent = 'Nospied "Palaist AI novērtējumu", lai redzētu rezultātu...';
});
// ===== Audit log =====
const auditEvents = [
{event:'application-received', ts:'2026-03-15T10:00:00Z', ai:false},
{event:'eligibility-evaluated', ts:'2026-03-15T10:01:00Z', ai:false},
{event:'sent-to-authorities', ts:'2026-03-18T09:00:00Z', ai:false},
{event:'opinions-received', ts:'2026-04-10T15:30:00Z', ai:false},
{event:'commission-scores-entered', ts:'2026-04-12T14:00:00Z', ai:false},
{event:'scores-calculated', ts:'2026-04-12T14:01:00Z', ai:false},
{event:'decision-prepared', ts:'2026-04-14T10:00:00Z', ai:false},
{event:'decision-issued', ts:'2026-04-14T11:00:00Z', ai:false}
];
function addAuditEvent(name, ai) {
auditEvents.splice(auditEvents.length - 3, 0, {event: name, ts: new Date().toISOString(), ai: !!ai});
renderAudit();
}
function renderAudit() {
const el = document.getElementById('audit-log');
el.innerHTML = auditEvents.map(e =>
'<div class="audit-event">' +
'<div class="audit-dot' + (e.ai ? ' ai' : '') + '"></div>' +
'<span class="audit-ts">' + e.ts.replace('T',' ').substring(0,19) + '</span>' +
'<span class="audit-name">' + e.event + (e.ai ? ' 🤖' : '') + '</span>' +
'</div>'
).join('');
}
renderAudit();
// ===== PGV Protocol (ProcessGit Viewer integration) =====
window.addEventListener('message', function(e) {
if (e.data && e.data.type === 'PGV_INIT') {
console.log('PGV_INIT received:', e.data.payload);
}
if (e.data && e.data.type === 'PGV_SAVE_CLICKED') {
const data = collectFormData();
window.parent.postMessage({type:'PGV_REQUEST_SAVE', path:'examples/candidate-input.example.json', content: JSON.stringify(data, null, 2), summary:'Updated evaluation data'}, '*');
}
});
window.parent.postMessage({type:'PGV_READY'}, '*');
function collectFormData() {
const ratings = {};
document.querySelectorAll('.rating-input').forEach(inp => { ratings['c'+inp.dataset.crit] = parseFloat(inp.value) || 0; });
return {
applicationId: "DEMO-001",
applicant: {isLegalEntity: document.getElementById('ck_legal').checked, jurisdiction: document.getElementById('sel_jurisdiction').value},
submission: {submittedInTime: document.getElementById('ck_time').checked, documentsInLatvian: document.getElementById('ck_latvian').checked, hasQualifiedESignatureAndTimestamp: document.getElementById('ck_esign').checked},
aiSystem: {isForbiddenAIPractice: !document.getElementById('ck_notforbidden').checked, trlLevel: parseInt(document.getElementById('trl_level').value) || 7},
commissionRatings: {innovationRating: ratings.c1, transformationRating: ratings.c2, readinessRating: ratings.c3, highRiskRating: ratings.c4, regulatoryNeedRating: ratings.c5}
};
}
</script>
</body>
</html>