feat(ready): exclude pinned issues from bd ready (beads-92u)

Pinned issues are persistent anchors that should not appear in ready
work lists. This adds:

- Pinned bool field to Issue struct
- pinned INTEGER DEFAULT 0 column to schema
- Migration 023 to add pinned column to existing databases
- WHERE i.pinned = 0 filter in GetReadyWork query

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-19 00:47:50 -08:00
parent 9dc34da64a
commit 5aacff4423
12 changed files with 118 additions and 27 deletions

View File

@@ -306,7 +306,7 @@ func (t *sqliteTxStorage) GetIssue(ctx context.Context, id string) (*types.Issue
created_at, updated_at, closed_at, external_ref,
compaction_level, compacted_at, compacted_at_commit, original_size, source_repo, close_reason,
deleted_at, deleted_by, delete_reason, original_type,
sender, ephemeral
sender, ephemeral, pinned
FROM issues
WHERE id = ?
`, id)
@@ -1098,7 +1098,7 @@ func (t *sqliteTxStorage) SearchIssues(ctx context.Context, query string, filter
created_at, updated_at, closed_at, external_ref,
compaction_level, compacted_at, compacted_at_commit, original_size, source_repo, close_reason,
deleted_at, deleted_by, delete_reason, original_type,
sender, ephemeral
sender, ephemeral, pinned
FROM issues
%s
ORDER BY priority ASC, created_at DESC
@@ -1141,6 +1141,8 @@ func scanIssueRow(row scanner) (*types.Issue, error) {
// Messaging fields (bd-kwro)
var sender sql.NullString
var ephemeral sql.NullInt64
// Pinned field (bd-92u)
var pinned sql.NullInt64
err := row.Scan(
&issue.ID, &contentHash, &issue.Title, &issue.Description, &issue.Design,
@@ -1149,7 +1151,7 @@ func scanIssueRow(row scanner) (*types.Issue, error) {
&issue.CreatedAt, &issue.UpdatedAt, &closedAt, &externalRef,
&issue.CompactionLevel, &compactedAt, &compactedAtCommit, &originalSize, &sourceRepo, &closeReason,
&deletedAt, &deletedBy, &deleteReason, &originalType,
&sender, &ephemeral,
&sender, &ephemeral, &pinned,
)
if err != nil {
return nil, fmt.Errorf("failed to scan issue: %w", err)
@@ -1203,6 +1205,10 @@ func scanIssueRow(row scanner) (*types.Issue, error) {
if ephemeral.Valid && ephemeral.Int64 != 0 {
issue.Ephemeral = true
}
// Pinned field (bd-92u)
if pinned.Valid && pinned.Int64 != 0 {
issue.Pinned = true
}
return &issue, nil
}