300 / 300
PASSED

105 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 → 300 celkových kontrol. Vše prochází.

Alice (Arch, 60h) ✓Bob (Dev, 80h) ✓Carol (Dev, 60h) ✓Dave (DevOps, 40h) ✓Eve (PM, 40h) ✓Frank (Dev, 40h) ✓
Σ

1. Matematické invarianty — 9 scénářů × 6 osob = 54 kontrol

54/54 PASS

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.

Každý scénář běží per osoba: Alice, Bob, Carol, Dave, Eve, Frank — celkem 54 kontrol.
01 test_sum_equals_capacity PASS

Odvozené hodiny musí odpovídat deklarované kapacitě osoby.

Očekávání: Σ(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.

Očekávání: Σ(ratio) = 1.0 ± 0.001
03 test_no_negative_hours PASS

Žádná osoba nesmí mít záporné odvozené hodiny.

Očekávání: All hours ≥ 0
04 test_no_negative_scores PASS

Žádné skóre nesmí být záporné.

Očekávání: All scores ≥ 0
05 test_score_formula PASS

Score se počítá jako JS × cw (per-item normalized share).

Očekávání: Score = JS × cw
06 test_per_item_cw_sums_to_one PASS

Per-item invariant: Σ cw napříč osobami na položce = 1.0.

Očekávání: Σ_persons cw[*, item] = 1.0
07 test_capacity_invariant PASS

Per-person invariant: Σ derived hours = declared capacity.

Očekávání: Σ_items DerivedHours[P, *] = Capacity[P, I] ± 0.01h
08 test_all_invariants_flag PASS

Příznak invariant_ok musí odrážet skutečné výsledky kontroly.

Očekávání: invariant_ok reflects actual checks
09 test_empty_items_no_crash PASS

Osoba s 0 items musí dostat 0h, bez pádu.

Očekávání: Person with 0 items → 0h, no crash
🔍

2. Evidence Detection — 10 scénářů

10/10 PASS

Ověření detekce GitHub signálů a additivní agregace do contribution_score. Signály se sčítají, výsledné CW je per-item normalizovaný podíl (Σ napříč osobami = 1.0 na položce).

01 test_commit_author_signal PASS

Commit s S-XXX/F-XXX/E-XXX/I-XXX v branchi/zprávě přidá signals.commit_author (default 4.00).

Očekávání: commit_author → +4.00 do score
02 test_pr_reviewer_signal PASS

Schválený PR review (vyjma self) přidá signals.pr_reviewer (default 2.17).

Očekávání: pr_reviewer → +2.17 do score
03 test_issue_comment_signal PASS

Komentář na issue/PR (boti vyloučeni) přidá signals.issue_comment (default 1.46).

Očekávání: issue_comment → +1.46 do score
04 test_signals_aggregate_additively PASS

Když má osoba commit + review + comment, váhy se sečtou (4.00 + 2.17 + 1.46 = 7.63), žádný highest-wins.

Očekávání: Σ fired signal_weights, ne max
05 test_contribute_directive_additive PASS

/contribute @osoba weight:0.6 přidá manual:* signál s váhou 0.6 do součtu — nepřepisuje auto-detekci.

Očekávání: /contribute @user weight:X → +X do score
06 test_per_item_normalization PASS

CW se po agregaci normalizuje per-item: cw = score / Σ persons. Invariant Σ cw[*, item] = 1.0.

Očekávání: Σ cw na položce = 1.0 (±0.001)
07 test_branch_naming_extraction_S_F_E_I PASS

Branch regex extrahuje S-/F-/E-/I-XXX pro Story, Feature, Epic, Initiative.

Očekávání: Detect: S-200, F-15, E-3, I-1
08 test_no_signals_no_contributor PASS

Osoba bez žádného fired signálu se neobjeví v contributors[] po agregaci.

Očekávání: score = 0 → vyloučen
09 test_bot_comments_filtered PASS

Komentáře od GitHub apps / botů se nezapočítávají jako issue_comment signály.

Očekávání: Bot login → signal nestreluje
10 test_commit_count_no_time_effect PASS

Počet commitů jednoho autora na itemu počítá jako jeden commit_author signál (relevance, ne objem).

Očekávání: 1 commit = 10 commitů z hlediska score

3. CW Heuristika — 15 scénářů

15/15 PASS

Ověření správnosti heuristických signal weights a pravidel pro určování Contribution Weight. Heuristika musí být konzistentní a reprodukovatelná.

01 test_signal_weight_ordering PASS

Hierarchie: commit_author > pr_reviewer > issue_comment.

Očekávání: sw.commit_author >= sw.pr_reviewer >= sw.issue_comment
02 test_per_item_cw_normalization PASS

Per-item cw share: Σ cw napříč osobami = 1.0 na každém itemu.

Očekávání: Σ_persons cw[*, item] = 1.0 (engine invariant)
03 test_per_person_capacity_invariant PASS

Per-person hours invariant: Σ hours = capacity_per_iteration.

Očekávání: Σ_items DerivedHours[P, *] = Capacity[P, I]
04 test_no_role_overrides_in_heuristics PASS

Kalibrace běží na 3 signálových vahách.

Očekávání: cw_heuristics.yaml.role_overrides not present
05 test_signal_weights_commit PASS

Signál commit_author musí mít signal weight 4.00 v cw_heuristics.yaml.

Očekávání: signals.commit_author = 4.00
06 test_signal_weights_pr_reviewer PASS

Signál pr_reviewer musí mít signal weight 2.17 v cw_heuristics.yaml.

Očekávání: signals.pr_reviewer = 2.17
07 test_signal_weights_issue_comment PASS

Signál issue_comment musí mít signal weight 1.46 v cw_heuristics.yaml.

Očekávání: signals.issue_comment = 1.46
08 test_signals_aggregate_additively PASS

CW se počítá additivní agregací všech signálů + per-item normalizací. Žádné highest-signal-wins.

Očekávání: cw[P, item] = Σ signal_weights / Σ_persons Σ signal_weights
09 test_contribute_directive_additive PASS

Manuální /contribute @osoba weight:X přidá manual:* signál s váhou X — nepřepisuje auto-detekci.

Očekávání: cw_after = (cw_auto_score + X) / Σ_persons score
10 test_per_item_invariant PASS

Σ cw napříč osobami na jedné položce = 1.0 (engine invariant, ±0.001).

Očekávání: Σ_persons cw[*, item] = 1.0
11 test_cw_range_0_1 PASS

CW je per-item normalizovaný podíl, vždy v [0, 1.0]. Žádné fixní floor/ceiling per signál.

Očekávání: 0 ≤ cw[P, item] ≤ 1.0
12 test_no_negative_contribution_score PASS

contribution_score se sčítá z pozitivních signal weights — žádný signál neodečítá.

Očekávání: contribution_score ≥ 0 vždy
13 test_per_item_independence PASS

CW jedné osoby na itemu A je nezávislé na CW na itemu B (per-item normalizace).

Očekávání: cw[P, A] nezávisí na cw[P, B]
14 test_per_person_independence PASS

CW dvou osob na stejném itemu jsou nezávislé (oba pocházejí z vlastních signal aggregations).

Očekávání: cw[P1, item] nezávisí na cw[P2, item]
15 test_strategic_role_via_signal_calibration PASS

PM/BO/Arch contribution se zachytí přes issue_comment + pr_reviewer + manual /contribute. Per-role multipliers se nepoužívají — bias se řeší kalibrací signal weights proti ground truth.

Očekávání: No role_overrides in heuristics

4. Dual-View konzistence — 12 scénářů × 6 osob = 72 kontrol

72/72 PASS

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.

Každý scénář běží per osoba: Alice, Bob, Carol, Dave, Eve, Frank — celkem 72 kontrol.
01 test_per_person_sum_equals_capacity PASS

Per-person pohled: součet odvozených hodin = kapacita pro každou osobu.

Očekávání: Σ 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.

Očekávání: Σ shares[*, item] = 100%
03 test_same_cw_same_results_both_views PASS

Stejné CW musí produkovat stejné výsledky v obou pohledech.

Očekávání: per-person hours consistent with per-item shares
04 test_no_transitions_degenerates_to_done_credit PASS

Když git history nezachycuje žádné Feature/Epic/Initiative transitions, engine kredituje pouze Story Done items.

Očekávání: gate_events empty → kredituje jen Story Done
05 test_per_person_hours_sum_cross_items PASS

Per-person: hodiny na item X + hodiny na všechny ostatní itemy = celková kapacita.

Očekávání: 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.

Očekávání: 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.

Očekávání: 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.

Očekávání: 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.

Očekávání: 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.

Očekávání: ΣΣ 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.

Očekávání: 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.

Očekávání: item hours reflect JS weight in total budget

5. Edge Cases — 18 scénářů × 6 osob = 108 kontrol

108/108 PASS

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.

Každý scénář běží per osoba: Alice, Bob, Carol, Dave, Eve, Frank — celkem 108 kontrol.
01 test_person_zero_relevant_items PASS

Osoba s 0 relevantními itemy musí dostat 0 hodin bez pádu aplikace.

Očekávání: 0 items → 0h, no crash
02 test_person_single_item_full_capacity PASS

Osoba s jedním itemem musí dostat plnou kapacitu.

Očekávání: 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.

Očekávání: 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ě.

Očekávání: 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).

