Releases: technomaton/edpa
EDPA 1.4.0-beta
EDPA 1.4.0-beta — 2026-05-05
Minor release. Default cadence flips to AI-native for fresh
installs only — existing projects keep their explicit settings.
Bundles every accumulated Unreleased change since
v1.3.2-beta.
Changed (BREAKING for fresh installs only)
- Default cadence is now AI-native: 1-week iterations, 5-week PI
(4 delivery + 1 IP). The IP iteration absorbs leftover work,
debt, prioritization, and PI planning itself — compressible to a
single day with AI-assisted ceremonies. Classic SAFe (2-week /
10-week) is still fully supported; setcadence.iteration_weeks: 2
andcadence.pi_weeks: 10inpeople.yamlto opt out. - Default
capacity_per_iterationvalues in the template halved
accordingly:0.5 FTE Arch → 20h,1.0 FTE Dev → 40h(was 40h /
80h for 2-week iter). The template comments show the math both ways.
Added (since 1.3.2)
tests/test_mcp_integration.py— 16 live JSON-RPC stdio roundtrip
tests against a spawnedmcp_server.pysubprocess.sync add-iteration <ID>subcommand — appends a new iteration
option to the GitHub Project Iteration field after setup, drops the
TBD placeholder when the first real iteration is added. Idempotent.- README "First 5 minutes" guided walkthrough — install → seed → close
→ reports, copy-pasteable, all output blocks captured live. docs/E2E-SKILLS-TEST-PLAN.mdPříloha D — testing strategies for
skill flows: side-effects viaclaude -p, prompts via live
walkthrough, MCP dispatch via stderr inspection, regression via
recorded transcripts.TODO.mdv1.5 entry:claude -pskill harness with concrete
acceptance criteria.
Performance
mcp_server.load_yamlmtime-keyed LRU cache (cap 64 entries).
50× speedup on repeatedtools/callagainst an unchanged
backlog (28.17 ms cold → 0.56 ms warm on a 100-item fixture).
Fixed (hardening pass — backport of v1.3 MCP rigor)
engine.py,sync.py,evaluate_cw.py,pi_close.py—
load_yaml/load_jsonhelpers returnNoneon failure with
stderr WARNING instead of letting exceptions bubble up. Specific
exceptions only; KeyboardInterrupt / SystemExit propagate.validate_on_save.shhook — dropped trailing2>&1that was
rendering validation errors as if they were tool output.- Two
except Exceptionblocks inengine.pyreplaced with
specific types.
Test count
161 tests pass (was 139 in 1.3.2). 6 e2e deselected by design.
Install
curl -fsSL https://edpa.technomaton.com/install.sh | shFresh installs get the new AI-native default. Re-running the installer
on an existing project does not change people.yaml (templates only
seed when missing).
Migration from 1.3.x
No action required for engine, sync, MCP, or reports — those remain
byte-compatible. The cadence default change affects only new projects.
If you want to flip an existing project to AI-native:
# .edpa/config/people.yaml
cadence:
iteration_weeks: 1
pi_weeks: 5
delivery_iterations_per_pi: 4
ip_iterations_per_pi: 1
people:
- id: ...
capacity_per_iteration: 40 # halve from previous 2-week valueThen re-run iteration close to verify invariants still pass.
See CHANGELOG.md for the full diff.
EDPA 1.3.2-beta
EDPA 1.3.2-beta — 2026-05-05
Surface fixes for edpa_status post-setup output. Tag-only patch — engine, sync, and reports are byte-identical to v1.3.1-beta.
Fixed
- F3 —
edpa_statusalways reported\"project\": \"unknown\"._handle_statusreadproject.namefrompeople.yaml, but no shippedpeople.yaml.tmplhas ever had aproject:section. Now reads fromedpa.yaml(where the setting actually lives); legacy v0.x bundled configs still work via fallback. - F4 —
edpa_statusreported\"iterations_total\": 0immediately after setup.project_setup.pypersistedsync.field_ids/sync.option_idson step 9 but never wrotepis[]toedpa.yaml. Iteration YAMLs sat on disk unread until someone hand-edited the config. Setup now derivespis[]from.edpa/iterations/*.yamlin the same persistence pass. - Bonus:
project_setup.pywritesproject.namefrom--project-titlewhen the template placeholder is still in place; respects a name the user set by hand.
Both fixes were caught in the synthetic skill-driven E2E run as findings F3 and F4 (see docs/E2E-SKILLS-TEST-PLAN.md).
Verified live
Against technomaton/edpa-e2e-test sandbox with two iteration YAMLs (PI-2026-1.1 active, PI-2026-1.2 planned):
- MCP
edpa_status→project: 'EDPA-F3F4-...',current_pi: 'PI-2026-1',iterations_total: 2,active_iteration: 'PI-2026-1.1' - No "unknown" fallbacks anywhere in the output.
Migration from 1.3.1-beta
Existing edpa.yaml files keep working unchanged — the fixes only affect new setups and the read path. If your existing project shows "project": "unknown" and you'd like it fixed without a re-setup:
# .edpa/config/edpa.yaml
project:
name: "Your Project Name"— or run python3 .claude/edpa/scripts/sync.py setup-refresh to rebuild IDs (does not touch project name; that's a manual edit).
See CHANGELOG.md for the full diff.
EDPA 1.3.1-beta
EDPA 1.3.1-beta — 2026-05-05
Installer hot-fix on top of v1.3.0-beta. Tag-only patch — engine, sync, MCP server, and reports are byte-identical to 1.3.0-beta. Only install.sh is materially different.
Fixed
install.shnow installs themcpPython SDK alongsidepyyaml. Without it the v1.3.0-beta MCP server failed to start on a freshcurl install.sh | shagainst the system python3. The graceful import error in 1.3.0 saidERROR: 'mcp' package requiredand exited cleanly, but Claude Code clients silently fell back toBash + grepbecause the MCP tools never advertised. Customers using the public installer would experience EDPA without the MCP layer — the very layer we just hardened in 1.3. Caught in the synthetic skill-driven E2E run as finding F1 (seedocs/E2E-SKILLS-TEST-PLAN.md).install.shalso installsopenpyxlso the engine's Excel export and/edpa:reportsproduceitem-costs.xlsxandpi-summary.xlsxout of the box. Without it the engine printedExcel export skippedon every iteration close.
Verified live
From a fresh /tmp install with system python3:
pip3 install mcp openpyxlruns as part of installer.- MCP server starts, completes JSON-RPC
initialize→serverInfo: {name: edpa, version: 1.3.0-beta}. tools/listreturns 5 tools.
Install
curl -fsSL https://edpa.technomaton.com/install.sh | shMigration from 1.3.0-beta
If you already installed 1.3.0-beta and have a working MCP server, no action needed. If import mcp fails on your machine:
pip3 install mcp openpyxl --break-system-packages # or use a venv— or simply re-run the installer; it's idempotent.
Notes
web/public/install.shre-synced with the repo-root version. The two paths must stay byte-equal; permanent enforcement (symlink / build step / Vercel rewrite + CI byte-equality check) is filed inTODO.md.
See CHANGELOG.md for the full diff.
EDPA 1.3.0-beta
EDPA 1.3.0-beta — 2026-05-05
Production-quality MCP server. The server has shipped since 1.0.0-beta as a prototype but had a relative plugin path, no input validation, no logging, and unversioned identity. v1.3 makes it usable as a real Claude Code / Cursor / Codex CLI tool surface against .edpa/ data.
See docs/mcp.md for the full operator and integrator guide.
Highlights
- Portable plugin path —
${CLAUDE_PLUGIN_ROOT}instead of relative.claude/edpa/.... The server starts regardless of the client's working directory (was silently breaking when Claude Code launched fromweb/ortools/...). - Stderr logging — every
call_toolinvocation is logged with name + arguments.EDPA_LOG_LEVELandEDPA_LOG_FILEenv vars control verbosity / file mirroring. stdout stays clean for JSON-RPC. - Server identity carries version —
Server("edpa", version=…)readsplugin.jsonat startup. Live JSON-RPC handshake confirmsserverInfo: {name: edpa, version: 1.3.0-beta}. item_idregex guard — anything not matching^[A-Z]-\\d{1,9}$is rejected at the validator.{"item_id": "../etc/passwd"}returnsERROR: invalid item_id ...before any filesystem access.- Crash-safe dispatch — handler exceptions return
TextContentERROR: internal error ...instead of dropping the JSON-RPC session. - GitHub token via env —
plugin/.mcp.jsonreads${GITHUB_PERSONAL_ACCESS_TOKEN}from the environment instead of shipping a literal empty placeholder.
Test count
| Run | 1.2.1-beta | 1.3.0-beta |
|---|---|---|
pytest -m \"not e2e\" |
84 passed, 7 skipped, 1 collection error | 139 passed, 0 skipped, 0 errors |
+43 tests unlocked by adding jsonschema and mcp to requirements-dev.txt. +12 new tests in tests/test_mcp_server.py covering the hardening: TestItemIdValidation (6), TestCallToolErrorHandling (3), TestServerIdentity (2), TestLoggingSetup (1). The 6 e2e tests stay opt-in.
Live subprocess smoke (separate from unit tests) confirmed: initialize returns the version, tools/list enumerates 5 tools, tools/call edpa_status returns valid JSON, tools/call edpa_item with ../etc/passwd is rejected, stderr logs include the WARNING.
Install
curl -fsSL https://edpa.technomaton.com/install.sh | shMigration from 1.2.1-beta
No action required for engine, sync, or reports — those are unchanged. If you have an existing .edpa/ project running on 1.2.1-beta:
- Re-run the installer to pick up the new MCP server and the updated
plugin/.mcp.json. - Restart any running MCP client (Claude Code, Cursor) so it picks up the new server identity.
If you don't use MCP, no action at all is needed.
See CHANGELOG.md for the full diff.
EDPA 1.2.1-beta
EDPA 1.2.1-beta — 2026-05-05
Installer hot-fix on top of v1.1.0-beta. Tag-only patch — engine, sync, and reports are byte-identical to 1.1.0-beta. Skips v1.2.0; there is no body of work to bundle into a minor, just two installer bugs that need to ship before onboarding so curl install.sh | sh produces a clean install.
Fixed
install.shseeds.edpa/config/edpa.yamlfromproject.yaml.tmplalongsideheuristics.yamlandpeople.yaml. Without it,engine --statuson a fresh install printed✗ edpa.yaml not foundeven though installation was otherwise fine./edpa:setupwould create the file later, so nothing was actually blocked, but the message read as a broken install.install.shresolves the latest release with prerelease awareness. GitHub's/releases/latestAPI andgh release downloadwithout--tagboth skip prereleases. Every release so far is marked-beta, so the installer silently fell back to a main-branch clone instead of using the published asset. The gh path now usesgh release list --limit 1to discover the most recent tag (any type); the curl path uses/releases(plural) and picks the first matching asset.
Install
curl -fsSL https://edpa.technomaton.com/install.sh | shinstall.sh is served by Vercel from the repo's main branch — autodeploy picks up changes within a minute of merge.
Migration from 1.1.0-beta
No action needed. If you already have a working 1.1.0-beta install, this is a no-op for you. New installs benefit automatically.
See CHANGELOG.md for the full diff.
EDPA 1.1.0-beta
EDPA 1.1.0-beta — 2026-05-05
Second public beta. Gates allocation as default, bidirectional GitHub Projects sync, three sync bugs fixed during E2E validation.
Highlights
- Gates mode is now the default for
engine.pyand freshly initialized.edpa/config/edpa.yaml. Validated againsttechnomaton/edpa-simulation-gates(8 iterations, 6-person virtual team, 156 git transitions, 30 Monte Carlo runs): avg MAD 7.8% vs ground truth, 0.3 pp spread under ±20% CW perturbation. Existing projects keep their explicit setting; pass--mode simpleor setgovernance.calculation_mode: simpleto opt out. - Bidirectional sync against real GitHub Projects.
sync pushcreates issues, sets typed fields (NUMBER vs SINGLE_SELECT), mirrors→ Donetogh issue close, and links parent/child viaaddSubIssue.sync pullreads per-level typed status fields (Initiative/Epic/Feature/Story Status) so SAFe transitions round-trip end-to-end. sync setup-refreshrebuildsfield_ids,option_ids, andissue_map.yamlfrom an existing GitHub Project — useful on a new machine, after manual GitHub edits, or when local state is lost.docs/RUNBOOK.mdcovers every/edpa:*slash command with prerequisites, expected output, common failure modes, and a 5-minute end-to-end smoke test.docs/E2E-TEST-PLAN.md— repeatable 13-phase real-run test plan (install → setup → push → pull → close → reports → cleanup) for validating against your own sandbox.
Fixed during E2E validation
project_setup.pyskipped the Iteration field whenever.edpa/iterations/was empty at setup time. Subsequent push then failed forever withno field_id for 'Iteration'. Fixed: the field is always created, with aTBDplaceholder option when no iteration YAMLs exist yet.sync pullcleared localiteration:values whenever the GitHub Project had no Iteration field for the item. Fixed: pull preserves local iteration when remote is missing/empty.sync conflictsusedmax(last_pull, last_push)as the changelog cutoff and dropped any local change recorded between a push and the next pull. Fixed: per-side cutoffs (git_changes since last_push,github_changes since last_pull) so cross-side conflicts surface correctly.
Install
curl -fsSL https://edpa.technomaton.com/install.sh | shThe tarball asset (edpa-plugin.tar.gz) is what install.sh downloads; you can also fetch it manually and extract into .claude/.
Migration
No breaking changes vs 1.0.0-beta beyond the gates default. All 1.0.0-beta projects continue to work; if you do not want gates allocation, set governance.calculation_mode: simple in .edpa/config/edpa.yaml before running engine.py.
See CHANGELOG.md for the full diff.
EDPA 1.0.0-beta
First public beta
Evidence-Driven Proportional Allocation — derive hours from Git delivery evidence. Zero timesheets, mathematical guarantee, Monte Carlo calibrated CW weights.
Highlights
- Core engine with invariant validation (
Score = JobSize × CW × RelevanceSignal) - 5 Claude Code skills: setup, engine, reports, auto-calibration, sync
- Plugin-first distribution: install via
curl -fsSL https://edpa.technomaton.com/install.sh | sh - MCP server with 20+ read-only endpoints
- Website at edpa.technomaton.com (26 pages, CS+EN)
- 96 tests, 100% passing
- GitHub-native: branch naming CI, issue templates, project sync
Install
curl -fsSL https://edpa.technomaton.com/install.sh | shOr download the edpa-plugin.tar.gz asset and extract into .claude/ manually.
Full changelog
See CHANGELOG.md