Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
# Changelog

## 2.1.10 — 2026-06-01 — Drop dead `cadence:` config (cadence is iteration-sourced)

The `cadence:` block (`iteration_weeks` / `pi_weeks` / `delivery_iterations_per_pi`
/ `ip_iterations_per_pi`) that shipped in the `people.yaml` template was **never read
by the engine**. Effective cadence is derived per Planning Interval from the `pi:`
block of `.edpa/iterations/PI-*.yaml` (`_pi_loader.derive_pis`), or inferred from each
iteration's `weeks:`/dates. The block was dead config that invited "edit this to change
the rhythm" mistakes, and it had been copied — with a misleading "must mirror" note —
into `edpa.yaml` examples and test fixtures too.

### refactor(cadence): remove the dead block everywhere, redirect to the live surface
- `people.yaml.tmpl`: drop the `cadence:` block; add a breadcrumb pointing at the
iteration `pi:` block. `people.yaml` is now just `teams` + `people`.
- Examples/fixtures: drop `cadence:` from `docs/kashealth-pilot/{edpa,people}.yaml.example`,
`docs/examples/capacity-small-team.yaml`, and `tests/e2e_v2_full/fixtures/{edpa,people}.yaml`
(incl. the stale "must mirror / Wave C verifies this match" comments — no code ever
verified it).
- Docs + web: remove the `cadence:` snippet from README / SETUP / quick-start / playbook
(CZ+EN) and the web setup wizard's generated config; point users at the iteration
`pi:` block. `docs/cadence.md` gains a "Where cadence is configured" section.
Conceptual cadence content (2/10 vs 1/5 variants) is unchanged.

### docs(mcp,backlog): fix two stale "cadence" references
- `mcp_server.py`: the `edpa://config` resource serves `edpa.yaml` but was described as
"Master config: PI, iterations, cadence, sync settings" — corrected to the project
config it actually serves.
- `backlog.py`: the "Load team metadata (people, teams, cadence)" comment overstated —
cadence is loaded into the dict but never read; the comment now says so.

No engine behaviour change — cadence was already iteration-sourced. Full suite 577 passing.

## 2.1.9 — 2026-06-01 — Windows onboarding fixes (filelock, UTF-8 console + file I/O)

`/edpa:edpa-setup` crashed on a fresh Windows box, surfaced by colleagues running
Expand Down
4 changes: 0 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,6 @@ The template ships with placeholder names. Replace them with your team
(1-week iterations, 5-week PI = 4 delivery + 1 IP):

```yaml
cadence:
iteration_weeks: 1 # AI-native default; use 2 for classic SAFe
pi_weeks: 5 # 4 delivery iterations + 1 IP

people:
- id: alice
name: "Alice Architect"
Expand Down
3 changes: 0 additions & 3 deletions SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@ If you prefer to configure manually instead of using `/edpa setup`:
Edit `.edpa/config/people.yaml`:

```yaml
cadence:
iteration_weeks: 2 # 1 (AI-native) or 2 (classic)

people:
- id: alice
name: "Alice Smith"
Expand Down
16 changes: 16 additions & 0 deletions docs/cadence.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,19 @@ Switch after first PI if:
## EDPA is cadence-agnostic

The formula works identically for both variants — only `Capacity[P, I]` changes.

## Where cadence is configured

Cadence is **not** set in `people.yaml`. The engine derives it per Planning
Interval from the iteration files in `.edpa/iterations/`:

```yaml
# .edpa/iterations/PI-2026-1.yaml
pi:
id: PI-2026-1
iteration_weeks: 1 # 1 (AI-native) or 2 (classic)
pi_iterations: 5 # total iterations incl. IP (4 delivery + 1 IP)
```

If `iteration_weeks` / `pi_iterations` are omitted, the engine infers them from
each iteration's `weeks:` (or its start/end dates) and the iteration count.
18 changes: 5 additions & 13 deletions docs/examples/capacity-small-team.yaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,8 @@
# Example: 3-person startup team
# Classic SAFe cadence (2-week iterations, 10-week PI).
#
# As of 1.4 the default ships AI-native (1-week iter / 5-week PI) — see
# plugin/edpa/templates/people.yaml.tmpl for the new defaults. This file
# stays as a reference for teams that want classic SAFe; just halve every
# capacity_per_iteration value below if you switch to iteration_weeks: 1.

