Skip to content

isBlocked does not inherit through parent hierarchy #92

@teal-bauer

Description

@teal-bauer

Summary

core.IsBlocked() only checks direct blocking relationships. If epic A blocks epic B, children of epic B (features, tasks) still show as "ready" — because they have no direct blockers themselves.

Epic A  --blocks-->  Epic B
                       └── Feature X (child of B, shows as ready)

Where

internal/beancore/links.goFindActiveBlockers() checks:

  1. The bean's own blocked_by field
  2. Other beans listing this bean in their blocking field

Neither walks up the parent chain.

Affected

Everything that uses isBlocked filtering: list --ready and the GraphQL isBlocked filter. The new workflow commands in #89 (ready, next, blocked) also rely on this.

Open question

Not sure what the design intention is here. Possible interpretations:

  1. Children inherit parent's blocked status — if your parent is blocked, you're blocked. Simple, predictable. But maybe too coarse: you might want to prep child tasks while the parent epic is still blocked at the epic level.
  2. Children are independent (current behavior) — blocking only applies to the exact beans in the relationship. Users need to explicitly block children too.
  3. Middle groundisBlocked becomes ancestry-aware, but there's a way to distinguish transitive vs direct blocking so callers can choose.

wdyt?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions