Added `resetFailedCheckRun` flag (#5148)
Added `resetFailedCheckRun` flag.
Deleted `unifiedCheckRunFlow` flag as no longer needed.
in scope of https://github.com/flutter/flutter/issues/191737
diff --git a/app_dart/config.yaml b/app_dart/config.yaml
index 275a1ff..12285c6 100644
--- a/app_dart/config.yaml
+++ b/app_dart/config.yaml
@@ -28,19 +28,12 @@
# The Gemini model to use for log analysis.
geminiModel: gemini-3-flash-preview
-# Whether to allow unified check run flow to specific users or to everyone.
-unifiedCheckRunFlow:
- useForAll: true
+# Whether to allow reset failed check run back to in progress to specific users or to everyone.
+resetFailedCheckRun:
+ useForAll: false
useForUsers:
- ievdokdm
- eyebrowsoffire
- - andywolff
- - camsim99
- - walley892
- - loic-sharma
- - vashworth
- - mboetger
- - justinmc
# Whether to process LUCI notifications of builds progress ordered within check run.
orderedPresubmit:
diff --git a/app_dart/lib/src/generated_config.dart b/app_dart/lib/src/generated_config.dart
index 8337901..cc1804e 100644
--- a/app_dart/lib/src/generated_config.dart
+++ b/app_dart/lib/src/generated_config.dart
@@ -32,19 +32,12 @@
# The Gemini model to use for log analysis.
geminiModel: gemini-3-flash-preview
-# Whether to allow unified check run flow to specific users or to everyone.
-unifiedCheckRunFlow:
- useForAll: true
+# Whether to allow reset failed check run back to in progress to specific users or to everyone.
+resetFailedCheckRun:
+ useForAll: false
useForUsers:
- ievdokdm
- eyebrowsoffire
- - andywolff
- - camsim99
- - walley892
- - loic-sharma
- - vashworth
- - mboetger
- - justinmc
# Whether to process LUCI notifications of builds progress ordered within check run.
orderedPresubmit:
diff --git a/app_dart/lib/src/service/flags/dynamic_config.dart b/app_dart/lib/src/service/flags/dynamic_config.dart
index 0e73507..c5a8a0a 100644
--- a/app_dart/lib/src/service/flags/dynamic_config.dart
+++ b/app_dart/lib/src/service/flags/dynamic_config.dart
@@ -15,7 +15,7 @@
import 'content_aware_hashing_flags.dart';
import 'dynamic_config_updater.dart';
import 'ordered_presubmit_flags.dart';
-import 'unified_check_run_flow_flags.dart';
+import 'reset_failed_check_run.dart';
part 'dynamic_config.g.dart';
@@ -39,7 +39,7 @@
contentAwareHashing: ContentAwareHashing.defaultInstance,
closeMqGuardAfterPresubmit: false,
enableGeminiLogAnalysis: false,
- unifiedCheckRunFlow: UnifiedCheckRunFlow.defaultInstance,
+ resetFailedCheckRun: ResetFailedCheckRun.defaultInstance,
orderedPresubmit: OrderedPresubmit.defaultInstance,
dynamicTestSuppression: false,
geminiModel: 'gemini-3-flash-preview',
@@ -69,9 +69,9 @@
@JsonKey()
final bool enableGeminiLogAnalysis;
- /// Flags related tp unified check-run flow configuration.
+ /// Flags related to checks suite flow.
@JsonKey()
- final UnifiedCheckRunFlow unifiedCheckRunFlow;
+ final ResetFailedCheckRun resetFailedCheckRun;
/// Flags related to ordered presubmit configuration.
@JsonKey()
@@ -91,7 +91,7 @@
required this.contentAwareHashing,
required this.closeMqGuardAfterPresubmit,
required this.enableGeminiLogAnalysis,
- required this.unifiedCheckRunFlow,
+ required this.resetFailedCheckRun,
required this.orderedPresubmit,
required this.dynamicTestSuppression,
required this.geminiModel,
@@ -106,7 +106,7 @@
ContentAwareHashing? contentAwareHashing,
bool? closeMqGuardAfterPresubmit,
bool? enableGeminiLogAnalysis,
- UnifiedCheckRunFlow? unifiedCheckRunFlow,
+ ResetFailedCheckRun? resetFailedCheckRun,
OrderedPresubmit? orderedPresubmit,
bool? dynamicTestSuppression,
String? geminiModel,
@@ -122,8 +122,8 @@
defaultInstance.closeMqGuardAfterPresubmit,
enableGeminiLogAnalysis:
enableGeminiLogAnalysis ?? defaultInstance.enableGeminiLogAnalysis,
- unifiedCheckRunFlow:
- unifiedCheckRunFlow ?? defaultInstance.unifiedCheckRunFlow,
+ resetFailedCheckRun:
+ resetFailedCheckRun ?? defaultInstance.resetFailedCheckRun,
orderedPresubmit: orderedPresubmit ?? defaultInstance.orderedPresubmit,
dynamicTestSuppression:
dynamicTestSuppression ?? defaultInstance.dynamicTestSuppression,
@@ -159,11 +159,14 @@
/// The inverse operation of [DynamicConfig.fromJson].
Map<String, Object?> toJson() => _$DynamicConfigToJson(this);
- bool isUnifiedCheckRunFlowEnabledForUser(String githubUsername) {
- if (unifiedCheckRunFlow.useForAll) {
+ bool isResetFailedCheckRunEnabledForUser(String githubUsername) {
+ if (resetFailedCheckRun.useForAll) {
return true;
}
- return unifiedCheckRunFlow.useForUsers.contains(githubUsername);
+ final usernameLower = githubUsername.toLowerCase();
+ return resetFailedCheckRun.useForUsers.any(
+ (user) => user.toLowerCase() == usernameLower,
+ );
}
bool isOrderedPresubmitEnabledForUser(String githubUsername) {
diff --git a/app_dart/lib/src/service/flags/dynamic_config.g.dart b/app_dart/lib/src/service/flags/dynamic_config.g.dart
index d958c97..b5fdb15 100644
--- a/app_dart/lib/src/service/flags/dynamic_config.g.dart
+++ b/app_dart/lib/src/service/flags/dynamic_config.g.dart
@@ -21,10 +21,10 @@
),
closeMqGuardAfterPresubmit: json['closeMqGuardAfterPresubmit'] as bool?,
enableGeminiLogAnalysis: json['enableGeminiLogAnalysis'] as bool?,
- unifiedCheckRunFlow: json['unifiedCheckRunFlow'] == null
+ resetFailedCheckRun: json['resetFailedCheckRun'] == null
? null
- : UnifiedCheckRunFlow.fromJson(
- json['unifiedCheckRunFlow'] as Map<String, dynamic>?,
+ : ResetFailedCheckRun.fromJson(
+ json['resetFailedCheckRun'] as Map<String, dynamic>?,
),
orderedPresubmit: json['orderedPresubmit'] == null
? null
@@ -42,7 +42,7 @@
'ciYaml': instance.ciYaml.toJson(),
'closeMqGuardAfterPresubmit': instance.closeMqGuardAfterPresubmit,
'enableGeminiLogAnalysis': instance.enableGeminiLogAnalysis,
- 'unifiedCheckRunFlow': instance.unifiedCheckRunFlow.toJson(),
+ 'resetFailedCheckRun': instance.resetFailedCheckRun.toJson(),
'orderedPresubmit': instance.orderedPresubmit.toJson(),
'dynamicTestSuppression': instance.dynamicTestSuppression,
'geminiModel': instance.geminiModel,
diff --git a/app_dart/lib/src/service/flags/reset_failed_check_run.dart b/app_dart/lib/src/service/flags/reset_failed_check_run.dart
new file mode 100644
index 0000000..7ca8303
--- /dev/null
+++ b/app_dart/lib/src/service/flags/reset_failed_check_run.dart
@@ -0,0 +1,54 @@
+// Copyright 2026 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:json_annotation/json_annotation.dart';
+import 'package:meta/meta.dart';
+
+part 'reset_failed_check_run.g.dart';
+
+/// Flag that controls whether to reset failed check run to in progress.
+@JsonSerializable()
+@immutable
+final class ResetFailedCheckRun {
+ /// Default configuration for [ResetFailedCheckRun].
+ static const defaultInstance = ResetFailedCheckRun._(
+ useForAll: false,
+ useForUsers: [],
+ );
+
+ /// Whether to to reset failed check run to in progress for all users.
+ @JsonKey()
+ final bool useForAll;
+
+ /// List of users to to reset failed check run to in progress.
+ @JsonKey()
+ final List<String> useForUsers;
+
+ const ResetFailedCheckRun._({
+ required this.useForAll,
+ required this.useForUsers,
+ });
+
+ /// Creates [ResetFailedCheckRun] flags from the provided fields.
+ ///
+ /// Any omitted fields default to the values in [defaultInstance].
+ factory ResetFailedCheckRun({bool? useForAll, List<String>? useForUsers}) {
+ return ResetFailedCheckRun._(
+ useForAll: useForAll ?? defaultInstance.useForAll,
+ useForUsers: useForUsers != null
+ ? List<String>.unmodifiable(useForUsers)
+ : defaultInstance.useForUsers,
+ );
+ }
+
+ /// Creates [ResetFailedCheckRun] flags from a [json] object.
+ ///
+ /// Any omitted fields default to the values in [defaultInstance].
+ factory ResetFailedCheckRun.fromJson(Map<String, Object?>? json) {
+ return _$ResetFailedCheckRunFromJson(json ?? {});
+ }
+
+ /// The inverse operation of [ResetFailedCheckRun.fromJson].
+ Map<String, Object?> toJson() => _$ResetFailedCheckRunToJson(this);
+}
diff --git a/app_dart/lib/src/service/flags/unified_check_run_flow_flags.g.dart b/app_dart/lib/src/service/flags/reset_failed_check_run.g.dart
similarity index 72%
rename from app_dart/lib/src/service/flags/unified_check_run_flow_flags.g.dart
rename to app_dart/lib/src/service/flags/reset_failed_check_run.g.dart
index 7c8879f..39ecc2d 100644
--- a/app_dart/lib/src/service/flags/unified_check_run_flow_flags.g.dart
+++ b/app_dart/lib/src/service/flags/reset_failed_check_run.g.dart
@@ -2,22 +2,22 @@
// ignore_for_file: always_specify_types, implicit_dynamic_parameter
-part of 'unified_check_run_flow_flags.dart';
+part of 'reset_failed_check_run.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
-UnifiedCheckRunFlow _$UnifiedCheckRunFlowFromJson(Map<String, dynamic> json) =>
- UnifiedCheckRunFlow(
+ResetFailedCheckRun _$ResetFailedCheckRunFromJson(Map<String, dynamic> json) =>
+ ResetFailedCheckRun(
useForAll: json['useForAll'] as bool?,
useForUsers: (json['useForUsers'] as List<dynamic>?)
?.map((e) => e as String)
.toList(),
);
-Map<String, dynamic> _$UnifiedCheckRunFlowToJson(
- UnifiedCheckRunFlow instance,
+Map<String, dynamic> _$ResetFailedCheckRunToJson(
+ ResetFailedCheckRun instance,
) => <String, dynamic>{
'useForAll': instance.useForAll,
'useForUsers': instance.useForUsers,
diff --git a/app_dart/lib/src/service/flags/unified_check_run_flow_flags.dart b/app_dart/lib/src/service/flags/unified_check_run_flow_flags.dart
deleted file mode 100644
index 85cfc47..0000000
--- a/app_dart/lib/src/service/flags/unified_check_run_flow_flags.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2025 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:json_annotation/json_annotation.dart';
-import 'package:meta/meta.dart';
-
-part 'unified_check_run_flow_flags.g.dart';
-
-/// Flags related to content-aware hashing.
-@JsonSerializable()
-@immutable
-final class UnifiedCheckRunFlow {
- /// Default configuration for [UnifiedCheckRunFlow] flags.
- static const defaultInstance = UnifiedCheckRunFlow._(
- useForAll: false,
- useForUsers: [],
- );
-
- /// Whether to use unified check-run flow with only one check-run created
- /// for all LUCI tests or github check-run flow.
- @JsonKey()
- final bool useForAll;
-
- /// List of users to use unified check-run flow.
- @JsonKey()
- final List<String> useForUsers;
-
- const UnifiedCheckRunFlow._({
- required this.useForAll, //
- required this.useForUsers, //
- });
-
- /// Creates [UnifiedCheckRunFlow] flags from the provided fields.
- ///
- /// Any omitted fields default to the values in [defaultInstance].
- factory UnifiedCheckRunFlow({bool? useForAll, List<String>? useForUsers}) {
- return UnifiedCheckRunFlow._(
- useForAll: useForAll ?? defaultInstance.useForAll,
- useForUsers: useForUsers ?? defaultInstance.useForUsers,
- );
- }
-
- /// Creates [UnifiedCheckRunFlow] flags from a [json] object.
- ///
- /// Any omitted fields default to the values in [defaultInstance].
- factory UnifiedCheckRunFlow.fromJson(Map<String, Object?>? json) {
- return _$UnifiedCheckRunFlowFromJson(json ?? {});
- }
-
- /// The inverse operation of [UnifiedCheckRunFlow.fromJson].
- Map<String, Object?> toJson() => _$UnifiedCheckRunFlowToJson(this);
-}