cadence:
iteration_weeks: 2
pi_weeks: 10
delivery_iterations_per_pi: 4
ip_iterations_per_pi: 1
# Example: 3-person startup team.
# Capacities below assume classic SAFe (2-week iterations): 1.0 FTE = 80h.
# For the AI-native default (1-week iterations) halve every
# capacity_per_iteration. Cadence itself is set per-PI in the `pi:` block of
# .edpa/iterations/PI-*.yaml, not here — see docs/cadence.md.

teams:
- id: "Acme Corp"
Expand Down
2 changes: 1 addition & 1 deletion docs/kashealth-pilot/KASHEALTH-PILOT.md
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ Pokud 5+ z 6 PASS → pilot úspěšný, pokračuj na PI-2026-2 (full prod) a zv

## 7. Open questions (pre-kickoff sync)

1. **PI cadence** — 1-week × 5 (default) vs 2-week × 5? Nastavitelné v `cadence:` (edpa.yaml + people.yaml, musí se shodovat).
1. **PI cadence** — 1-week × 5 (default) vs 2-week × 5? Nastavitelné per-PI v `pi:` bloku `.edpa/iterations/PI-*.yaml` (`iteration_weeks` / `pi_iterations`).
2. **FTE distribuce** — 1.0 / 0.5 / 0.25 per člen? Doporučení v `people.yaml.example`.
3. **Cost reporting** — sazby drží **privátní registr** (ne EDPA people.yaml — engine `hourly_rate` nečte). Auditor format = open question.
4. **Calibration timing** — `/edpa:autocalib` až po PI-2026-1 close (potřeba ≥ 20 ground truth records).
Expand Down
9 changes: 0 additions & 9 deletions docs/kashealth-pilot/edpa.yaml.example
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,6 @@ governance:
# audit_mode — snapshoty vždy nesou plný signals[] audit trail.
methodology: "EDPA 2.1.8"

# Kadence (AI-native default): 1-week iterace × 5 (4 delivery + 1 IP).
# Musí zrcadlit `cadence:` blok v people.yaml. Pro classic SAFe nastav
# iteration_weeks: 2 a pi_weeks: 10.
cadence:
iteration_weeks: 1
pi_weeks: 5
delivery_iterations_per_pi: 4
ip_iterations_per_pi: 1

naming:
pi_pattern: "PI-{year}-{pi_num}"
iteration_pattern: "PI-{year}-{pi_num}.{iter_num}"
Expand Down
12 changes: 3 additions & 9 deletions docs/kashealth-pilot/people.yaml.example
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,9 @@
# ani cost (jen Item, Level, JS, Person, CW, Score, Ratio, Hours).
# Sazby držte v separátním (privátním) registru — dle smluv —
# ne v EDPA configu, který může skončit v public repu.

cadence:
# AI-native default per EDPA: 1-week delivery iteration × 5 (4 delivery + 1 IP).
# Pokud preferujete classic SAFe (2-week iter × 5 = 10 weeks), nastavte
# iteration_weeks: 2 a pi_weeks: 10.
iteration_weeks: 1
pi_weeks: 5
delivery_iterations_per_pi: 4
ip_iterations_per_pi: 1
#
# Kadenci (iteration_weeks / pi_iterations) nastav per-PI v `pi:` bloku
# .edpa/iterations/PI-*.yaml, ne tady. Viz docs/cadence.md.

teams:
- id: "kashealth"
Expand Down
16 changes: 3 additions & 13 deletions docs/playbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ my-project/
.edpa/
config/
edpa.yaml # Projekt + governance (zdroj verze metodiky)
people.yaml # Tym a kapacity (cadence, teams, people)
people.yaml # Tym a kapacity (teams, people)
cw_heuristics.yaml # CW signalove vahy
id_counters.yaml # Citace ID (S-1, E-1, F-1, ...)
backlog/
Expand Down Expand Up @@ -152,19 +152,9 @@ my-project/
cp .edpa/engine/templates/people.yaml.tmpl .edpa/config/people.yaml
```

Upravit `.edpa/config/people.yaml`. Tady zije **cadence + teams + people** -- zadny separatni registr, vse je v jednom souboru:
Upravit `.edpa/config/people.yaml`. Tady ziji **teams + people** -- zadny separatni registr. Kadence (iteration_weeks / pi_iterations) se nastavuje per-PI v `pi:` bloku `.edpa/iterations/PI-*.yaml`, pripadne se odvodi z `weeks:`/dat iteraci -- viz [cadence.md](cadence.md):

```yaml
cadence:
# AI-native default: 5-tydenni PI = 4 dodavkove iterace po 1 tydnu + 1 IP
# tyden na dluh, prioritizaci a PI planning (s AI zvladnutelne za den).
# Classic SAFe (2-tydenni iterace, 10-tydenni PI) zustava podporovany —
# nastav iteration_weeks: 2 + pi_weeks: 10.
iteration_weeks: 1 # 1 (AI-native, default) nebo 2 (classic)
pi_weeks: 5 # 5 (AI-native, default) nebo 10 (classic)
delivery_iterations_per_pi: 4 # PI minus IP iterace
ip_iterations_per_pi: 1 # Innovation & Planning