Očekávání: 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.

Očekávání: 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ě.

Očekávání: 100 items: Σ hours = capacity
08 test_max_job_size_allocation PASS

Maximální Job Size (20) musí produkovat správnou proporcionální alokaci.

Očekávání: JS = 20 → correct proportional allocation
09 test_min_job_size_allocation PASS

Minimální Job Size (1) musí produkovat správnou proporcionální alokaci.

Očekávání: 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.

Očekávání: 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.

Očekávání: 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.

Očekávání: Σ within 0.01h tolerance
13 test_unicode_item_titles PASS

Unicode znaky v názvech itemů nesmí způsobit chyby zpracování.

Očekává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.

Očekávání: empty iteration → graceful handling
15 test_person_only_epic_feature PASS

Osoba pouze na Epic/Feature (bez stories) musí stále dostat alokaci.

Očekávání: 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.

Očekávání: JS < 0 → item rejected
17 test_duplicate_person_on_item_no_double_count PASS

Duplicitní signály stejné osoby na itemu nesmí zdvojit alokaci.

Očekávání: 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ží.

Očekávání: 20+ people: all invariants hold
🔄

6. Auto-kalibrace — 12 scénářů

12/12 PASS

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ů.

Očekávání: 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|.

Očekávání: 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".

Očekávání: direction: lower is better
04 test_calibrator_locked PASS

