Acceptance Criteria
KNOWN_SECTIONS (work + bug) defines directed Blocked by and Blocks sections with aliases; Dependencies retained as a deprecated alias of Blocked byPlanEntity carries typed, directed dependency edges derived only from those sections (not the raw ref set)checkCircularDeps builds its adjacency map from the typed edges; prose / References / source-line refs no longer create edgesplan validate on the current corpus reports 0 circular-dependency errors- A test fixture with a genuine directed deadlock is still reported as an error
refrakt plan migrate dependencies renames legacy ## Dependencies sections (dry-run default, --apply/--git) and reports — without auto-flipping — reverse-direction entries for manual reviewpipeline.ts dependency rollups consume the same typed edges (single source of truth)- Docs updated:
CLAUDE.md Plan section + plan-plugin authoring docs describe the directed model and migration command
Approach
The scanner already produces scopedRefs: { id, section }[] and KNOWN_SECTIONS already maps a Dependencies section with a blocked by alias — the plumbing is mostly present. The work:
- scanner-core.ts — add
Blocked by / Blocks canonical sections + aliases; derive a typed dependencies array (normalised to A → B = "A blocked by B") on PlanEntity from scopedRefs, reversing Blocks entries. - validate.ts — repoint
checkCircularDeps from e.refs to the typed edges. - pipeline.ts — switch the existing
scopedRefs dependency rollup to the typed edges. - migrate — add a
dependencies subcommand alongside migrate filenames. - docs —
CLAUDE.md + authoring docs.
References
- SPEC-114 — the spec
- WORK-132 — earlier work that added the
## Dependencies sections this supersedes