teams:
- id: "Muj Tym"
planning_factor: 0.8 # Planujeme na 80% kapacity
Expand Down Expand Up @@ -778,7 +768,7 @@ V2 ma **jediny** volitelny workflow (jen s `--with-ci`):
### Den 1

- [ ] Engine vendorovany do `.edpa/engine/` (`/edpa:setup` nebo `project_setup.py`)
- [ ] `.edpa/config/people.yaml` -- tym s rolemi, FTE, kapacitami (cadence + teams + people)
- [ ] `.edpa/config/people.yaml` -- tym s rolemi, FTE, kapacitami (teams + people)
- [ ] `.edpa/config/edpa.yaml` -- nazev projektu, governance, naming
- [ ] `.edpa/config/cw_heuristics.yaml` -- vychozi signalove vahy (ze sablony)
- [ ] `.edpa/config/id_counters.yaml` -- naseto
Expand Down
4 changes: 0 additions & 4 deletions docs/quick-start.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,6 @@ cp plugin/edpa/templates/people.yaml.tmpl .edpa/config/people.yaml

Edit `.edpa/config/people.yaml` with your team:
```yaml
cadence:
iteration_weeks: 1 # 1-week iterations (AI-native default; use 2 for classic SAFe)
pi_weeks: 5 # 5-week planning intervals (4 delivery + 1 IP)

people:
- id: alice
name: "Alice Smith"
Expand Down
2 changes: 1 addition & 1 deletion plugin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "edpa",
"version": "2.1.9",
"version": "2.1.10",
"description": "EDPA — Evidence-Driven Proportional Allocation. Derive hours from local git evidence (commits, yaml edits, status transitions). Zero timesheets, mathematical guarantee, Monte Carlo calibrated CW weights. Local-first: .edpa/backlog/ YAML as source of truth, git as the audit trail. GitHub Projects sync optional.",
"author": {
"name": "TECHNOMATON",
Expand Down
3 changes: 2 additions & 1 deletion plugin/edpa/scripts/backlog.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,8 @@ def load_backlog(root):
"""
edpa = root / ".edpa"

# Load team metadata (people, teams, cadence)
# Load team metadata (people, teams). The cadence: block is not read here —
# effective cadence is derived from .edpa/iterations/PI-*.yaml (see _pi_loader).
people_path = edpa / "config" / "people.yaml"
backlog = yaml.safe_load(open(people_path, encoding="utf-8")) if people_path.exists() else {}

Expand Down
2 changes: 1 addition & 1 deletion plugin/edpa/scripts/mcp_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -1407,7 +1407,7 @@ async def list_resources() -> list[Resource]:
resources = []
if edpa_root:
if (edpa_root / "config" / "edpa.yaml").exists():
resources.append(Resource(uri="edpa://config", name="EDPA Configuration", description="Master config: PI, iterations, cadence, sync settings", mimeType="application/x-yaml"))
resources.append(Resource(uri="edpa://config", name="EDPA Configuration", description="Project config: name, funding, organizations, governance, naming, issue types", mimeType="application/x-yaml"))
if (edpa_root / "config" / "people.yaml").exists():
resources.append(Resource(uri="edpa://people", name="EDPA Team Registry", description="Team members, roles, FTE, capacity", mimeType="application/x-yaml"))
# Add iteration resources for each iteration
Expand Down
2 changes: 1 addition & 1 deletion plugin/edpa/templates/edpa.yaml.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ project:

governance:
# Auto-stamped to the installed plugin version by install.sh / project_setup.py.
methodology: "EDPA 2.1.9"
methodology: "EDPA 2.1.10"
# v1.14: single calculation path. v1.17: extended with yaml_edit
# signals — every commit on .edpa/backlog/<typ>/<id>.md in the
# iteration window contributes structural credit (create / block_add
Expand Down
15 changes: 4 additions & 11 deletions plugin/edpa/templates/people.yaml.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,9 @@
# Edit this file with your team details
# Updated at each Iteration Planning

cadence:
# Default is AI-native: 5-week PI = 4× 1-week delivery iteration + 1× 1-week IP.
# The IP iteration absorbs leftover work, debt, prioritization, and PI planning
# itself (compressible to a single day with AI-assisted ceremonies).
# Set iteration_weeks: 2 + pi_weeks: 10 + delivery_iterations_per_pi: 4 for
# classic SAFe cadence on slower-moving teams.
iteration_weeks: 1 # 1 (AI-native, default) or 2 (classic SAFe)
pi_weeks: 5 # 5 (AI-native, default) or 10 (classic)
delivery_iterations_per_pi: 4 # PI minus IP iteration
ip_iterations_per_pi: 1 # Innovation & Planning
# Cadence (iteration_weeks / pi_iterations) is NOT configured here. It is set
# per Planning Interval in the `pi:` block of .edpa/iterations/PI-*.yaml, or
# auto-derived from each iteration's `weeks:`/dates. See docs/cadence.md.

# Teams — planning_factor is a team-level decision, not a cadence property
teams:
Expand Down Expand Up @@ -88,7 +81,7 @@ people:
# Calculated at runtime by EDPA engine:
# total_fte: sum of people[].fte
# total_capacity_per_iteration: sum of people[].capacity_per_iteration
# total_capacity_per_pi: total_capacity_per_iteration × delivery_iterations_per_pi
# total_capacity_per_pi: total_capacity_per_iteration × delivery iterations in the PI

# ─────────────────────────────────────────────────────────────────────
# Backlog item evidence schema (v1.11 — referenced from .edpa/backlog/**/*.yaml)
Expand Down
9 changes: 0 additions & 9 deletions tests/e2e_v2_full/fixtures/edpa.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,6 @@ naming:
defect: "D"
event: "EV"

# AI-native cadence: 1-week iterations, 5-week PI (4 delivery + 1 IP).
# Must mirror the cadence block in people.yaml — the test harness
# verifies this match as part of Wave C invariant checks.
cadence:
iteration_weeks: 1
pi_weeks: 5
delivery_iterations_per_pi: 4
ip_iterations_per_pi: 1

# Native GitHub Issue Types (org-level, not labels)
issue_types:
Initiative: "Business case, investment proposal"
Expand Down
7 changes: 0 additions & 7 deletions tests/e2e_v2_full/fixtures/people.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,6 @@
# Total capacity per iteration must sum to exactly 144 hours, which
# Wave C asserts as an invariant.

cadence:
# Must match the cadence block in edpa.yaml (1-week iters, 5-week PI).
iteration_weeks: 1
pi_weeks: 5
delivery_iterations_per_pi: 4
ip_iterations_per_pi: 1

# Single team for the synthetic project; planning_factor 0.8 leaves
# 20% buffer per the AI-native defaults.
teams:
Expand Down
2 changes: 0 additions & 2 deletions tests/test_capacity_overrides.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@ def _seed_minimal_edpa(tmp_path: Path, *, iteration_id="PI-2026-1.1",
(edpa / "backlog" / "features").mkdir(parents=True)

(edpa / "config" / "people.yaml").write_text(yaml.safe_dump({
"cadence": {"iteration_weeks": 1, "pi_weeks": 5,
"delivery_iterations_per_pi": 4, "ip_iterations_per_pi": 1},
"teams": [{"id": "T", "planning_factor": 0.8}],
"people": [
{"id": "bob-dev", "name": "Bob", "role": "Dev", "team": "T",
Expand Down
4 changes: 2 additions & 2 deletions web/src/pages/en/guide.astro
Original file line number Diff line number Diff line change
Expand Up @@ -84,15 +84,15 @@ Next: /edpa setup "Project Name"`,
/edpa:setup "Project Name" --with-ci`,
code: `# Manual alternative (outside Claude Code):
# 1. Edit .edpa/config/people.yaml (team, roles, FTE, capacity)
# 2. Edit .edpa/config/edpa.yaml (project name, cadence)
# 2. Edit .edpa/config/edpa.yaml (project name, governance, naming)
# 3. Seed ID counters:
python3 .edpa/engine/scripts/setup.py

