Testy a evaluace EDPA v1.0.0
314 verifikačních kontrol — 114 scénářů × 6 členů týmu
114 testových scénářů v 8 kategoriích. Per-person testy (invarianty, dual-view, edge cases) běží pro každého z 6 členů týmu → 314 celkových kontrol. Vše prochází.
1. Matematické invarianty — 10 scénářů × 6 osob = 60 kontrol
Základní matematické garance EDPA engine — validováno při každém buildu. Tyto testy ověřují, že model nikdy neporušuje své klíčové sliby.
01 test_sum_equals_capacity PASS
Odvozené hodiny musí odpovídat deklarované kapacitě osoby.
Σ(hours) = capacity ± 0.01h 02 test_ratio_sum_equals_one PASS
Poměry se musí sečíst na 1.0 pro každou osobu s items.
Σ(ratio) = 1.0 ± 0.001 03 test_no_negative_hours PASS
Žádná osoba nesmí mít záporné odvozené hodiny.
All hours ≥ 0 04 test_no_negative_scores PASS
Žádné skóre nesmí být záporné.
All scores ≥ 0 05 test_score_formula_simple PASS
V simple režimu: Score se počítá jako JS násobeno CW.
Score = JS × CW 06 test_score_formula_full PASS
V full režimu: Score se počítá jako JS násobeno CW násobeno RS.
Score = JS × CW × RS 07 test_full_mode_invariants PASS
Full režim také zaručí že součet = kapacita.
Full mode: Σ = capacity ± 0.01h 08 test_all_invariants_flag PASS
Příznak invariant_ok musí odrážet skutečné výsledky kontroly.
invariant_ok reflects actual checks 09 test_empty_items_no_crash PASS
Osoba s 0 items musí dostat 0h, bez pádu.
Person with 0 items → 0h, no crash 10 test_cw_ordering PASS
CW musí zachovat pořadí: owner ≥ key ≥ reviewer ≥ consulted.
owner ≥ key ≥ reviewer ≥ consulted 2. Evidence Detection — 15 scénářů
Ověření správné detekce GitHub signálů a jejich mapování na Evidence Score a Contribution Weight. Každý signál musí být korektně identifikován a ohodnocen.
01 test_assignee_detection_cw PASS
Assignee na issue musí být detekováno jako owner s CW = 1.0.
assignee signal → CW = 1.0 (owner) 02 test_pr_author_without_assignee PASS
PR autor bez assignee role musí dostat CW = 0.6 (key contributor).
pr_author signal → CW = 0.6 (key) 03 test_commit_author_only PASS
Osoba pouze s commitem (bez assignee/PR) dostane CW = 0.25.
commit_author signal → CW = 0.25 (reviewer) 04 test_pr_reviewer_detection PASS
PR reviewer musí být detekováno s CW = 0.25 (reviewer role).
pr_reviewer signal → CW = 0.25 (reviewer) 05 test_issue_comment_only PASS
Osoba pouze s komentářem na issue dostane CW = 0.15 (consulted).
issue_comment signal → CW = 0.15 (consulted) 06 test_multiple_signals_highest_wins PASS
Při více signálech (assignee + commit) vyhrává nejsilnější signál.
assignee + commit → CW = 1.0 (highest wins) 07 test_contribute_command_detection PASS
/contribute příkaz v issue body musí být detekováno s CW = 0.6.
/contribute @user → CW = 0.6 (key) 08 test_contribute_weight_override PASS
/contribute s explicitní váhou přepíše automaticky detekované CW.
/contribute @user weight:0.8 → CW = 0.8 09 test_branch_naming_story_extraction PASS
Branch feature/S-200-omop-parser musí extrahovat referenci S-200.
Branch regex: S-\d+ → S-200 10 test_branch_naming_feature_extraction PASS
Branch feature/F-15-auth-module musí extrahovat referenci F-15.
Branch regex: F-\d+ → F-15 11 test_branch_naming_epic_extraction PASS
Branch epic/E-3-platform musí extrahovat referenci E-3.
Branch regex: E-\d+ → E-3 12 test_no_matching_signals_excluded PASS
Osoba bez žádných signálů na itemu nesmí být přiřazena.
No signals → person excluded from item 13 test_evidence_score_threshold PASS
Evidence Score pod prahem (< 1.0) způsobí vyloučení osoby z itemu.
ES < threshold → excluded 14 test_in_progress_items_excluded PASS
Itemy ve stavu In-Progress nejsou zahrnuty do kalkulace iterace.
Status: In-Progress → excluded from calculation 15 test_commit_count_no_time_effect PASS
Počet commitů neovlivňuje čas (pouze relevanci). 1 commit = 10 commitů pro CW.
commit_count independent of time allocation 3. CW Heuristika — 18 scénářů
Ověření správnosti heuristických vah a pravidel pro určování Contribution Weight. Heuristika musí být konzistentní a reprodukovatelná.
01 test_default_role_weight_owner PASS
Defaultní váha role owner musí být 1.0.
role_weights.owner = 1.0 02 test_default_role_weight_key PASS
Defaultní váha role key musí být 0.6.
role_weights.key = 0.6 03 test_default_role_weight_reviewer PASS
Defaultní váha role reviewer musí být 0.25.
role_weights.reviewer = 0.25 04 test_default_role_weight_consulted PASS
Defaultní váha role consulted musí být 0.15.
role_weights.consulted = 0.15 05 test_signal_weights_assignee PASS
Signál assignee musí mít Evidence Score +4.0.
signals.assignee = 4.0 06 test_signal_weights_contribute PASS
Signál contribute_command musí mít Evidence Score +3.0.
signals.contribute_command = 3.0 07 test_signal_weights_pr_author PASS
Signál pr_author musí mít Evidence Score +2.0.
signals.pr_author = 2.0 08 test_signal_weights_commit PASS
Signál commit_author musí mít Evidence Score +1.0.
signals.commit_author = 1.0 09 test_highest_signal_determines_cw PASS
CW je určeno nejsilnějším signálem, ne součtem — žádné sčítání signálů pro CW.
CW = role_weights[highest_signal], no summing 10 test_manual_override_precedence PASS
Manuální /contribute override musí mít přednost před auto-detekcí.
manual_cw ≠ null → use manual_cw 11 test_cw_strict_ordering PASS
CW pořadí musí být striktní: owner ≥ key ≥ reviewer ≥ consulted.
1.0 ≥ 0.6 ≥ 0.25 ≥ 0.15 (strict) 12 test_cw_minimum_floor PASS
Minimální CW je 0.15 (consulted floor) — žádná osoba nesmí mít nižší CW.
CW ≥ 0.15 (consulted floor) 13 test_cw_maximum_ceiling PASS
Maximální CW je 1.0 (owner ceiling) — žádná automatická váha nepřesáhne 1.0.
CW ≤ 1.0 (owner ceiling) 14 test_rs_normalization PASS
Relevance Signal se normalizuje: RS = min(ES/maxES, 1.0).
RS = min(ES / max_ES, 1.0) 15 test_rs_range_validation PASS
RS musí být v rozsahu 0 až 1.0 — nikdy záporné, nikdy větší než 1.
0 ≤ RS ≤ 1.0 16 test_multiple_people_same_item PASS
Více lidí na stejném itemu musí mít nezávislé CW pro každou osobu.
CW[P1, item] independent of CW[P2, item] 17 test_same_person_multiple_items PASS
Stejná osoba na více itemech musí mít nezávislé CW pro každý item.
CW[P, item1] independent of CW[P, item2] 18 test_architecture_role_detection PASS
Architektura/PM role detekována přes komentáře + /contribute příkaz.
comment + /contribute → key/consulted role 4. Dual-View konzistence — 12 scénářů × 6 osob = 72 kontrol
EDPA poskytuje dva pohledy — per-person a per-item. Oba musí být vzájemně konzistentní a součty musí sedět v obou směrech.
01 test_per_person_sum_equals_capacity PASS
Per-person pohled: součet odvozených hodin = kapacita pro každou osobu.
Σ DerivedHours[P, *] = Capacity[P] 02 test_per_item_shares_sum_100 PASS
Per-item pohled: součet podílů všech přispěvovatelů = 100% pro každý item.
Σ shares[*, item] = 100% 03 test_same_cw_same_results_both_views PASS
Stejné CW musí produkovat stejné výsledky v obou pohledech.
per-person hours consistent with per-item shares 04 test_mode_switch_preserves_guarantee PASS
Změna režimu simple → full zachová garanci Σ = Capacity.
simple → full: Σ = Capacity still holds 05 test_per_person_hours_sum_cross_items PASS
Per-person: hodiny na item X + hodiny na všechny ostatní itemy = celková kapacita.
hours[P, X] + hours[P, rest] = capacity[P] 06 test_zero_contribution_excluded_both_views PASS
Itemy s nulovým příspěvkem se nezobrazují v žádném pohledu.
zero contribution → absent in both views 07 test_single_contributor_full_share PASS
Jediný přispěvovatel na itemu dostane 100% podíl v per-item pohledu.
single contributor → 100% share 08 test_two_equal_contributors_equal_split PASS
Dva přispěvovatelé se stejným CW dostanou 50/50 split v per-item pohledu.
equal CW → 50/50 share split 09 test_capacity_no_affect_per_item_share PASS
Různé kapacity neovlivní procentuální podíl v per-item pohledu.
capacity[P1] ≠ capacity[P2] → share% unchanged 10 test_cross_check_hours_vs_capacities PASS
Křížová kontrola: součet všech per-item hodin přes všechny itemy ≤ součet všech kapacit.
ΣΣ hours[P, item] ≤ Σ capacity[P] 11 test_three_contributors_weighted_split PASS
Tři přispěvovatelé s CW 1.0, 0.6, 0.25 — podíly odpovídají poměru vah.
1.0:0.6:0.25 → 54%:32%:14% share 12 test_per_item_hours_sum_matches_js_proportion PASS
Součet hodin na itemu od všech osob odpovídá proporci Job Size v rámci celkového rozpočtu.
item hours reflect JS weight in total budget 5. Edge Cases — 18 scénářů × 6 osob = 108 kontrol
Hraniční případy a extrémní scénáře, které musí EDPA engine zvládnout bez pádu, s korektními výsledky a bez ztrát přesnosti.
01 test_person_zero_relevant_items PASS
Osoba s 0 relevantními itemy musí dostat 0 hodin bez pádu aplikace.
0 items → 0h, no crash 02 test_person_single_item_full_capacity PASS
Osoba s jedním itemem musí dostat plnou kapacitu.
1 item → hours = capacity 03 test_all_items_same_job_size PASS
Všechny itemy se stejným Job Size — hodiny rozděleny pouze podle CW.
same JS → distribution by CW only 04 test_all_people_same_cw_on_item PASS
Všichni lidé se stejným CW na itemu — hodiny proporcionálně ke kapacitě.
same CW → hours proportional to capacity 05 test_job_size_zero_excluded PASS
Item s Job Size = 0 musí být vyloučen z kalkulace (žádné dělení nulou).
JS = 0 → item excluded, no division by zero 06 test_single_person_team PASS
Jednočlenný tým: osoba dostane plnou kapacitu bez ohledu na CW.
single person → full capacity 07 test_hundred_items_capacity_sum PASS
100 itemů pro jednu osobu — kapacita se stále musí sečíst správně.
100 items: Σ hours = capacity 08 test_max_job_size_allocation PASS
Maximální Job Size (20) musí produkovat správnou proporcionální alokaci.
JS = 20 → correct proportional allocation 09 test_min_job_size_allocation PASS
Minimální Job Size (1) musí produkovat správnou proporcionální alokaci.
JS = 1 → correct proportional allocation 10 test_all_cw_equal_distribution PASS
Všechna CW = 1.0 — hodiny rozděleny rovnoměrně podle Job Size.
all CW = 1.0 → equal distribution per JS 11 test_very_unequal_capacities PASS
Velmi nerovné kapacity (10h vs 160h) — každá osoba se sečte na svou kapacitu.
10h + 160h: each sums to own capacity 12 test_floating_point_precision PASS
Přesnost floatů: součet musí být v toleranci 0.01h od kapacity.
Σ within 0.01h tolerance 13 test_unicode_item_titles PASS
Unicode znaky v názvech itemů nesmí způsobit chyby zpracování.
Unicode titles → no processing errors 14 test_empty_iteration_graceful PASS
Prázdná iterace (žádné stories) musí být zpracována bez pádu.
empty iteration → graceful handling 15 test_person_only_epic_feature PASS
Osoba pouze na Epic/Feature (bez stories) musí stále dostat alokaci.
Epic/Feature only → still gets allocation 16 test_negative_job_size_rejected PASS
Záporný Job Size musí být odmítnut — žádná záporná alokace.
JS < 0 → item rejected 17 test_duplicate_person_on_item_no_double_count PASS
Duplicitní signály stejné osoby na itemu nesmí zdvojit alokaci.
duplicate signals → single CW entry 18 test_large_team_scaling PASS
20+ osob v týmu — výpočet stále konverguje a invarianty drží.
20+ people: all invariants hold 6. Auto-kalibrace — 12 scénářů
Ověření auto-kalibračního systému inspirovaného Karpathyho autoresearch vzorem. Kalibrace musí být bezpečná, reprodukovatelná a efektivní.
01 test_minimum_ground_truth_records PASS
Kalibrace vyžaduje minimum 20 manuálně potvrzených CW záznamů.
len(ground_truth) ≥ 20 required 02 test_mad_computation_correctness PASS
MAD (Mean Absolute Deviation) se správně počítá jako průměr |auto_cw - confirmed_cw|.
MAD = mean(|auto_cw - confirmed_cw|) 03 test_lower_mad_better PASS
Nižší MAD = lepší heuristika. Směr optimalizace musí být "lower is better".
direction: lower is better 04 test_evaluator_locked PASS
Evaluator (evaluate_cw.py) je zamčený — nesmí být modifikován optimalizátorem.
evaluate_cw.py: LOCKED, read-only 05 test_single_change_per_iteration PASS
Každý experiment mění pouze jeden parametr — izolace efektu změn.
one parameter change per experiment 06 test_git_commit_after_experiment PASS
Po každém experimentu se provede git commit — paměť = git log.
git commit after each experiment 07 test_revert_on_worse_mad PASS
Při zhoršení MAD se experiment revertne (git reset --hard HEAD~1).
MAD worse → git revert 08 test_keep_on_better_or_equal_mad PASS
Při zlepšení nebo stejném MAD se experiment zachová.
MAD better/equal → keep commit 09 test_budget_50_experiments_max PASS
Maximální budget je 50 experimentů — ochrana před nekonečným cyklem.
budget ≤ 50 experiments 10 test_expected_improvement_range PASS
Očekávané zlepšení je 15–30% redukce MAD po 50 experimentech.
expected: 15-30% MAD reduction 11 test_ground_truth_format_validation PASS
Ground truth záznamy musí obsahovat: item_id, person_id, evidence_role, auto_cw, confirmed_cw.
required fields: item_id, person_id, evidence_role, auto_cw, confirmed_cw 12 test_no_data_leakage PASS
Žádný únik dat mezi trénovací a validační sadou — striktní separace.
no data leakage between train/validation 7. Governance & Audit — 17 scénářů
Ověření audit trail, freeze pravidel, governance procesů a compliance požadavků. EDPA musí být plně auditovatelné a reprodukovatelné.
01 test_snapshot_frozen_after_close PASS
Snapshot je zmrazený (frozen) po Iteration Close — nesmí být modifikován.
snapshot.frozen = true after close 02 test_frozen_snapshot_immutable PASS
Zmrazený snapshot nesmí být modifikován na místě (in-place).
frozen snapshot: no in-place modification 03 test_corrections_create_new_revision PASS
Opravy vytvářejí novou revizi (_rev2, _rev3), nikdy nepřepíšou originál.
correction → new revision (_rev2, _rev3) 04 test_snapshot_required_fields PASS
Snapshot musí obsahovat všech 10 požadovaných top-level klíčů.
10 required keys present in snapshot 05 test_branch_naming_enforced PASS
Branch naming konvence: {type}/{ITEM-ID}-description musí být dodržena.
branch: {type}/{ITEM-ID}-description 06 test_pr_references_work_item PASS
PR musí referencovat work item (S-XXX, F-XXX, E-XXX) v titulku nebo těle.
PR references: S-XXX, F-XXX, or E-XXX 07 test_traceability_chain PASS
Plný řetězec sledovatelnosti: Initiative → Epic → Feature → Story → PR → Commit.
Initiative → Epic → Feature → Story → PR → Commit 08 test_wsjf_calculation PASS
WSJF se správně počítá jako (BV + TC + RR) / JS.
WSJF = (BV + TC + RR) / JS 09 test_job_size_guardrails_story PASS
Job Size guardrails pro Story: JS ≤ 8 (ideálně ≤ 5).
Story JS ≤ 8 (recommended ≤ 5) 10 test_job_size_guardrails_feature PASS
Job Size guardrails pro Feature: JS ≤ 13.
Feature JS ≤ 13 11 test_job_size_guardrails_epic PASS
Job Size guardrails pro Epic: JS ≤ 20.
Epic JS ≤ 20 12 test_dor_checklist_validation PASS
Definition of Ready checklist: popis, AC, odhad, parent linked.
DoR: description, AC, estimate, parent linked 13 test_dod_checklist_validation PASS
Definition of Done checklist: code reviewed, testy prošly, PR mergnuto.
DoD: code reviewed, tests passed, PR merged 14 test_wip_limit_enforcement PASS
WIP limit: ideálně 1 Story na osobu v daném okamžiku.
WIP limit: 1 Story per person (ideal) 15 test_bankid_signature_support PASS
Podpora BankID elektronického podpisu (zákon 21/2020 Sb.).
BankID signature: zákon 21/2020 Sb. 16 test_reproducible_calculation PASS
Reprodukovatelný výpočet: stejné vstupy musí vždy produkovat stejné výstupy.
same inputs → same outputs (deterministic) 17 test_audit_trail_five_pillars PASS
Audit trail pokrývá 5 pilířů: GitHub evidence, kapacita, snapshot, reprodukovatelný výpočet, podpis.
5 pillars: evidence, capacity, snapshot, calc, signature 8. Plánování kapacity — 12 scénářů
Ověření Iteration Planning Protocol — planning_factor jako vlastnost týmu, pravidlo 80%, sledování buffer usage a workflow potvrzení kapacity.
01 test_planning_factor_team_level PASS
planning_factor musí být vlastnost týmu, ne kadence ani osoby.
teams[].planning_factor (not cadence, not person) 02 test_planning_factor_default PASS
Výchozí planning_factor musí být 0.8 (plánuj na 80% celkové kapacity).
planning_factor default = 0.8 03 test_planning_factor_range PASS
planning_factor musí být v rozsahu (0, 1.0] — nikdy nula, nikdy nad 100%.
0 < planning_factor ≤ 1.0 04 test_planning_capacity_formula PASS
Planning Capacity = Total Capacity × planning_factor pro každý tým.
Planning_Capacity = Σ Capacity[P] × planning_factor 05 test_different_teams_different_factors PASS
Různé týmy mohou mít různé hodnoty planning_factor.
teams[A].planning_factor ≠ teams[B].planning_factor allowed 06 test_edpa_uses_total_not_planning PASS
EDPA výpočet vždy používá Total Capacity (100%), ne Planning Capacity.
DerivedHours uses Capacity[P], not Planning_Capacity 07 test_buffer_absorbs_unplanned PASS
Buffer (výchozí 20%) absorbuje support, maintenance, incidenty a neplánovanou práci.
buffer = Total - Planning → unplanned work 08 test_unplanned_items_generate_evidence PASS
Neplánované položky v bufferu generují evidenci a jsou alokovány normálně pomocí EDPA.
unplanned items → evidence → normal EDPA allocation 09 test_capacity_confirmed_at_planning PASS
Každý člen týmu musí potvrdit dostupnost na Iteration Planning (availability: confirmed).
availability = confirmed required 10 test_planning_factor_no_affect_invariant PASS
planning_factor nesmí ovlivnit matematickou záruku Σ DerivedHours = Capacity.
planning_factor → no effect on Σ = Capacity 11 test_buffer_usage_metric PASS
Metrika Buffer_Usage sleduje, kolik rezervy bylo spotřebováno neplánovanou prací.
Buffer_Usage = unplanned / (Total - Planning) × 100% 12 test_high_buffer_usage_warning PASS
Trvale vysoký buffer usage (>90%) by měl vyvolat varování k úpravě kapacity nebo rozsahu.
Buffer_Usage > 90% → warning Auto-kalibrace (Karpathy loop)
Automatický kalibrační systém inspirovaný Karpathyho autoresearch vzorem. Jeden soubor, jedna metrika, jedna smyčka.
| Target | cw_heuristics.yaml |
| Metric | MAD (Mean Absolute Deviation) |
| Direction | lower is better |
| Budget | 50 experimentů (~2h) |
| Memory | git log na kalibrační větvi |
| Evaluator | evaluate_cw.py (LOCKED) |
- Typické zlepšení: 15–30% redukce MAD
- Po 50 experimentech: heuristika odpovídá reálným vzorcům týmu
- Diminishing returns po ~30 experimentech
- Prerequisite: ≥ 20 manuálně potvrzených CW záznamů
Smyčka
git checkout -b calibration/{timestamp}- Pro každý experiment (1..budget):
- Načti aktuální heuristiku + historii experimentů
- Navrhni JEDNU změnu parametru (threshold, weight, signal score)
git commit -m "exp {n}: {param} {old} -> {new}"- Spusť:
python evaluate_cw.py --ground-truth ... --heuristics ... - Parsuj MAD z výstupu
- Pokud MAD < předchozí_best: KEEP | Jinak: REVERT
- Loguj do
calibration_log.tsv
- Vytiskni souhrn: initial MAD, final MAD, % zlepšení
- Zeptej se uživatele: merge kalibrační větev do main?
Bezpečnostní omezení
evaluate_cw.py. Oddělení optimalizéru od objektivní funkce.Strategie eskalace
| Experimenty | Focus | Parametry |
|---|---|---|
| 1–10 | role_weights | 4 parametry (největší impact) |
| 11–25 | signal weights | 6 parametrů |
| 26–50 | threshold + fine-tuning | kombinované ladění |
CW Heuristika
Výchozí váhy pro automatické přiřazení Contribution Weight na základě GitHub signálů.
| Role | CW | Vizualizace |
|---|---|---|
| owner | 1.0 | |
| key | 0.6 | |
| reviewer | 0.25 | |
| consulted | 0.15 |
| Signal | Score |
|---|---|
assignee | 4.0 |
contribute_command | 3.0 |
pr_author | 2.0 |
commit_author | 1.0 |
pr_reviewer | 1.0 |
issue_comment | 0.5 |
Srovnání metod
| Kritérium | EDPA v1.0.0 | Ruční timesheets | Fixní alokace |
|---|---|---|---|
| Přesnost | Vysoká | Střední | Nízká |
| Úsilí | Minimální | Vysoké | Žádné |
| Auditovatelnost | Plná | Částečná | Žádná |
| Dual-view | Ano | Ne | Ne |
| Mat. garance | Σ = capacity | Žádná | Složitější |
| Automatizace | GitHub Actions | Manuální | Částečná |
Demo výpočet
Statická ukázka výpočtu EDPA pro 3 osoby a 5 work items. Provozní varianta (Simple mode).
Kapacita
| Osoba | FTE | Kapacita (h) |
|---|---|---|
| Alice | 0.5 | 40h |
| Bob | 1.0 | 80h |
| Carol | 0.75 | 60h |
Work items & přiřazení
| Item | JS | Alice (CW) | Bob (CW) | Carol (CW) |
|---|---|---|---|---|
S-101 | 5 | 1.0 (owner) | 0.25 (reviewer) | — |
S-102 | 3 | 0.6 (key) | 1.0 (owner) | — |
S-103 | 8 | — | 1.0 (owner) | 0.6 (key) |
S-104 | 2 | — | 0.25 (reviewer) | 1.0 (owner) |
S-105 | 5 | — | — | 1.0 (owner) |
Výpočet skóre (Score = JS × CW)
| Item | JS | Alice Score | Bob Score | Carol Score |
|---|---|---|---|---|
S-101 | 5 | 5.0 | 1.25 | — |
S-102 | 3 | 1.8 | 3.0 | — |
S-103 | 8 | — | 8.0 | 4.8 |
S-104 | 2 | — | 0.5 | 2.0 |
S-105 | 5 | — | — | 5.0 |
| Σ | 6.8 | 12.75 | 11.8 |
Odvozené hodiny (DH = Score / ΣScore × Capacity)
| Item | Alice (40h) | Bob (80h) | Carol (60h) |
|---|---|---|---|
S-101 | 29.41h | 7.84h | — |
S-102 | 10.59h | 18.82h | — |
S-103 | — | 50.20h | 24.41h |
S-104 | — | 3.14h | 10.17h |
S-105 | — | — | 25.42h |
| Σ | 40.00h | 80.00h | 60.00h |