From 9d7e28947e55652996c0bb794783cf58ffae7e7b Mon Sep 17 00:00:00 2001 From: John Fawcett Date: Wed, 15 Apr 2026 19:22:54 +0000 Subject: [PATCH] feat(gastown): add auto_resolve_merge_conflicts setting to schemas and UI - Add auto_resolve_merge_conflicts to TownConfigSchema refinery sub-object (default: true) - Add auto_resolve_merge_conflicts to RigOverrideConfigSchema - Add auto_resolve_merge_conflicts to TownConfigUpdateSchema - Wire auto_resolve_merge_conflicts into EffectiveConfig and resolveRigConfig() - Wire into updateTownConfig() refinery merge path - Add toggle to town settings Refinery section (TownSettingsPageClient.tsx) - Add toggle to rig settings Refinery section (RigSettingsPageClient.tsx) with inherit-from-town pattern --- .../settings/RigSettingsPageClient.tsx | 45 +++++++++++++++++++ .../settings/TownSettingsPageClient.tsx | 17 +++++++ services/gastown/src/dos/town/config.ts | 9 ++++ services/gastown/src/types.ts | 5 +++ 4 files changed, 76 insertions(+) diff --git a/apps/web/src/app/(app)/gastown/[townId]/rigs/[rigId]/settings/RigSettingsPageClient.tsx b/apps/web/src/app/(app)/gastown/[townId]/rigs/[rigId]/settings/RigSettingsPageClient.tsx index f7e05bd14d..61621384ad 100644 --- a/apps/web/src/app/(app)/gastown/[townId]/rigs/[rigId]/settings/RigSettingsPageClient.tsx +++ b/apps/web/src/app/(app)/gastown/[townId]/rigs/[rigId]/settings/RigSettingsPageClient.tsx @@ -112,6 +112,9 @@ export function RigSettingsPageClient({ townId, rigId, organizationId }: Props) const [autoResolvePrFeedback, setAutoResolvePrFeedback] = useState( undefined ); + const [autoResolveMergeConflicts, setAutoResolveMergeConflicts] = useState( + undefined + ); const [autoMergeDelayMinutes, setAutoMergeDelayMinutes] = useState( undefined ); @@ -136,6 +139,7 @@ export function RigSettingsPageClient({ townId, rigId, organizationId }: Props) setRefineryCodeReview(cfg.code_review); setReviewMode(cfg.review_mode); setAutoResolvePrFeedback(cfg.auto_resolve_pr_feedback); + setAutoResolveMergeConflicts(cfg.auto_resolve_merge_conflicts); setAutoMergeDelayMinutes(cfg.auto_merge_delay_minutes); setMergeStrategy(cfg.merge_strategy); setConvoyMergeMode(cfg.convoy_merge_mode); @@ -183,6 +187,7 @@ export function RigSettingsPageClient({ townId, rigId, organizationId }: Props) code_review: refineryCodeReview, review_mode: reviewMode, auto_resolve_pr_feedback: autoResolvePrFeedback, + auto_resolve_merge_conflicts: autoResolveMergeConflicts, auto_merge_delay_minutes: autoMergeDelayMinutes, merge_strategy: mergeStrategy, convoy_merge_mode: convoyMergeMode, @@ -505,6 +510,46 @@ export function RigSettingsPageClient({ townId, rigId, organizationId }: Props) +
+
+
+ +

+ When a PR has merge conflicts, automatically dispatch an agent to rebase + and resolve them. + {townCfg?.refinery?.auto_resolve_merge_conflicts !== undefined && ( + + (Town default:{' '} + {townCfg.refinery.auto_resolve_merge_conflicts ? 'on' : 'off'}) + + )} +

+
+
+ {autoResolveMergeConflicts !== undefined && ( + + )} + setAutoResolveMergeConflicts(v)} + className={autoResolveMergeConflicts === undefined ? 'opacity-40' : ''} + /> +
+
+
+
+
+
+ +

+ When a PR has merge conflicts, automatically dispatch an agent to rebase and + resolve them. +

+
+ +
+ {autoResolvePrFeedback && (
diff --git a/services/gastown/src/dos/town/config.ts b/services/gastown/src/dos/town/config.ts index 156211115a..403d77fd75 100644 --- a/services/gastown/src/dos/town/config.ts +++ b/services/gastown/src/dos/town/config.ts @@ -89,6 +89,10 @@ export async function updateTownConfig( update.refinery.auto_resolve_pr_feedback ?? current.refinery?.auto_resolve_pr_feedback ?? false, + auto_resolve_merge_conflicts: + update.refinery.auto_resolve_merge_conflicts ?? + current.refinery?.auto_resolve_merge_conflicts ?? + true, auto_merge_delay_minutes: update.refinery.auto_merge_delay_minutes !== undefined ? update.refinery.auto_merge_delay_minutes @@ -191,6 +195,7 @@ export type EffectiveConfig = { review_mode: 'rework' | 'comments'; code_review: boolean; auto_resolve_pr_feedback: boolean; + auto_resolve_merge_conflicts: boolean; auto_merge_delay_minutes: number | null; merge_strategy: MergeStrategy; convoy_merge_mode: 'review-then-land' | 'review-and-merge'; @@ -227,6 +232,10 @@ export function resolveRigConfig( rigOverride?.auto_resolve_pr_feedback ?? townConfig.refinery?.auto_resolve_pr_feedback ?? false, + auto_resolve_merge_conflicts: + rigOverride?.auto_resolve_merge_conflicts ?? + townConfig.refinery?.auto_resolve_merge_conflicts ?? + true, auto_merge_delay_minutes: rigOverride?.auto_merge_delay_minutes !== undefined ? rigOverride.auto_merge_delay_minutes diff --git a/services/gastown/src/types.ts b/services/gastown/src/types.ts index 7579a4810d..654be91810 100644 --- a/services/gastown/src/types.ts +++ b/services/gastown/src/types.ts @@ -275,6 +275,9 @@ export const TownConfigSchema = z.object({ /** When enabled, a polecat is automatically dispatched to address * unresolved review comments and failing CI checks on open PRs. */ auto_resolve_pr_feedback: z.boolean().default(false), + /** When enabled, a polecat is automatically dispatched to rebase and + * resolve merge conflicts on open PRs. */ + auto_resolve_merge_conflicts: z.boolean().default(true).optional(), /** After all CI checks pass and all review threads are resolved, * automatically merge the PR after this many minutes. * 0 = immediate, null = disabled (require manual merge). */ @@ -347,6 +350,7 @@ export const RigOverrideConfigSchema = z.object({ /** false = skip refinery entirely */ code_review: z.boolean().optional(), auto_resolve_pr_feedback: z.boolean().optional(), + auto_resolve_merge_conflicts: z.boolean().optional(), auto_merge_delay_minutes: z.number().int().min(0).nullable().optional(), // Merge strategy @@ -412,6 +416,7 @@ export const TownConfigUpdateSchema = z.object({ code_review: z.boolean().optional(), review_mode: z.enum(['rework', 'comments']).optional(), auto_resolve_pr_feedback: z.boolean().optional(), + auto_resolve_merge_conflicts: z.boolean().optional(), auto_merge_delay_minutes: z.number().int().min(0).nullable().optional(), }) .optional(),