feat(sync): add deterministic maintenance-thread dedup key

This commit is contained in:
Gabriel Brown
2026-07-11 13:48:49 -04:00
parent 4684617fed
commit c3f73ac656
3 changed files with 69 additions and 1 deletions
@@ -0,0 +1,21 @@
/**
* Pure, deterministic dedup key for maintenance threads.
*
* Derives a stable key from the merge-base + head SHAs so that repeated
* scheduled sync runs against the same upstream state collapse onto a single
* maintenance thread instead of creating a new one each run. NEVER involves
* Date.now()/random — the key must be identical for identical inputs.
*
* Returns `null` when the head SHA is missing/empty (unresolvable head → the
* caller cannot dedup and should SKIP thread creation rather than mint a
* unique key).
*/
export const maintenanceDedupKey = (input: {
mergeBaseSha?: string;
headSha?: string;
}): string | null => {
const head = input.headSha?.trim();
if (!head) return null;
const base = input.mergeBaseSha?.trim() || 'nobase';
return `${base}:${head}`;
};
+3 -1
View File
@@ -797,6 +797,7 @@ const applicationTables = {
),
ignoredCommitShas: v.optional(v.array(v.string())),
ignoredReason: v.optional(v.string()),
dedupKey: v.optional(v.string()),
createdAt: v.number(),
updatedAt: v.number(),
resolvedAt: v.optional(v.number()),
@@ -805,7 +806,8 @@ const applicationTables = {
.index('by_owner_status', ['ownerId', 'status'])
.index('by_spoon', ['spoonId'])
.index('by_source', ['ownerId', 'source'])
.index('by_created', ['createdAt']),
.index('by_created', ['createdAt'])
.index('by_spoon_dedup', ['spoonId', 'dedupKey']),
threadMessages: defineTable({
threadId: v.id('threads'),
ownerId: v.id('users'),