Repository: dart-lang/pana (dart)

Issue:
Pana does not respect formatter rules from analysis options in lint packages
# Description
Running pana on a Dart package (^3.8.0) with a lint package that depends on a linter package configuring `trailing_commas: preserve` returns the following output:

```
## ✗ Pass static analysis (40 / 50)
### [~] 40/50 points: code has no errors, warnings, lints, or formatting issues

<details>
<summary>
/private/var/folders/g2/tbck_xp929j_lxjk6d79trwr0000gp/T/pana_aPI6ZQ/lib/my_package.dart doesn't match the Dart formatter.
</summary>

To format your files run: `dart format .`
</details>
```

Overriding the setting in the package's own `analysis_options.yaml` and setting `trailing_commas: preserve`  there returns the following output:
```
## ✓ Pass static analysis (50 / 50)
### [*] 50/50 points: code has no errors, warnings, lints, or formatting issues
```

# Current behavoiur
Receiving only 40/50 points.

# Expected behaviour
Receiving 50/50 points without setting `trailing_commas: preserve` to the package's own `analysis_options.yaml`.

# Steps to reproduce
1. Create a new Dart package my_linter with SDK constraint ^3.8.0.
2. Create an analysis_options.yanl with the follwing as content inside lib
```yaml
formatter:
  trailing_commas: preserve
```
3. Create another package my_package with SDK constraint ^3.8.0.
4. Add my_linter to dev_dependencies
5. Put the following content inside my_package.dart
```dart
void foo(
  int a,
  int b,
) {}
```
6. Run the following command inside my_package
```sh
dart pub global run pana .
```

Pull request description:
Fixes #1459.

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a641a24bf..e914360f1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
 ## 0.22.24
 
 - Fixed small ambiguity in the order of license match evaluation.
+- Resolve `analysis_options.yaml` dev dependency to expose transitive formatter options.
 
 ## 0.22.23
 