# Optional — PR-signal CI workflow:
python3 .edpa/engine/scripts/setup.py --with-ci`,
result: `✓ Engine vendored: .edpa/engine/{scripts,templates,schemas}
✓ Team: 3 members configured (2.8 FTE)
✓ Config: .edpa/config/edpa.yaml (project + cadence)
✓ Config: .edpa/config/edpa.yaml (project + governance)
✓ Config: .edpa/config/people.yaml (team)
✓ Seeded: .edpa/config/id_counters.yaml
✓ CW heuristics: .edpa/config/cw_heuristics.yaml
Expand Down
18 changes: 4 additions & 14 deletions web/src/pages/en/playbook.astro
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ curl -fsSL https://edpa.technomaton.com/install.sh | sh</code></pre>
.edpa/
config/
edpa.yaml # Project + governance (source of methodology version)
people.yaml # Team and capacities (cadence, teams, people)
people.yaml # Team and capacities (teams, people)
cw_heuristics.yaml # CW signal weights
id_counters.yaml # ID counters (S-1, E-1, F-1, ...)
backlog/
Expand Down Expand Up @@ -138,18 +138,8 @@ curl -fsSL https://edpa.technomaton.com/install.sh | sh</code></pre>
<h3>1.2 Configure the team and capacities (people.yaml)</h3>
<p><code>project_setup.py</code> already seeds <code>.edpa/config/people.yaml</code> from the template. Or manually:</p>
<pre><code>cp .edpa/engine/templates/people.yaml.tmpl .edpa/config/people.yaml</code></pre>
<p>Edit <code>.edpa/config/people.yaml</code>. This is where <strong>cadence + teams + people</strong> live — no separate registry, everything is in one file:</p>
<pre><code>cadence:
# AI-native default: 5-week PI = 4 delivery iterations of 1 week + 1 IP
# (a week for debt, prioritization and PI planning — with AI, doable in a day).
# Classic SAFe (2-week iterations, 10-week PI) stays supported —
# set iteration_weeks: 2 + pi_weeks: 10.
iteration_weeks: 1 # 1 (AI-native, default) or 2 (classic)
pi_weeks: 5 # 5 (AI-native, default) or 10 (classic)
delivery_iterations_per_pi: 4 # PI minus IP iteration
ip_iterations_per_pi: 1 # Innovation &amp; Planning

