Readiness calc counts ARCHIVED items as open blockers — archived node phantom-gates its dependents out of the ready set
Bug: The ready-set / readiness computation counts archived work items as open blockers. An archived item is a soft-removed (superseded) node and must be excluded from openBlockers, but it currently still gates its dependents — holding them out of the ready set indefinitely.
Surfaced: during Sprint 32 composition (7.20/7.6/7.4). After the 7.19→7.20 re-plan archived MOTIR-1012 (7.19.4, archivedAt set), it remained a blocked_by edge on MOTIR-1013 (7.20.6) and MOTIR-1015 (7.20.8). Both showed readiness.ready=false with MOTIR-1012 present in openBlockers despite being archived — which would have held the 7.20 progress-cluster + E2E (the story's exit) out of the ready set forever.
Workaround already applied: the two stale edges were manually unlinked so Sprint 32 is internally executable. This bug tracks the ROOT cause so the next re-plan that archives a blocker doesn't silently mis-gate again.
Root-cause hypothesis: the readiness query that collects an item's blockers (feeding get_work_item.readiness.openBlockers, list_ready, next_ready, and the board's ready column) joins blocked_by links without an archivedAt IS NULL filter on the blocker item.
Fix: in the ready-set computation (Repository layer), exclude blockers whose archivedAt is non-null — an archived blocker no longer holds an item out of the ready set. Apply uniformly to every consumer of the computation: get_work_item readiness, list_ready, next_ready, and the board ready column, so they agree.
Acceptance criteria:
- An item
blocked_byan archived item (no other open blockers) computesreadiness.ready=trueand does NOT list the archived item inopenBlockers. - A non-archived blocker still gates exactly as today (no regression).
list_ready/next_ready/get_work_item.readiness/ the board ready column all agree on the archived-blocker case.- Regression test: create A
blocked_byB, archive B, assert A is ready and B is absent from A'sopenBlockers.