Kalibrátor (calibrate_signals.py) je zamčený — synthetic korpus + MAD cost function jsou v jednom souboru. Agent ho nesmí modifikovat (gaming).

Očekávání: calibrate_signals.py: LOCKED, read-only
05 test_single_change_per_iteration PASS

Každý experiment mění pouze jeden parametr — izolace efektu změn.

Očekává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.

Očekávání: 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).

Očekávání: MAD worse → git revert
08 test_keep_on_better_or_equal_mad PASS

Při zlepšení nebo stejném MAD se experiment zachová.

Očekávání: 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.

Očekávání: budget ≤ 50 experiments
10 test_expected_improvement_range PASS

Očekávané zlepšení je 15–30% redukce MAD po 50 experimentech.

Očekávání: 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.

Očekávání: 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.

Očekávání: no data leakage between train/validation
🔒

7. Governance & Audit — 17 scénářů

17/17 PASS

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.

Očekávání: snapshot.frozen = true after close
02 test_frozen_snapshot_immutable PASS

Zmrazený snapshot nesmí být modifikován na místě (in-place).

Očekávání: 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.

Očekávání: correction → new revision (_rev2, _rev3)
04 test_snapshot_required_fields PASS

Snapshot musí obsahovat všech 10 požadovaných top-level klíčů.

