addlisted
Install: claude install-skill technomaton/edpa
# EDPA Add — Create Backlog Item
## What this does
V2 local-first add. No `gh` calls.
1. `id_counter.next_id(type)` from `.edpa/config/id_counters.yaml` →
next available number, atomic via file lock + `max(counter, fs_scan)`.
2. EDPA ID = `{prefix}-{num}` → `I-3`, `E-15`, `F-8`, `S-42`, `D-7`,
`EV-2`, `R-1`.
3. MCP `edpa_item_create` handler validates parent type hierarchy
in-process (Story→Feature, Feature→Epic, Epic→Initiative).
4. Writes `.edpa/backlog/<type>/{ID}.md` directly via
`_md_frontmatter.save_md`.
5. `git commit -m "feat({ID}): <title>"`.
PR-derived signals (pr_author, pr_reviewer, issue_comment) arrive
asynchronously via the CI workflow at
`.github/workflows/edpa-contribution-sync.yml` — see
`/edpa:setup --with-ci` and `docs/v2/decisions.md` ADR-012.
## Parallel ID allocation — collision handling
ID allocation is **local-first** (no central coordinator). If two devs both
pull `main` when last Story is `S-4` and both run `/edpa:add Story`, both
will get `S-5` locally — the collision surfaces at PR merge time.
EDPA detects + resolves this via four defense layers:
- **Pre-commit hook** (`validate_ids.py --staged`) — local staged consistency
- **Pre-push hook** (`validate_ids.py --pre-push`) — blocks push if local ID
already exists on `origin/main`
- **CI workflow** (`edpa-collision-check.yml`) — comments on PR + fails check
when collision detected
- **Manual recovery** (`renumber_collisions.py --apply`) — renames local
file, rewrites `id:`