fix: add missing crystallizes column to SELECT queries and remove duplicate

- Remove duplicate crystallizes column from schema.go
- Add crystallizes to SELECT in transaction.go SearchIssues
- Add crystallizes to SELECT in ready.go GetReadyWork and GetNewlyUnblockedByClose
- Add crystallizes to SELECT in labels.go GetIssuesByLabel
- Add missing placeholder in issues.go INSERT VALUES
- Update migrations_test.go schema to include crystallizes column

Fixes test failures caused by schema/query column count mismatches.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
beads/crew/fang
2026-01-10 23:55:05 -08:00
committed by Steve Yegge
parent 5528315838
commit 0de6b10ac0
6 changed files with 9 additions and 10 deletions

View File

@@ -56,7 +56,7 @@ func insertIssue(ctx context.Context, conn *sql.Conn, issue *types.Issue) error
await_type, await_id, timeout_ns, waiters, mol_type, await_type, await_id, timeout_ns, waiters, mol_type,
event_kind, actor, target, payload, event_kind, actor, target, payload,
due_at, defer_until due_at, defer_until
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`, `,
issue.ID, issue.ContentHash, issue.Title, issue.Description, issue.Design, issue.ID, issue.ContentHash, issue.Title, issue.Description, issue.Design,
issue.AcceptanceCriteria, issue.Notes, issue.Status, issue.AcceptanceCriteria, issue.Notes, issue.Status,
@@ -118,7 +118,7 @@ func insertIssueStrict(ctx context.Context, conn *sql.Conn, issue *types.Issue)
await_type, await_id, timeout_ns, waiters, mol_type, await_type, await_id, timeout_ns, waiters, mol_type,
event_kind, actor, target, payload, event_kind, actor, target, payload,
due_at, defer_until due_at, defer_until
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`, `,
issue.ID, issue.ContentHash, issue.Title, issue.Description, issue.Design, issue.ID, issue.ContentHash, issue.Title, issue.Description, issue.Design,
issue.AcceptanceCriteria, issue.Notes, issue.Status, issue.AcceptanceCriteria, issue.Notes, issue.Status,
@@ -150,7 +150,7 @@ func insertIssues(ctx context.Context, conn *sql.Conn, issues []*types.Issue) er
await_type, await_id, timeout_ns, waiters, mol_type, await_type, await_id, timeout_ns, waiters, mol_type,
event_kind, actor, target, payload, event_kind, actor, target, payload,
due_at, defer_until due_at, defer_until
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`) `)
if err != nil { if err != nil {
return fmt.Errorf("failed to prepare statement: %w", err) return fmt.Errorf("failed to prepare statement: %w", err)

View File

@@ -159,7 +159,7 @@ func (s *SQLiteStorage) GetIssuesByLabel(ctx context.Context, label string) ([]*
i.status, i.priority, i.issue_type, i.assignee, i.estimated_minutes, i.status, i.priority, i.issue_type, i.assignee, i.estimated_minutes,
i.created_at, i.created_by, i.owner, i.updated_at, i.closed_at, i.external_ref, i.source_repo, i.close_reason, i.created_at, i.created_by, i.owner, i.updated_at, i.closed_at, i.external_ref, i.source_repo, i.close_reason,
i.deleted_at, i.deleted_by, i.delete_reason, i.original_type, i.deleted_at, i.deleted_by, i.delete_reason, i.original_type,
i.sender, i.ephemeral, i.pinned, i.is_template, i.sender, i.ephemeral, i.pinned, i.is_template, i.crystallizes,
i.await_type, i.await_id, i.timeout_ns, i.waiters i.await_type, i.await_id, i.timeout_ns, i.waiters
FROM issues i FROM issues i
JOIN labels l ON i.id = l.issue_id JOIN labels l ON i.id = l.issue_id

View File

@@ -491,6 +491,7 @@ func TestMigrateContentHashColumn(t *testing.T) {
ephemeral INTEGER DEFAULT 0, ephemeral INTEGER DEFAULT 0,
pinned INTEGER DEFAULT 0, pinned INTEGER DEFAULT 0,
is_template INTEGER DEFAULT 0, is_template INTEGER DEFAULT 0,
crystallizes INTEGER DEFAULT 0,
await_type TEXT DEFAULT '', await_type TEXT DEFAULT '',
await_id TEXT DEFAULT '', await_id TEXT DEFAULT '',
timeout_ns INTEGER DEFAULT 0, timeout_ns INTEGER DEFAULT 0,
@@ -510,7 +511,7 @@ func TestMigrateContentHashColumn(t *testing.T) {
defer_until DATETIME, defer_until DATETIME,
CHECK ((status = 'closed') = (closed_at IS NOT NULL)) CHECK ((status = 'closed') = (closed_at IS NOT NULL))
); );
INSERT INTO issues SELECT id, title, description, design, acceptance_criteria, notes, status, priority, issue_type, assignee, estimated_minutes, created_at, '', '', updated_at, closed_at, '', external_ref, compaction_level, compacted_at, original_size, compacted_at_commit, source_repo, '', NULL, '', '', '', '', 0, 0, 0, '', '', 0, '', '', '', '', NULL, '', '', '', '', '', '', '', NULL, NULL FROM issues_backup; INSERT INTO issues SELECT id, title, description, design, acceptance_criteria, notes, status, priority, issue_type, assignee, estimated_minutes, created_at, '', '', updated_at, closed_at, '', external_ref, compaction_level, compacted_at, original_size, compacted_at_commit, source_repo, '', NULL, '', '', '', '', 0, 0, 0, 0, '', '', 0, '', '', '', '', NULL, '', '', '', '', '', '', '', NULL, NULL FROM issues_backup;
DROP TABLE issues_backup; DROP TABLE issues_backup;
`) `)
if err != nil { if err != nil {

View File

@@ -154,7 +154,7 @@ func (s *SQLiteStorage) GetReadyWork(ctx context.Context, filter types.WorkFilte
i.status, i.priority, i.issue_type, i.assignee, i.estimated_minutes, i.status, i.priority, i.issue_type, i.assignee, i.estimated_minutes,
i.created_at, i.created_by, i.owner, i.updated_at, i.closed_at, i.external_ref, i.source_repo, i.close_reason, i.created_at, i.created_by, i.owner, i.updated_at, i.closed_at, i.external_ref, i.source_repo, i.close_reason,
i.deleted_at, i.deleted_by, i.delete_reason, i.original_type, i.deleted_at, i.deleted_by, i.delete_reason, i.original_type,
i.sender, i.ephemeral, i.pinned, i.is_template, i.sender, i.ephemeral, i.pinned, i.is_template, i.crystallizes,
i.await_type, i.await_id, i.timeout_ns, i.waiters i.await_type, i.await_id, i.timeout_ns, i.waiters
FROM issues i FROM issues i
WHERE %s WHERE %s
@@ -746,7 +746,7 @@ func (s *SQLiteStorage) GetNewlyUnblockedByClose(ctx context.Context, closedIssu
i.status, i.priority, i.issue_type, i.assignee, i.estimated_minutes, i.status, i.priority, i.issue_type, i.assignee, i.estimated_minutes,
i.created_at, i.created_by, i.owner, i.updated_at, i.closed_at, i.external_ref, i.source_repo, i.close_reason, i.created_at, i.created_by, i.owner, i.updated_at, i.closed_at, i.external_ref, i.source_repo, i.close_reason,
i.deleted_at, i.deleted_by, i.delete_reason, i.original_type, i.deleted_at, i.deleted_by, i.delete_reason, i.original_type,
i.sender, i.ephemeral, i.pinned, i.is_template, i.sender, i.ephemeral, i.pinned, i.is_template, i.crystallizes,
i.await_type, i.await_id, i.timeout_ns, i.waiters i.await_type, i.await_id, i.timeout_ns, i.waiters
FROM issues i FROM issues i
JOIN dependencies d ON i.id = d.issue_id JOIN dependencies d ON i.id = d.issue_id

View File

@@ -45,8 +45,6 @@ CREATE TABLE IF NOT EXISTS issues (
work_type TEXT DEFAULT 'mutex', work_type TEXT DEFAULT 'mutex',
-- HOP quality score field (0.0-1.0, set by Refineries on merge) -- HOP quality score field (0.0-1.0, set by Refineries on merge)
quality_score REAL, quality_score REAL,
-- Work economics field (Decision 006) - compounds vs evaporates
crystallizes INTEGER DEFAULT 0,
-- Federation source system field -- Federation source system field
source_system TEXT DEFAULT '', source_system TEXT DEFAULT '',
-- Event fields (bd-ecmd) -- Event fields (bd-ecmd)

View File

@@ -1259,7 +1259,7 @@ func (t *sqliteTxStorage) SearchIssues(ctx context.Context, query string, filter
created_at, created_by, owner, updated_at, closed_at, external_ref, created_at, created_by, owner, updated_at, closed_at, external_ref,
compaction_level, compacted_at, compacted_at_commit, original_size, source_repo, close_reason, compaction_level, compacted_at, compacted_at_commit, original_size, source_repo, close_reason,
deleted_at, deleted_by, delete_reason, original_type, deleted_at, deleted_by, delete_reason, original_type,
sender, ephemeral, pinned, is_template, sender, ephemeral, pinned, is_template, crystallizes,
await_type, await_id, timeout_ns, waiters await_type, await_id, timeout_ns, waiters
FROM issues FROM issues
%s %s