Očekávání: 10 required keys present in snapshot
05 test_branch_naming_enforced PASS

Branch naming konvence: {type}/{ITEM-ID}-description musí být dodržena.

Očekávání: 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.

Očekávání: PR references: S-XXX, F-XXX, or E-XXX
07 test_traceability_chain PASS

Plný řetězec sledovatelnosti: Initiative → Epic → Feature → Story → PR → Commit.

Očekávání: Initiative → Epic → Feature → Story → PR → Commit
08 test_wsjf_calculation PASS

WSJF se správně počítá jako (BV + TC + RR&amp;OE) / JS.

Očekávání: WSJF = (BV + TC + RR&amp;OE) / JS
09 test_job_size_guardrails_story PASS

Job Size guardrails pro Story: JS ≤ 8 (ideálně ≤ 5).

Očekávání: Story JS ≤ 8 (recommended ≤ 5)
10 test_job_size_guardrails_feature PASS

Job Size guardrails pro Feature: JS ≤ 13.

Očekávání: Feature JS ≤ 13
11 test_job_size_guardrails_epic PASS

Job Size guardrails pro Epic: JS ≤ 20.

Očekávání: Epic JS ≤ 20
12 test_dor_checklist_validation PASS

Definition of Ready checklist: popis, AC, odhad, parent linked.

Očekávání: DoR: description, AC, estimate, parent linked
13 test_dod_checklist_validation PASS

Definition of Done checklist: code reviewed, testy prošly, PR mergnuto.

Očekávání: 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.

Očekávání: WIP limit: 1 Story per person (ideal)
15 test_bankid_signature_support PASS

Podpora BankID elektronického podpisu (zákon 21/2020 Sb.).

Očekávání: 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.

Očekávání: 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.

Očekávání: 5 pillars: evidence, capacity, snapshot, calc, signature
📈

8. Plánování kapacity — 12 scénářů

12/12 PASS

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.

Očekávání: 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).

Očekávání: 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%.

Očekávání: 0 < planning_factor ≤ 1.0
04 test_planning_capacity_formula PASS

Planning Capacity = Total Capacity × planning_factor pro každý tým.

Očekávání: 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.

Očekávání: 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.

Očekávání: 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.

Očekávání: 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.

Očekávání: 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).

Očekávání: availability = confirmed required
10 test_planning_factor_no_affect_invariant PASS

planning_factor nesmí ovlivnit matematickou záruku Σ DerivedHours = Capacity.

Očekávání: 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í.

Očekávání: 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.

Očekávání: Buffer_Usage > 90% → warning

Auto-kalibrace (Karpathy loop)

Automatický kalibrační systém inspirovaný Karpathyho autoresearch vzorem. Jeden soubor, jedna metrika, jedna smyčka.

Konfigurace
Targetcw_heuristics.yaml.tmpl (signals: blok)
MetricMAD (Mean Absolute Deviation) na MC korpusu
Directionlower is better
Budget2000 MC samples + coordinate descent top-5 (~10s)
Search space3D signal weights, každá v [0.1, 8.0]
Kalibrátorcalibrate_signals.py (LOCKED)
Očekávané výsledky
  • 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

  1. Spustit python calibrate_signals.py --scenarios 1000 --seed 42
  2. Skript provede:
    1. Vygeneruje synthetic Monte Carlo korpus (1 000 scénářů × ~31 k záznamů) procedurálně z modelu, kde signal counts pravděpodobnostně reflektují true cw share
    2. Spočítá MAD baseline proti shipped defaults (commit_author=4.00, pr_reviewer=2.17, issue_comment=1.46)
    3. Fáze 1 — random sampling: 2000 náhodných weight vektorů ve 3D prostoru [0.1, 8.0], seřadí podle MAD
    4. Fáze 2 — coordinate descent: refinuje top-5 kandidátů, pro každý signal zkusí ±step, halves step na no-improvement
    5. Vrátí best calibrated weights + MAD improvement %
    6. S --apply přepíše cw_heuristics.yaml.tmpl + obnoví calibration: metadata
  3. Vytiskne souhrn: baseline MAD, calibrated MAD, % zlepšení, top weights
  4. (Optional) --report report.json dump celého běhu pro audit

