| 99 | * cleanup would silently drop user-visible changes. |
| 100 | */ |
| 101 | export function wantedRowsEquivalent(a: WantedRow | null, b: WantedRow | null): boolean { |
| 102 | if (a === null || b === null) return a === b; |
| 103 | return ( |
| 104 | a.id === b.id && |
| 105 | a.title === b.title && |
| 106 | a.description === b.description && |
| 107 | a.project === b.project && |
| 108 | a.type === b.type && |
| 109 | a.priority === b.priority && |
| 110 | JSON.stringify(a.tags) === JSON.stringify(b.tags) && |
| 111 | a.posted_by === b.posted_by && |
| 112 | a.claimed_by === b.claimed_by && |
| 113 | a.status === b.status && |
| 114 | a.effort_level === b.effort_level && |
| 115 | a.evidence_url === b.evidence_url && |
| 116 | a.sandbox_required === b.sandbox_required && |
| 117 | JSON.stringify(a.sandbox_scope) === JSON.stringify(b.sandbox_scope) && |
| 118 | a.sandbox_min_tier === b.sandbox_min_tier && |
| 119 | a.created_at === b.created_at |
| 120 | ); |
| 121 | } |
| 122 | |
| 123 | const HeadRow = z.object({ h: z.string() }).passthrough(); |
| 124 | |