Implement blocker mutations with cycle and concurrency protection #93
Description
Work
Add/remove directed task blockers and discovered_from provenance using the common relation model. Enforce same-project endpoints, write permissions, no self-links and acyclic blockers. Combine transaction/concurrency controls so simultaneous A->B and B->A cannot both commit.
Acceptance
- Direct and transitive cycles rejected; unrelated/parent links are not mistaken for blockers.
- Duplicate add and stale removal have deterministic behavior.
- Reopen, cancel, archive and dependency edits follow the approved semantics.
- SQL Server concurrency and SQLite tests cover meaningful graph races.
Dependencies
Dependency semantics and common relation persistence #75.