teams:
<p>Edit <code>.edpa/config/people.yaml</code>. This is where <strong>teams + people</strong> live — no separate registry. Set cadence (iteration_weeks / pi_iterations) per-PI in the <code>pi:</code> block of <code>.edpa/iterations/PI-*.yaml</code>:</p>
<pre><code>teams:
- id: "My Team"
planning_factor: 0.8 # Plan to 80% of capacity

Expand Down Expand Up @@ -624,7 +614,7 @@ python3 .edpa/engine/scripts/reports.py PI-2026-1.1</code></pre>
<h3>Day 1</h3>
<ul class="checklist">
<li>Engine vendored into <code>.edpa/engine/</code> (<code>/edpa:setup</code> or <code>project_setup.py</code>)</li>
<li><code>.edpa/config/people.yaml</code> — team with roles, FTE, capacities (cadence + teams + people)</li>
<li><code>.edpa/config/people.yaml</code> — team with roles, FTE, capacities (teams + people)</li>
<li><code>.edpa/config/edpa.yaml</code> — project name, governance, naming</li>
<li><code>.edpa/config/cw_heuristics.yaml</code> — default signal weights (from the template)</li>
<li><code>.edpa/config/id_counters.yaml</code> — seeded</li>
Expand Down
8 changes: 0 additions & 8 deletions web/src/pages/en/setup.astro
Original file line number Diff line number Diff line change
Expand Up @@ -879,7 +879,6 @@ import Layout from '../../layouts/Layout.astro';
function generateConfigYaml(): string {
const org = state.githubOrg || 'my-org';
const repo = state.githubRepo || 'my-project';
const fteCap = getFullCapacity();
const lines = [
'# EDPA Configuration',
`# Generated: ${new Date().toISOString().split('T')[0]}`,
Expand All @@ -893,13 +892,6 @@ import Layout from '../../layouts/Layout.astro';
` org: "${org}"`,
` repo: "${repo}"`,
'',
'cadence:',
` iteration_weeks: ${state.iterWeeks}`,
` delivery_iterations: ${state.deliveryIters}`,
` ip_iterations: ${state.ipIters}`,
` pi_weeks: ${(state.deliveryIters + state.ipIters) * state.iterWeeks}`,
` capacity_per_fte: ${fteCap}`,
'',
'scoring:',
' contribution_weights:',
' assignee: 1.0',
Expand Down
Loading
Loading