diff --git a/lib/src/analysis_options.dart b/lib/src/analysis_options.dart
index b577366aa..dbb5c7c68 100644
--- a/lib/src/analysis_options.dart
+++ b/lib/src/analysis_options.dart
@@ -74,6 +74,7 @@ const _analyzerErrorKeys = <String>['uri_has_not_been_generated'];
 String updatePassthroughOptions({
   required String? original,
   required String custom,
+  bool keepInclude = false,
 }) {
   Map? origMap;
   if (original != null) {
@@ -121,5 +122,12 @@ String updatePassthroughOptions({
     customFormatter.addAll(origFormatter.cast<String, dynamic>());
   }
 
+  if (keepInclude) {
+    final newInclude = customMap['include'] ?? origMap['include'];
+    if (newInclude != null) {
+      customMap['include'] = newInclude;
+    }
+  }
+
   return json.encode(customMap);
 }
diff --git a/lib/src/sdk_env.dart b/lib/src/sdk_env.dart
index 2fdaea501..ac213b126 100644
--- a/lib/src/sdk_env.dart
+++ b/lib/src/sdk_env.dart
@@ -217,6 +217,7 @@ class ToolEnvironment {
     final customOptionsContent = updatePassthroughOptions(
       original: originalOptions,
       custom: rawOptionsContent,
+      keepInclude: true,
     );
     try {
       await analysisOptionsFile.writeAsString(customOptionsContent);
@@ -285,6 +286,8 @@ class ToolEnvironment {
       return const [];
     }
     return withRestrictedAnalysisOptions(packageDir, () async {
+      await runPub(packageDir, usesFlutter: usesFlutter, command: 'get');
+
       final files = <String>{};
       for (final dir in dirs) {
         final fullPath = p.join(packageDir, dir);
@@ -610,10 +613,48 @@ class ToolEnvironment {
       p.join(packageDir, 'pana-${now.millisecondsSinceEpoch}-pubspec.yaml'),
     );
 
+    // extract the package name from the `include: package:<package>/path.yaml` entry in analysis options:
+    String? includedPackage;
+    final analysisOptionsFile = File(
+      p.join(packageDir, 'analysis_options.yaml'),
+    );
+    if (await analysisOptionsFile.exists()) {
+      final analysisOptions = await analysisOptionsFile.readAsString();
+      final parsed = yamlToJson(analysisOptions);
+      final includeValue = parsed?['include'];
+      if (includeValue is String) {
+        final include = includeValue.trim();
+        if (include.startsWith('package:')) {
+          includedPackage = include
+              .substring('package:'.length)
+              .split('/')
+              .first;
+        }
+      }
+    }
+
     final pubspec = File(p.join(packageDir, 'pubspec.yaml'));
     final original = await pubspec.readAsString();
     final parsed = yamlToJson(original) ?? <String, dynamic>{};
-    parsed.remove('dev_dependencies');
+    final oldDevDependencies = parsed.remove('dev_dependencies');
+    if (oldDevDependencies is Map<String, dynamic>) {
+      final keptDevDependencies = <String, dynamic>{};
+      for (final name in oldDevDependencies.keys) {
+        if (name != includedPackage) continue;
+        final value = oldDevDependencies[name];
+        var passthrough = true;
+        if (value is Map &&
+            (value.containsKey('path') || value.containsKey('git'))) {
+          passthrough = false;
+        }
+        if (passthrough) {
+          keptDevDependencies[name] = value;
+        }
+      }
+      if (keptDevDependencies.isNotEmpty) {
+        parsed['dev_dependencies'] = keptDevDependencies;
+      }
+    }
     parsed.remove('dependency_overrides');
     parsed.remove('workspace');
     parsed.remove('resolution');


Test patch:
diff --git a/test/analysis_options_test.dart b/test/analysis_options_test.dart
index b7ebcbc00..aaf768eee 100644
--- a/test/analysis_options_test.dart
+++ b/test/analysis_options_test.dart
@@ -54,4 +54,63 @@ formatter:
       },
     });
   });
+
+  test('ignore include in original', () {
+    final content = updatePassthroughOptions(
+      original: 'include: package:lints/other.yaml',
+      custom: '',
+    );
+    expect(json.decode(content), <String, Object?>{});
+  });
+
+  test('include only in custom: keepInclude=false', () {
+    final content = updatePassthroughOptions(
+      original: '',
+      custom: 'include: package:lints/other.yaml',
+    );
+    expect(json.decode(content), <String, Object?>{
+      'include': 'package:lints/other.yaml',
+    });
+  });
+
+  test('include only in custom: keepInclude=true', () {
+    final content = updatePassthroughOptions(
+      original: '',
+      custom: 'include: package:lints/other.yaml',
+    );
+    expect(json.decode(content), <String, Object?>{
+      'include': 'package:lints/other.yaml',
+    });
+  });
+
+  test('keep include preserves the value', () {
+    final content = updatePassthroughOptions(
+      original: 'include: package:lints/other.yaml',
+      custom: '',
+      keepInclude: true,
+    );
+    expect(json.decode(content), <String, Object?>{
+      'include': 'package:lints/other.yaml',
+    });
+  });
+
+  test('keep include does not override the value', () {
+    final content = updatePassthroughOptions(
+      original: 'include: package:lints/other.yaml',
+      custom: 'include: package:lints/core.yaml',
+      keepInclude: true,
+    );
+    expect(json.decode(content), <String, Object?>{
+      'include': 'package:lints/core.yaml',
+    });
+  });
+
+  test('keep include without include value', () {
+    final content = updatePassthroughOptions(
+      original: '',
+      custom: '',
+      keepInclude: true,
+    );
+    expect(json.decode(content), <String, Object?>{});
+  });
 }
diff --git a/test/end2end_light_test.dart b/test/end2end_light_test.dart
index d951b5102..25c63523a 100644
--- a/test/end2end_light_test.dart
+++ b/test/end2end_light_test.dart
@@ -2,51 +2,32 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:io';
-
-import 'package:pana/pana.dart';
-import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 
+import 'env_utils.dart';
+
 void main() {
   void verifyPackage(String package) {
     group('end2end light: $package', () {
-      late String tempDir;
-      late PackageAnalyzer analyzer;
+      late TestEnv testEnv;
 
       setUpAll(() async {
-        tempDir = Directory.systemTemp
-            .createTempSync('pana-test')
-            .resolveSymbolicLinksSync();
-        final pubCacheDir = p.join(tempDir, 'pub-cache');
-        final dartConfigDir = p.join(tempDir, 'config', 'dart');
-        final flutterConfigDir = p.join(tempDir, 'config', 'flutter');
-        Directory(pubCacheDir).createSync();
-        Directory(dartConfigDir).createSync(recursive: true);
-        Directory(flutterConfigDir).createSync(recursive: true);
-        analyzer = PackageAnalyzer(
-          await ToolEnvironment.create(
-            dartSdkConfig: SdkConfig(configHomePath: dartConfigDir),
-            flutterSdkConfig: SdkConfig(configHomePath: flutterConfigDir),
-            pubCacheDir: pubCacheDir,
-            dartdocVersion: 'any',
-          ),
-        );
+        testEnv = await TestEnv.createTemp();
       });
 
       tearDownAll(() async {
-        Directory(tempDir).deleteSync(recursive: true);
+        await testEnv.close();
       });
 
       test('analysis', () async {
-        final summary = await analyzer.inspectPackage(package);
+        final summary = await testEnv.analyzer.inspectPackage(package);
         expect(summary.report, isNotNull);
         expect(summary.allDependencies!, isNotEmpty);
         expect(summary.tags!, isNotEmpty);
         expect(summary.tags, contains('is:dart3-compatible'));
         expect(
           summary.report!.grantedPoints,
-          greaterThanOrEqualTo(summary.report!.maxPoints - 20),
+          greaterThanOrEqualTo(summary.report!.maxPoints - 30),
         );
       }, timeout: const Timeout.factor(4));
     });
diff --git a/test/end2end_test.dart b/test/end2end_test.dart
index afe4933f6..9e2e273f4 100644
--- a/test/end2end_test.dart
+++ b/test/end2end_test.dart
@@ -5,17 +5,14 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:http/http.dart' as http;
 import 'package:pana/pana.dart';
 import 'package:path/path.dart' as p;
-import 'package:shelf/shelf.dart' as shelf;
-import 'package:shelf/shelf_io.dart';
 import 'package:test/test.dart';
 
+import 'env_utils.dart';
 import 'golden_file.dart';
 
 final _goldenDir = p.join('test', 'goldens', 'end2end');
-final _pubDevUri = Uri.parse('https://pub.dartlang.org/');
 
 void main() {
   void verifyPackage(
@@ -25,50 +22,28 @@ void main() {
   }) {
     final filename = '$package-$version.json';
     group('end2end: $package $version', () {
-      late String tempDir;
-      late PackageAnalyzer analyzer;
-      http.Client? httpClient;
-      late HttpServer httpServer;
+      late TestEnv testEnv;
       late final Map<String, Object?> actualMap;
 
       setUpAll(() async {
-        tempDir = Directory.systemTemp
-            .createTempSync('pana-test')
-            .resolveSymbolicLinksSync();
-        final pubCacheDir = p.join(tempDir, 'pub-cache');
-        final panaCacheDir = p.join(tempDir, 'pana-cache');
-        final dartConfigDir = p.join(tempDir, 'config', 'dart');
-        final flutterConfigDir = p.join(tempDir, 'config', 'flutter');
         final goldenDirLastModified = await _detectGoldenLastModified();
-        Directory(pubCacheDir).createSync();
-        Directory(panaCacheDir).createSync();
-        Directory(dartConfigDir).createSync(recursive: true);
-        Directory(flutterConfigDir).createSync(recursive: true);
-        httpClient = http.Client();
-        httpServer = await _startLocalProxy(
-          httpClient: httpClient,
-          blockPublishAfter: goldenDirLastModified,
-        );
-        analyzer = PackageAnalyzer(
-          await ToolEnvironment.create(
-            dartSdkConfig: SdkConfig(configHomePath: dartConfigDir),
-            flutterSdkConfig: SdkConfig(configHomePath: flutterConfigDir),
-            pubCacheDir: pubCacheDir,
-            pubHostedUrl: 'http://127.0.0.1:${httpServer.port}',
-            // TODO: revert to 'any' after SDK 3.6 is out
-            dartdocVersion: '^8.3.0',
-          ),
+        testEnv = await TestEnv.createTemp(
+          proxyPublishCutoff: goldenDirLastModified,
+          // TODO: revert to 'any' after SDK 3.6 is out
+          dartdocVersion: '^8.3.0',
         );
 
-        final dartdocOutputDir = p.join(tempDir, 'doc', '$package-$version');
+        final dartdocOutputDir = p.join(
+          testEnv.tempDir.path,
+          'doc',
+          '$package-$version',
+        );
         await Directory(dartdocOutputDir).create(recursive: true);
 
-        var summary = await analyzer.inspectPackage(
+        var summary = await testEnv.analyzer.inspectPackage(
           package,
           version: version,
-          options: InspectOptions(
-            pubHostedUrl: 'http://127.0.0.1:${httpServer.port}',
-            panaCacheDir: panaCacheDir,
+          options: testEnv.inspectOptions(
             dartdocOutputDir: skipDartdoc ? null : dartdocOutputDir,
           ),
         );
@@ -124,9 +99,7 @@ void main() {
       });
 
       tearDownAll(() async {
-        await httpServer.close(force: true);
-        httpClient!.close();
-        Directory(tempDir).deleteSync(recursive: true);
+        await testEnv.close();
       });
 
       test('matches known good', () {
@@ -272,36 +245,3 @@ Future<DateTime> _detectGoldenLastModified() async {
     return now;
   }
 }
-
-Future<HttpServer> _startLocalProxy({
-  required http.Client? httpClient,
-  required DateTime blockPublishAfter,
-}) {
-  return serve(
-    (shelf.Request rq) async {
-      final pubDevUri = _pubDevUri.replace(path: rq.requestedUri.path);
-      final rs = await httpClient!.get(pubDevUri);
-      final segments = rq.requestedUri.pathSegments;
-      if (rs.statusCode == 200 &&
-          segments.length == 3 &&
-          segments[0] == 'api' &&
-          segments[1] == 'packages') {
-        final content = json.decode(rs.body) as Map<String, dynamic>;
-        final versions = (content['versions'] as List)
-            .cast<Map<String, dynamic>>();
-        versions.removeWhere((item) {
-          final published = DateTime.parse(item['published'] as String);
-          return published.isAfter(blockPublishAfter);
-        });
-        return shelf.Response.ok(json.encode(content));
-      }
-      return shelf.Response(
-        rs.statusCode,
-        body: gzip.encode(rs.bodyBytes),
-        headers: {'content-encoding': 'gzip'},
-      );
-    },
-    '127.0.0.1',
-    0,
-  );
-}
diff --git a/test/env_utils.dart b/test/env_utils.dart
new file mode 100644
index 000000000..3bdda3a00
--- /dev/null
+++ b/test/env_utils.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:http/http.dart' as http;
+import 'package:pana/pana.dart';
+import 'package:path/path.dart' as p;
+import 'package:shelf/shelf.dart' as shelf;
+import 'package:shelf/shelf_io.dart';
+
+final _pubDevUri = Uri.parse('https://pub.dev/');
+
+class TestEnv {
+  final Directory tempDir;
+  final HttpServer _httpServer;
+  final http.Client _httpClient;
+  final ToolEnvironment _toolEnv;
+
+  TestEnv._(this.tempDir, this._httpServer, this._httpClient, this._toolEnv);
+
+  late final _panaCacheDir = Directory(p.join(tempDir.path, 'pana-cache'))
+    ..createSync();
+
+  static Future<TestEnv> createTemp({
+    DateTime? proxyPublishCutoff,
+    String? dartdocVersion,
+  }) async {
+    final tempPath = Directory.systemTemp
+        .createTempSync('pana-test')
+        .resolveSymbolicLinksSync();
+    final pubCacheDir = p.join(tempPath, 'pub-cache');
+    final dartConfigDir = p.join(tempPath, 'config', 'dart');
+    final flutterConfigDir = p.join(tempPath, 'config', 'flutter');
+    final tempDir = Directory(tempPath);
+    Directory(pubCacheDir).createSync();
+    Directory(dartConfigDir).createSync(recursive: true);
+    Directory(flutterConfigDir).createSync(recursive: true);
+
+    final (httpServer, httpClient) = await _startLocalProxy(
+      publishCutoff: proxyPublishCutoff ?? DateTime.now(),
+    );
+
+    final toolEnv = await ToolEnvironment.create(
+      dartSdkConfig: SdkConfig(configHomePath: dartConfigDir),
+      flutterSdkConfig: SdkConfig(configHomePath: flutterConfigDir),
+      pubCacheDir: pubCacheDir,
+      pubHostedUrl: 'http://localhost:${httpServer.port}',
+      dartdocVersion: dartdocVersion ?? 'any',
+    );
+
+    return TestEnv._(tempDir, httpServer, httpClient, toolEnv);
+  }
+
+  late final analyzer = PackageAnalyzer(_toolEnv);
+
+  InspectOptions inspectOptions({String? dartdocOutputDir}) {
+    return InspectOptions(
+      pubHostedUrl: 'http://127.0.0.1:${_httpServer.port}',
+      panaCacheDir: _panaCacheDir.path,
+      dartdocOutputDir: dartdocOutputDir,
+    );
+  }
+
+  Future<Summary> inspectDir(String packageDir) async {
+    return analyzer.inspectDir(packageDir, options: inspectOptions());
+  }
+
+  Future<void> close() async {
+    _httpClient.close();
+    await _httpServer.close(force: true);
+    await tempDir.delete(recursive: true);
+  }
+}
+
+Future<(HttpServer, http.Client)> _startLocalProxy({
+  required DateTime publishCutoff,
+}) async {
+  final client = http.Client();
+  final server = await serve(
+    (shelf.Request rq) async {
+      final pubDevUri = _pubDevUri.replace(path: rq.requestedUri.path);
+      final rs = await client.get(pubDevUri);
+      final segments = rq.requestedUri.pathSegments;
+      if (rs.statusCode == 200 &&
+          segments.length == 3 &&
+          segments[0] == 'api' &&
+          segments[1] == 'packages') {
+        final content = json.decode(rs.body) as Map<String, dynamic>;
+        final versions = (content['versions'] as List)
+            .cast<Map<String, dynamic>>();
+        versions.removeWhere((item) {
+          final published = DateTime.parse(item['published'] as String);
+          return published.isAfter(publishCutoff);
+        });
+        return shelf.Response.ok(json.encode(content));
+      }
+      return shelf.Response(
+        rs.statusCode,
+        body: gzip.encode(rs.bodyBytes),
+        headers: {'content-encoding': 'gzip'},
+      );
+    },
+    '127.0.0.1',
+    0,
+  );
+  return (server, client);
+}
+
+class PackageDirBuilder {
+  final String _rootPath;
+  PackageDirBuilder(this._rootPath);
+
+  Future<void> writeFile(String path, String content) async {
+    final file = File(p.join(_rootPath, path));
+    await file.parent.create(recursive: true);
+    await file.writeAsString(content);
+  }
+
+  Future<void> writePubspec({
+    String name = 'pkg',
+    Map<String, dynamic>? devDependencies,
+  }) async {
+    await writeFile(
+      'pubspec.yaml',
+      json.encode({
+        'name': name,
+        'publish_to': 'none',
+        'environment': {'sdk': '^3.9.0'},
+        if (devDependencies != null) 'dev_dependencies': devDependencies,
+      }),
+    );
+  }
+}
diff --git a/test/format_options_test.dart b/test/format_options_test.dart
new file mode 100644
index 000000000..367715087
--- /dev/null
+++ b/test/format_options_test.dart
@@ -0,0 +1,78 @@
+// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
+// for details. 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:pana/pana.dart';
+import 'package:pana/src/utils.dart';
+import 'package:test/test.dart';
+
+import 'env_utils.dart';
+
+void main() {
+  group('Format option extracted from dev-dependency lint', () {
+    late TestEnv testEnv;
+
+    setUpAll(() async {
+      testEnv = await TestEnv.createTemp(
+        proxyPublishCutoff: DateTime(2025, 09, 16),
+      );
+    });
+
+    tearDownAll(() async {
+      await testEnv.close();
+    });
+
+    test('package with transient formatting rule', () async {
+      await withTempDir((path) async {
+        final builder = PackageDirBuilder(path);
+        await builder.writePubspec(
+          devDependencies: {'pedantic_mono': '1.33.0'},
+        );
+
+        Future<void> expectFormatting({
+          required String code,
+          required bool include,
+          required bool hasIssue,
+        }) async {
+          await builder.writeFile('lib/code.dart', code);
+          await builder.writeFile(
+            'analysis_options.yaml',
+            include
+                ? 'include: package:pedantic_mono/analysis_options.yaml'
+                : '',
+          );
+          final rs = await testEnv.inspectDir(path);
+          expect(
+            rs.report!.sections
+                .firstWhere((s) => s.id == ReportSectionId.analysis)
+                .summary,
+            hasIssue
+                ? contains('match the Dart formatter')
+                : isNot(contains('match the Dart formatter')),
+          );
+        }
+
+        await expectFormatting(
+          code: "final x = ['a'];\n",
+          include: false,
+          hasIssue: false,
+        );
+        await expectFormatting(
+          code: "final x = ['a'];\n",
+          include: true,
+          hasIssue: false,
+        );
+        await expectFormatting(
+          code: "final x = ['a',];\n",
+          include: false,
+          hasIssue: true,
+        );
+        await expectFormatting(
+          code: "final x = [\n  'a',\n];\n",
+          include: true,
+          hasIssue: false,
+        );
+      });
+    });
+  });
+}
diff --git a/test/goldens/end2end/audio_service-0.18.17.json b/test/goldens/end2end/audio_service-0.18.17.json
index 5391e5851..777ba9df5 100644
--- a/test/goldens/end2end/audio_service-0.18.17.json
+++ b/test/goldens/end2end/audio_service-0.18.17.json
@@ -197,10 +197,10 @@
       {
         "id": "analysis",
         "title": "Pass static analysis",
-        "grantedPoints": 50,
+        "grantedPoints": 40,
         "maxPoints": 50,
-        "status": "passed",
-        "summary": "### [*] 50/50 points: code has no errors, warnings, lints, or formatting issues\n"
+        "status": "partial",
+        "summary": "### [~] 40/50 points: code has no errors, warnings, lints, or formatting issues\n\n<details>\n<summary>\nINFO: The parameter name 'newQueue' doesn't match the name 'queue' in the overridden method.\n</summary>\n\n`lib/audio_service.dart:3321:44`\n\n```\n     ╷\n3321 │   Future<void> updateQueue(List<MediaItem> newQueue) async {\n     │                                            ^^^^^^^^\n     ╵\n```\n\nTo reproduce make sure you are using the [lints_core](https://pub.dev/packages/lints) and run `flutter analyze lib/audio_service.dart`\n</details>\n"
       },
       {
         "id": "dependency",
@@ -257,7 +257,7 @@
         }
       }
     ],
-    "grantedPoints": 140,
+    "grantedPoints": 130,
     "maxPoints": 150
   },
   "urlProblems": []
diff --git a/test/goldens/end2end/audio_service-0.18.17.json_report.md b/test/goldens/end2end/audio_service-0.18.17.json_report.md
index 3136dc766..907861e8f 100644
--- a/test/goldens/end2end/audio_service-0.18.17.json_report.md
+++ b/test/goldens/end2end/audio_service-0.18.17.json_report.md
@@ -91,9 +91,26 @@ This iOS or macOS plugin supports the Swift Package Manager. It will be rewarded
 See https://docs.flutter.dev/to/spm for details.
 
 
-## 50/50 Pass static analysis
+## 40/50 Pass static analysis
 
-### [*] 50/50 points: code has no errors, warnings, lints, or formatting issues
+### [~] 40/50 points: code has no errors, warnings, lints, or formatting issues
+
+<details>
+<summary>
+INFO: The parameter name 'newQueue' doesn't match the name 'queue' in the overridden method.
+</summary>
+
+`lib/audio_service.dart:3321:44`
+
+```
+     ╷
+3321 │   Future<void> updateQueue(List<MediaItem> newQueue) async {
+     │                                            ^^^^^^^^
+     ╵
+```
+
+To reproduce make sure you are using the [lints_core](https://pub.dev/packages/lints) and run `flutter analyze lib/audio_service.dart`
+</details>
 
 
 ## 30/40 Support up-to-date dependencies
diff --git a/test/goldens/end2end/gg-1.0.12.json b/test/goldens/end2end/gg-1.0.12.json
index 9b26cee96..61785b81d 100644
--- a/test/goldens/end2end/gg-1.0.12.json
+++ b/test/goldens/end2end/gg-1.0.12.json
@@ -178,10 +178,10 @@
       {
         "id": "analysis",
         "title": "Pass static analysis",
-        "grantedPoints": 50,
+        "grantedPoints": 40,
         "maxPoints": 50,
-        "status": "passed",
-        "summary": "### [*] 50/50 points: code has no errors, warnings, lints, or formatting issues\n"
+        "status": "partial",
+        "summary": "### [~] 40/50 points: code has no errors, warnings, lints, or formatting issues\n\n<details>\n<summary>\nINFO: The member 'get' overrides an inherited member but isn't annotated with '@override'.\n</summary>\n\n`lib/src/tools/did_command.dart:59:16`\n\n```\n   ╷\n59 │   Future<bool> get({\n   │                ^^^\n   ╵\n```\n\nTo reproduce make sure you are using the [lints_core](https://pub.dev/packages/lints) and run `dart analyze lib/src/tools/did_command.dart`\n</details>\n"
       },
       {
         "id": "dependency",
@@ -236,7 +236,7 @@
         }
       }
     ],
-    "grantedPoints": 120,
+    "grantedPoints": 110,
     "maxPoints": 150
   },
   "urlProblems": []
diff --git a/test/goldens/end2end/gg-1.0.12.json_report.md b/test/goldens/end2end/gg-1.0.12.json_report.md
index 07bd0786b..6b24e1b9f 100644
--- a/test/goldens/end2end/gg-1.0.12.json_report.md
+++ b/test/goldens/end2end/gg-1.0.12.json_report.md
@@ -74,9 +74,26 @@ This package is not compatible with runtime `wasm`, and will not be rewarded ful
 See https://dart.dev/web/wasm for details.
 
 
-## 50/50 Pass static analysis
+## 40/50 Pass static analysis
 
-### [*] 50/50 points: code has no errors, warnings, lints, or formatting issues
+### [~] 40/50 points: code has no errors, warnings, lints, or formatting issues
+
+<details>
+<summary>
+INFO: The member 'get' overrides an inherited member but isn't annotated with '@override'.
+</summary>
+
+`lib/src/tools/did_command.dart:59:16`
+
+```
+   ╷
+59 │   Future<bool> get({
+   │                ^^^
+   ╵
+```
+
+To reproduce make sure you are using the [lints_core](https://pub.dev/packages/lints) and run `dart analyze lib/src/tools/did_command.dart`
+</details>
 
 
 ## 10/40 Support up-to-date dependencies