Merge polecat/Nux: exclude pinned from bd blocked

This commit is contained in:
Steve Yegge
2025-12-19 01:27:41 -08:00
3 changed files with 11 additions and 0 deletions

View File

@@ -1063,6 +1063,7 @@ func (m *MemoryStorage) getOpenBlockers(issueID string) []string {
} }
// GetBlockedIssues returns issues that are blocked by other issues // GetBlockedIssues returns issues that are blocked by other issues
// Note: Pinned issues are excluded from the output (beads-ei4)
func (m *MemoryStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedIssue, error) { func (m *MemoryStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedIssue, error) {
m.mu.RLock() m.mu.RLock()
defer m.mu.RUnlock() defer m.mu.RUnlock()
@@ -1075,6 +1076,11 @@ func (m *MemoryStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedI
continue continue
} }
// Exclude pinned issues (beads-ei4)
if issue.Pinned {
continue
}
blockers := m.getOpenBlockers(issue.ID) blockers := m.getOpenBlockers(issue.ID)
if issue.Status != types.StatusBlocked && len(blockers) == 0 { if issue.Status != types.StatusBlocked && len(blockers) == 0 {
continue continue

View File

@@ -258,11 +258,13 @@ func (s *SQLiteStorage) GetStaleIssues(ctx context.Context, filter types.StaleFi
} }
// GetBlockedIssues returns issues that are blocked by dependencies or have status=blocked // GetBlockedIssues returns issues that are blocked by dependencies or have status=blocked
// Note: Pinned issues are excluded from the output (beads-ei4)
func (s *SQLiteStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedIssue, error) { func (s *SQLiteStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedIssue, error) {
// Use UNION to combine: // Use UNION to combine:
// 1. Issues with open/in_progress/blocked status that have dependency blockers // 1. Issues with open/in_progress/blocked status that have dependency blockers
// 2. Issues with status=blocked (even if they have no dependency blockers) // 2. Issues with status=blocked (even if they have no dependency blockers)
// Use GROUP_CONCAT to get all blocker IDs in a single query (no N+1) // Use GROUP_CONCAT to get all blocker IDs in a single query (no N+1)
// Exclude pinned issues (beads-ei4)
rows, err := s.db.QueryContext(ctx, ` rows, err := s.db.QueryContext(ctx, `
SELECT SELECT
i.id, i.title, i.description, i.design, i.acceptance_criteria, i.notes, i.id, i.title, i.description, i.design, i.acceptance_criteria, i.notes,
@@ -279,6 +281,7 @@ func (s *SQLiteStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedI
AND blocker.status IN ('open', 'in_progress', 'blocked') AND blocker.status IN ('open', 'in_progress', 'blocked')
) )
WHERE i.status IN ('open', 'in_progress', 'blocked') WHERE i.status IN ('open', 'in_progress', 'blocked')
AND i.pinned = 0
AND ( AND (
i.status = 'blocked' i.status = 'blocked'
OR EXISTS ( OR EXISTS (

View File

@@ -34,6 +34,8 @@ CREATE TABLE IF NOT EXISTS issues (
pinned INTEGER DEFAULT 0, pinned INTEGER DEFAULT 0,
-- NOTE: replies_to, relates_to, duplicate_of, superseded_by removed per Decision 004 -- NOTE: replies_to, relates_to, duplicate_of, superseded_by removed per Decision 004
-- These relationships are now stored in the dependencies table -- These relationships are now stored in the dependencies table
-- Workflow fields
pinned INTEGER DEFAULT 0,
CHECK ((status = 'closed') = (closed_at IS NOT NULL)) CHECK ((status = 'closed') = (closed_at IS NOT NULL))
); );