Bezpečnostní omezení

Kalibrátor je LOCKED — agent nesmí editovat calibrate_signals.py. Synthetic corpus generator + MAD cost function jsou v jednom souboru by design; separation by structure brání gaming.
Žádné parametry uvnitř cost functionevaluate_mad() bere jen weight vektor a pure-reads signal_count × weight s per-item normalizací.

Strategie eskalace

ExperimentyFocusParametry
1–30signal weights (Monte Carlo)3 parametry, random sampling
31–50signal weights (Nelder-Mead refinement)local descent kolem MC top-K

CW Heuristika

Výchozí váhy pro automatické přiřazení Contribution Weight na základě GitHub signálů. Hodnoty kalibrované Monte Carlo simulací.

Derived role labels Display layer only

EDPA neukládá role per osobu — odvozuje se z dominantního signál typu pro UX (timesheets, reports). Engine math vidí jen cw hodnoty.

Dominant signalDisplay role
commit_authorowner
manual:*key
pr_reviewerreviewer
issue_commentconsulted
Signal weights
SignalScore
commit_author4.00
pr_reviewer2.17
issue_comment1.46
manual:* (/contribute)explicit
Pravidlo: Signály se sčítají additivně do contribution_score per (osoba, item). Per-item normalizace dává cw = score / Σ_persons score. Žádný "highest signal wins", žádný threshold — i jeden komentář generuje proporční podíl.

Validace Monte Carlo

1000 syntetických scénářů (32 210 záznamů), 5 candidates konvergovaly na MAD 0.0805 (improvement 6.5% nad inherited baseline)

Strategická-role bias correction

EDPA addresses Git’s under-counting of BO/PM/Arch contribution purely via signal weight calibration:

  • BO/PM contributions show up via issue_comment + manual /contribute directives. Calibrator boosts issue_comment weight if BO/PM are under-credited in ground truth.
  • Arch contributions show via pr_reviewer. Calibrator boosts pr_reviewer weight similarly.
  • Dev/QA reference baseline — Git accurately captures their commits/reviews.
  • Edge-case generator simuluje pm_driven, pair_programmed, design_heavy, silent_reviewer patterns aby kalibrace generalizovala.
Pozn: Pre-pilot baseline je z syntetických scénářů. Po prvním PI close kashealth pilotu se kalibruje proti reálné ground truth (≥20 confirmed cw records).

Srovnání metod

Kritérium EDPA v2.11.1 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

OsobaFTEKapacita (h)
Alice0.540h
Bob1.080h
Carol0.7560h

Work items & přiřazení (CW per-item normalizované, Σ na řádku = 1.0)

ItemJSAlice (CW)Bob (CW)Carol (CW)Σ
S-10150.700.301.00
S-10230.550.451.00
S-10380.650.351.00
S-10420.300.701.00
S-10551.001.00

Výpočet skóre (Score = JS × CW)

ItemJSAlice ScoreBob ScoreCarol Score
S-10153.501.50
S-10231.651.35
S-10385.202.80
S-10420.601.40
S-10555.00
Σ5.158.659.20

Odvozené hodiny (DH = Score / ΣScore × Capacity)

ItemAlice (40h)Bob (80h)Carol (60h)
S-10127.18h13.87h
S-10212.82h12.49h
S-10348.09h18.26h
S-1045.55h9.13h
S-10532.61h
Σ40.00h80.00h60.00h
Alice
Σ = 40.00h
Kapacita: 40h
VERIFIED
Bob
Σ = 80.00h
Kapacita: 80h
VERIFIED
Carol
Σ = 60.00h
Kapacita: 60h
VERIFIED
Σ DerivedHours[P, *] = Capacity[P, I] Platí pro každou osobu. Vždy. Bez výjimky.