LIVE
The AI Parity Index0.1%Tasks measured1 of 18,796Unemployment4.1% · Jul 20260.1 pt vs Jun 2026Payrolls−23K m/m · Jul 2026158.9M employedJob openings7.4M · Jun 20260.2M vs May 2026Wages$37.62/h avg · Jul 2026+3.2% y/yProductivity+1.4% q/q ann. · Q2 2026Inflation+3.4% y/y · Jul 2026Next upSoftware Developers · 16 more tasksNext releaseQ4 2026
The AI Parity Index0.1%Tasks measured1 of 18,796Unemployment4.1% · Jul 20260.1 pt vs Jun 2026Payrolls−23K m/m · Jul 2026158.9M employedJob openings7.4M · Jun 20260.2M vs May 2026Wages$37.62/h avg · Jul 2026+3.2% y/yProductivity+1.4% q/q ann. · Q2 2026Inflation+3.4% y/y · Jul 2026Next upSoftware Developers · 16 more tasksNext releaseQ4 2026
Modify existing software to correct errors, adapt it to new hardware, or…Verified run

GPT-5.5

Below the human bar by 78 points.

Software Developers · O*NET task 21670 · 9 instances × 3 runs · release 2026-08

Success

22%

Runs passed

6/27

Cost per fix

$0.03

Time per fix

30s

Gap vs human

-78 pts

Method

Test subjectMinds, open-source social platform, 10+ year Angular codebase, public git history
Instance selection2,704 merged tickets → 45 ship a runnable test → 9 validated red-to-green for this pilot
Resolve criterionthe ticket's own test fails on the bug and passes on the fix, with the existing suite still green; executed, never judged
Repetitions3 independent runs per ticket per configuration, 27 runs per configuration
ModelClaude Opus in the three structure configurations; GPT-5.5 and Gemini 3.1 Pro run the identical one-shot protocol (August 2026 rerun on the same instance set)
AI cost basistoken list-price estimate per fix
Human baseline basissuccess: the shipped fixes (measured). Time and cost: inferred from 2–4h at $75–100/h; not measured
Run windowAugust 2026

Scope and limitations

Populationwell-specified, test-backed, buildable bugs in one Angular codebase; not software bugs in general
Resolvepasses the team's own test; a strong proxy for correct, not a proof of it
Localizationthe agent is handed the right files; real work includes finding the fault
Cost and baselineAI cost is a token list-price estimate; the human figure is inferred, not measured
Samplea 9-bug pilot; production accuracy needs more cases and more repetitions for tighter confidence

Results by instance

Open any instance for the complete evidence: the ticket as written, the test that judges it, and the exact patch this configuration produced beside the patch the human team shipped. Every patch is checksummed.

2746Audio pause on destroy0/3$0.02

base f1e8f68baa0c · test: src/app/modules/media/components/audio/services/audio-player.service.spec.ts · files changed: src/app/modules/media/components/audio/services/audio-player.service.ts · Fix audio pause events triggering on component destroy front#6219

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

https://gitlab.com/minds/front/-/issues/6219

### Summary of Changes

Fix audio pause events triggering on component destroy.

### Testing Considerations

1. Go to a feed with audio
2. Go off the feed
3. Check there are no events in Posthog (may be a delay)
4. Go to a feed with audio
5. Play and pause some audio
6. Check the events appear in Posthog.

### Deployment Considerations

Standard deployment.

### Regression Scope

- Audio analytics. 
- Player pausing.

### Platform Affected (web, mobile, etc)
 …

THIS CONFIGURATION’S PATCH · sha e7d59da3c9f3 · 0/3

diff --git a/src/app/modules/media/components/audio/services/audio-player.service.ts b/src/app/modules/media/components/audio/services/audio-player.service.tsindex 0000000..0000000 100644--- a/src/app/modules/media/components/audio/services/audio-player.service.ts+++ b/src/app/modules/media/components/audio/services/audio-player.service.ts@@ -91,7 +91,7 @@ export class AudioPlayerService {    * @returns { AudioPlayerService }    */   public onUnregisterActivePlayer(): AudioPlayerService {-    this.pause();+    this.pause(false);     this.loading$.next(false);     this.isActivePlayer = false;     return this;@@ -132,10 +132,14 @@ export class AudioPlayerService {    /**    * Pauses the audio.+   * @param { boolean } trackAnalytics - Whether to track a pause analytics event.    * @returns { void }    */-  public pause(): void {+  public pause(trackAnalytics: boolean = true): void {     this.globalAudioPlayerService.pause();++    if (!trackAnalytics) {+      return;+    }     this.trackPauseEvent();   }

THE HUMAN TEAM’S PATCH · sha c4d2d54c666a · shipped

--- a/src/app/modules/media/components/audio/services/audio-player.service.ts+++ b/src/app/modules/media/components/audio/services/audio-player.service.ts@@ -145,6 +145,9 @@    * @returns { void }    */   public pause(): void {+    if (!this.isActivePlayer || !this.playing$.getValue()) {+      return;+    }     this.globalAudioPlayerService.pause();     this.trackPauseEvent();   }

AI QUALITY JUDGE · CLAUDE

Failed all three runs, narrowly. It taught the pause function to skip the analytics event during player cleanup, which silences the fake 'user paused' log.

It kept the side effect the humans removed: closing one player could still pause another. The test checks both, so it stayed red.

2721Join group by invite3/3$0.03

base c52c269ca9cd · test: src/app/common/services/group-membership.service.spec.ts · files changed: src/app/common/services/group-membership.service.ts · Fix joining a group by invite when already on group page front#6202

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

front#6202

### Summary of Changes

Fixes an issue wherein when a user is ALREADY on a group page, and accepts a group invite notification, the group does not automatically reload.

### Testing Considerations

- [x] When on a group page and accepting an invite to the same group, the group is reloaded, with me in a joined state.
- [x] When on another page and accepting an invite, I am navigated to the group in a joined state.

### Deployment Considerations

Standard deployment.

### Regression Scope

Grou …

THIS CONFIGURATION’S PATCH · sha 7ba51edc4bb4 · 3/3

diff --git a/src/app/common/services/group-membership.service.ts b/src/app/common/services/group-membership.service.tsindex 0000000000..0000000000 100644--- a/src/app/common/services/group-membership.service.ts+++ b/src/app/common/services/group-membership.service.ts@@ -88,6 +88,24 @@ export class GroupMembershipService implements OnDestroy {     this.isCreator$.next(group['is:creator']);   } +  /**+   * Navigate to a group, forcing the route to reload when already there.+   * This is needed when accepting an invite from the same group page so the+   * group data is refreshed with the user's new joined state.+   */+  private navigateToGroup(groupGuid: string): void {+    const groupUrl = `/group/${groupGuid}`;++    if (this.router.url.includes(groupUrl)) {+      void this.router+        .navigateByUrl('/', { skipLocationChange: true })+        .then(() => this.router.navigateByUrl(groupUrl));++      return;+    }++    void this.router.navigateByUrl(groupUrl);+  }+   /**    * Join the group    * @param { GroupJoinOptions } groupJoinOptions - options.@@ -147,13 +165,9 @@ export class GroupMembershipService implements OnDestroy {                 );               } -              // only navigate if requested, and the user is not already on the page.-              if (-                groupJoinOptions?.navigateOnSuccess &&-                !this.router.url.includes(`/group/${groupGuid}`)-              ) {-                this.router.navigateByUrl(`/group/${groupGuid}`);+              if (groupJoinOptions?.navigateOnSuccess) {+                this.navigateToGroup(groupGuid);               }+               return;             }           })

THE HUMAN TEAM’S PATCH · sha b1fd985b3d88 · shipped

--- a/src/app/common/services/group-membership.service.ts+++ b/src/app/common/services/group-membership.service.ts@@ -167,11 +167,18 @@               }                // only navigate if requested, and the user is not already on the page.-              if (-                groupJoinOptions?.navigateOnSuccess &&-                !this.router.url.includes(`/group/${groupGuid}`)-              ) {-                this.router.navigateByUrl(`/group/${groupGuid}`);+              if (groupJoinOptions?.navigateOnSuccess) {+                if (!this.router.url.includes(`/group/${groupGuid}`)) {+                  this.router.navigateByUrl(`/group/${groupGuid}`);+                } else {+                  // Force a route refresh if the user is already on the page.+                  const currentUrl: string = this.router.url;+                  this.router+                    .navigateByUrl('/', { skipLocationChange: true })+                    .then(() => {+                      this.router.navigateByUrl(currentUrl);+                    });+                }               }               return;             }

AI QUALITY JUDGE · CLAUDE

Passed all three runs, with the same idea as the human team: if the user is already on the group page, hop away and back to force a reload.

It wrapped the logic in a small helper function. The behavior the test checks is the same.

2698Group invite form0/3$0.02

base 4ba331e9a767 · test: src/app/modules/groups/v2/invite/invite.component.spec.ts · files changed: src/app/modules/groups/v2/invite/invite.component.ts · Fix group invite form #6190

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

Closes https://gitlab.com/minds/front/-/issues/6190

### Summary of Changes

Fix issue with group invite form preventing multiple members from being invited in a row.

### Testing Considerations

- [x] I can invite a user that I'm subscribed to by clicking their row from the search bar.
- [x] I can invite a second user that I'm subscribed to by clicking their row from the search bar.
- [x] I can invite a user that I'm subscribed to by typing their name into the search bar and clicking submit without clic …

THIS CONFIGURATION’S PATCH · sha e6df4d8d47fa · 0/3

diff --git a/src/app/modules/groups/v2/invite/invite.component.ts b/src/app/modules/groups/v2/invite/invite.component.tsindex 0000000000..0000000000 100644--- a/src/app/modules/groups/v2/invite/invite.component.ts+++ b/src/app/modules/groups/v2/invite/invite.component.ts@@ -15,7 +15,7 @@ import { import {   EntityResolverService,   EntityResolverServiceOptions, } from '../../../../common/services/entity-resolver.service';-import { Subscription, distinctUntilChanged, switchMap } from 'rxjs';+import { Subscription, distinctUntilChanged, of, switchMap } from 'rxjs'; import { MindsGroup } from '../group.model';  /**@@ -70,7 +70,7 @@ export class GroupInviteComponent implements OnInit, OnDestroy {             if (username === '') {               this.invitee = null;               this.refreshEligibilityValidator();-              return;+              return of(null);             } else {               this.inProgress = true;               let options = new EntityResolverServiceOptions();@@ -159,6 +159,8 @@ export class GroupInviteComponent implements OnInit, OnDestroy {           eligibilityInvalid: true,         };       }++      return null;     };   }

THE HUMAN TEAM’S PATCH · sha c887764c12c6 · shipped

--- a/src/app/modules/groups/v2/invite/invite.component.ts+++ b/src/app/modules/groups/v2/invite/invite.component.ts@@ -8,19 +8,18 @@ import { GroupInviteService } from './invite.service'; import { MindsUser } from '../../../../interfaces/entities'; import {-  AbstractControl,   UntypedFormBuilder,   UntypedFormGroup,-  ValidationErrors,-  ValidatorFn,   Validators, } from '@angular/forms';+import { debounceTime, of, Subscription, switchMap } from 'rxjs';+import { MindsGroup } from '../group.model';+import { AutoCompleteEntityTypeEnum } from '../../../../common/components/forms/autocomplete-entity-input/autocomplete-entity-input.component';+import { ToasterService } from '../../../../common/services/toaster.service'; import {   EntityResolverService,   EntityResolverServiceOptions, } from '../../../../common/services/entity-resolver.service';-import { Subscription, distinctUntilChanged, switchMap } from 'rxjs';-import { MindsGroup } from '../group.model';  /**  * Invite modal component@@ -37,6 +36,10 @@   providers: [GroupInviteService], }) export class GroupInviteComponent implements OnInit, OnDestroy {+  /** Enum for use in template. */+  protected readonly AutoCompleteEntityTypeEnum: typeof AutoCompleteEntityTypeEnum =+    AutoCompleteEntityTypeEnum;+   /**    * Modal save handler    */@@ -67,13 +70,14 @@   constructor(     public service: GroupInviteService,     private fb: UntypedFormBuilder,-    private entityResolverService: EntityResolverService,-    private changeDetector: ChangeDetectorRef+    private changeDetector: ChangeDetectorRef,+    private toasterService: ToasterService,+    private entityResolverService: EntityResolverService   ) {}    ngOnInit(): void {     this.formGroup = this.fb.group({-      username: [+      user: [         '',         {           validators: [Validators.required],@@ -83,28 +87,28 @@     });      this.subscriptions.push(-      this.formGroup.controls.username.valueChanges-        .pipe(-          distinctUntilChanged(),-          switchMap((username: string) => {-            if (username === '') {-              this.invitee = null;-              this.refreshEligibilityValidator();-              return;-            } else {-              this.inProgress = true;+      this.formGroup+        .get('user')+        .valueChanges.pipe(+          debounceTime(200),+          switchMap((user: string | MindsUser) => {+            // fallback for if the user does not click on the autocomplete result.+            if (typeof user === 'string') {               let options = new EntityResolverServiceOptions();               options.refType = 'username';-              options.ref = username;-+              options.ref = user;               return this.entityResolverService.get$<MindsUser>(options);             }+            return of(user);           })         )-        .subscribe((user) => {+        .subscribe((user: MindsUser): void => {+          if (!user) {+            this.invitee = null;+            return;+          }           this.inProgress = false;           this.invitee = user;-          this.refreshEligibilityValidator();         })     );   }@@ -136,19 +140,31 @@    * Submit an invitation to the selected user    */   async onSubmit(): Promise<void> {-    await this.service.invite(this.invitee);+    if (!this.invitee) {+      console.error('No invitee selected');+      return;+    }++    if (!this.invitee.subscriber) {+      this.toasterService.error(+        'You can only invite users who are subscribed to you'+      );+      return;+    }++    this.service.invite(this.invitee);      // Reset the form     this.invitee = null;     this.formGroup.reset(       {-        username: '',+        user: null,       },       {         emitEvent: false,       }     );-    this.formGroup.get('username').setErrors(null);+    this.formGroup.get('user').setErrors(null);     this.formGroup.markAsPristine();     this.changeDetector.detectChanges();   }@@ -161,42 +177,4 @@   public isModerator(group: MindsGroup): boolean {     return group['is:owner'] || group['is:moderator'];   }--  /**-   * Ensure we are not trying to invite someone who is not a subscriber-   */-  private eligibilityValidator(): ValidatorFn {-    return (control: AbstractControl): ValidationErrors | null => {-      if (this.invitee && !this.invitee.subscriber) {-        return {-          eligibilityInvalid: true,-        };-      }-    };-  }--  private latestEligibilityValidator: ValidatorFn = null;--  private refreshEligibilityValidator(): void {-    this.removeEligibilityValidator();--    this.latestEligibilityValidator = this.eligibilityValidator();-    this.formGroup.controls.username?.addValidators(-      this.latestEligibilityValidator-    );--    this.formGroup.controls.username?.updateValueAndValidity({-      emitEvent: false,-    });--    this.formGroup.controls.username?.markAsDirty();--    this.changeDetector.detectChanges();-  }--  private removeEligibilityValidator(): void {-    this.formGroup.controls.username?.removeValidators(-      this.latestEligibilityValidator-    );-  } }

AI QUALITY JUDGE · CLAUDE

Failed all three runs. It made a small repair to the form's lookup stream and stopped there.

The test expects the human team's larger rebuild: the renamed field, the delay before lookups, and the error message. A one-line repair cannot reach it.

2696Chatwoot emails0/3$0.02

base 3c8f56a702df · test: src/app/common/components/chatwoot-widget/chatwoot-widget.component.spec.ts · files changed: src/app/common/components/chatwoot-widget/chatwoot-widget.component.ts · Fix Chatwoot emails minds#4948

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

minds#4948

### Summary of Changes

Fixes an issue where Chatwoot user held locally is out of sync with Chatwoot servers, by resetting the user if one is not set locally on bubble click.

### Testing Considerations

Note that email will NOT be passed to chatwoot if a user already exists with that email. I strongly recommend using plus addressing (e.g. example+chatwoot1@minds.com) to give your account a new email to test - and you can delete the contact from Chatwoot to retest.

Between tests you want to  …

THIS CONFIGURATION’S PATCH · sha 0d0e31471d90 · 0/3

diff --git a/src/app/common/components/chatwoot-widget/chatwoot-widget.component.ts b/src/app/common/components/chatwoot-widget/chatwoot-widget.component.tsindex 0000000..0000000 100644--- a/src/app/common/components/chatwoot-widget/chatwoot-widget.component.ts+++ b/src/app/common/components/chatwoot-widget/chatwoot-widget.component.ts@@ -164,6 +164,18 @@ export class ChatwootWidgetComponent implements OnInit, OnDestroy {   private onBubbleClick(event: Event): void {     const currentChatwootUser = this.window.$chatwoot?.user; +    if (!currentChatwootUser) {+      this.resetChatwoot();++      if (this.session.isLoggedIn()) {+        void this.setUser().then(() => {+          void this.patchEmail();+        });

THE HUMAN TEAM’S PATCH · sha d695d452d187 · shipped

--- a/src/app/common/components/chatwoot-widget/chatwoot-widget.component.ts+++ b/src/app/common/components/chatwoot-widget/chatwoot-widget.component.ts@@ -174,15 +174,19 @@    /**    * Sets user for widget.+   * @param { { email?: string } } additionalProps - additional properties to set on the user.    * @returns { Promise<void> }    */-  private async setUser(): Promise<void> {+  private async setUser(+    additionalProps: { email?: string } = {}+  ): Promise<void> {     const user: MindsUser = this.session.getLoggedInUser();      this.window.$chatwoot.setUser(user.guid, {       name: `@${user.username}`,       identifier_hash: await this.getIdentifierHash(),       avatar_url: this.userAvatar.getSrc(),+      ...additionalProps,     });   } @@ -202,11 +206,22 @@    * @param { Event } event - click event.    * @returns { void }    */-  private onBubbleClick(event: Event): void {+  private async onBubbleClick(event: Event): Promise<void> {+    if (!this.session.isLoggedIn()) {+      return;+    }+     const currentChatwootUser = this.window.$chatwoot?.user; -    if (currentChatwootUser && !currentChatwootUser?.email) {-      this.patchEmail(); // async+    if (!currentChatwootUser) {+      // clear any lingering state as it's gotten out of sync.+      this.resetChatwoot();++      // set the user again with the email address.+      this.setUser({ email: await this.emailAddressService.getEmailAddress() });+      return;+    } else if (!currentChatwootUser?.email) {+      this.patchEmail();     }   } 

AI QUALITY JUDGE · CLAUDE

Failed all three runs. The idea matches the human fix: reset the chat widget and re-register the user with their email.

One run's patch was written against code that reads differently from the real file and would not apply. The other two applied but missed part of the re-register flow the test checks.

2735Tenant site name0/3$0.02

base c7a590bf3c58 · test: src/app/modules/auth/reset-password-modal/forms/request/request.component.spec.ts · files changed: src/app/modules/auth/reset-password-modal/forms/request/request.component.ts · Fix incorrect site name in tenant forgot password flow #6209

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

#6209

### Summary of Changes

The incorrect site name is used in the forgot password flow for Tenants. The text is hard-coded to be `Minds` when it should use the `site_name`.

### Testing Considerations

Bound to https://fausto.oke.minds.io

#### Tenant

- [ ] After entering username in forgot password, the subsequent panel gives me the option to `Log in to {{tenant site name}}`.
 
#### Non-tenant

- [ ] After entering username in forgot password, the subsequent panel gives me the option to `Log in to  …

THIS CONFIGURATION’S PATCH · sha 1475909dc4ee · 0/3

diff --git a/src/app/modules/auth/reset-password-modal/forms/request/request.component.ts b/src/app/modules/auth/reset-password-modal/forms/request/request.component.tsindex 0000000000..0000000000 100644--- a/src/app/modules/auth/reset-password-modal/forms/request/request.component.ts+++ b/src/app/modules/auth/reset-password-modal/forms/request/request.component.ts@@ -1,5 +1,6 @@-import { Component, Inject, OnDestroy, OnInit } from '@angular/core';+import { Component, OnDestroy, OnInit } from '@angular/core'; import { ToasterService } from '../../../../../common/services/toaster.service';+import { ConfigsService } from '../../../../../common/services/configs.service'; import {   FormBuilder,   FormControl,@@ -27,13 +28,17 @@ export class ResetPasswordModalRequestFormComponent   protected canSendEmail: boolean = true;    protected secondsBetweenResends: number;+  protected readonly siteName: string;    constructor(     protected toaster: ToasterService,     private formBuilder: FormBuilder,-    protected service: ResetPasswordModalService-  ) {}+    protected service: ResetPasswordModalService,+    private configs: ConfigsService+  ) {+    this.siteName = this.configs.get('site_name') || 'Minds';+  }    ngOnInit(): void {     // Always show the first panel on load     this.service.activePanel$.next('enterUsername');diff --git a/src/app/modules/auth/reset-password-modal/forms/request/request.component.html b/src/app/modules/auth/reset-password-modal/forms/request/request.component.htmlindex 0000000000..0000000000 100644--- a/src/app/modules/auth/reset-password-modal/forms/request/request.component.html+++ b/src/app/modules/auth/reset-password-modal/forms/request/request.component.html@@ -1 +1 @@-Log in to Minds+Log in to {{ siteName }}

THE HUMAN TEAM’S PATCH · sha 6909acfedf5c · shipped

--- a/src/app/modules/auth/reset-password-modal/forms/request/request.component.ts+++ b/src/app/modules/auth/reset-password-modal/forms/request/request.component.ts@@ -12,6 +12,7 @@   ResetPasswordModalPanel,   ResetPasswordModalService, } from '../../reset-password-modal.service';+import { SITE_NAME } from '../../../../../common/injection-tokens/common-injection-tokens';  /**  * Form for the user to submit a request for a@@ -34,12 +35,16 @@   protected canSendEmail: boolean = true;    protected secondsBetweenResends: number;+  protected readonly loginToText: string;    constructor(     protected toaster: ToasterService,     private formBuilder: FormBuilder,-    protected service: ResetPasswordModalService-  ) {}+    protected service: ResetPasswordModalService,+    @Inject(SITE_NAME) protected siteName: string+  ) {+    this.loginToText = $localize`:@@RESET_PASSWORD__EMAIL_SENT_PANEL__LOGIN_LINK__TO_SITE:to ${this.siteName || 'Minds'}:site name:`;+  }    ngOnInit(): void {     // Always show the first panel on load

AI QUALITY JUDGE · CLAUDE

Failed all three runs, with the right idea behind them: like the human fix, it pulls the site's name from configuration and uses it in the login text.

All three patches were written against a version of the file that does not exist, so none of them applied. A patch that cannot be applied counts as a miss.

2740Muted modal video3/3$0.01

base 5420b630517a · test: src/app/modules/media/components/video-player/scrollaware-player.component.spec.ts · files changed: src/app/modules/media/components/video-player/scrollaware-player.component.ts · Fix videos in modals starting muted #6215

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

#6215

### Summary of Changes

When a video is opened in a modal, it was forcing the play of the video MUTED, when the autoplay setting was on.
This change will set it to unmuted when opened in a modal, with autoplay on.

### Testing Considerations

- [x] Autoplay ON; videos on SEPs open in a modal and autoplay and autoplay unmuted
- [x] Autoplay ON; videos in narrow viewports open in a modal and autoplay unmuted 
- [x] Autoplay OFF; videos open in a modal, and upon pressing play are unmuted (this change …

THIS CONFIGURATION’S PATCH · sha a9dd2f9f138b · 3/3

diff --git a/src/app/modules/media/components/video-player/scrollaware-player.component.ts b/src/app/modules/media/components/video-player/scrollaware-player.component.tsindex 0000000..0000000 100644--- a/src/app/modules/media/components/video-player/scrollaware-player.component.ts+++ b/src/app/modules/media/components/video-player/scrollaware-player.component.ts@@ -83,7 +83,7 @@ export class ScrollAwareVideoPlayerComponent       !user.disable_autoplay_videos     ) {       this.player.play({-        muted: true,+        muted: !this.isModal,         hideControls: true,       });       this.detectChanges();@@ -108,7 +108,7 @@ export class ScrollAwareVideoPlayerComponent    forcePlay(): void {     this.player.play({-      muted: true,+      muted: !this.isModal,       hideControls: true,     });   }

THE HUMAN TEAM’S PATCH · sha c9faa10e46da · shipped

--- a/src/app/modules/media/components/video-player/scrollaware-player.component.ts+++ b/src/app/modules/media/components/video-player/scrollaware-player.component.ts@@ -61,7 +61,7 @@   }    ngOnDestroy() {-    this.scrollSubscription.unsubscribe();+    this.scrollSubscription?.unsubscribe();   }    ngAfterViewInit() {@@ -92,7 +92,7 @@       !user.disable_autoplay_videos     ) {       this.player.play({-        muted: true,+        muted: !this.isModal,         hideControls: true,       });       this.detectChanges();

AI QUALITY JUDGE · CLAUDE

Passed all three runs with the same one-line change the humans shipped: only mute the video when it is not in the pop-up viewer.

2741Audio og:image0/3$0.02

base 5420b630517a · test: src/app/modules/newsfeed/single/single.component.spec.ts · files changed: src/app/modules/newsfeed/single/single.component.ts · Fix audio og:image's front#6216

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

front#6216

### Summary of Changes

Change og:image for audio to be the audio thumbnail for an activity.

### Testing Considerations

- [x] With a thumbnail, og:image is the audio thumbnail.
- [x] Without a thumbnail, og:image is the default audio thumbnail.

### Deployment Considerations

Standard deployment.

### Regression Scope

Minor, impacts audio SEP SEO.

### Platform Affected (web, mobile, etc)

Web.

### Developer Testing Completed

Manual, unit (jasmine / karma).

### Screenshots / Screen Reco …

THIS CONFIGURATION’S PATCH · sha eacba7e20655 · 0/3

diff --git a/src/app/modules/newsfeed/single/single.component.ts b/src/app/modules/newsfeed/single/single.component.tsindex 0000000000..0000000000 100644--- a/src/app/modules/newsfeed/single/single.component.ts+++ b/src/app/modules/newsfeed/single/single.component.ts@@ -245,7 +245,8 @@ export class NewsfeedSingleComponent {      switch (this.activity.subtype) {       case 'video':-        ogImage = this.activity.thumbnail_src;+      case 'audio':+        ogImage = this.activity.thumbnail_src;         break;       case 'image':       case 'album':

THE HUMAN TEAM’S PATCH · sha 9d527e3b8988 · shipped

--- a/src/app/modules/newsfeed/single/single.component.ts+++ b/src/app/modules/newsfeed/single/single.component.ts@@ -288,7 +288,9 @@       thumbnailSrc =         activity.custom_type === 'batch'           ? activity.custom_data[0]['src']-          : activity.thumbnail_src;+          : activity.custom_type === 'audio'+            ? activity.custom_data['thumbnail_src']+            : activity.thumbnail_src;        if (activity.site_membership && activity.paywall_thumbnail) {         thumbnailSrc =

AI QUALITY JUDGE · CLAUDE

Failed all three runs. It invented a version of the code, a switch that picks the preview image, that does not exist in the real file, and patched that instead.

None of the three patches applied to the actual codebase.

2725Add-card loop0/3$0.02

base 4cb39d190eab · test: src/app/modules/payments/select-card/select-card.component.spec.ts · files changed: src/app/modules/payments/new-card-modal/new-card-modal.component.ts, src/app/modules/payments/select-card/select-card.component.ts · Fix add card loop minds#5179

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

minds#5179

### Summary of Changes

Fix loop when adding new card where Stripe window keeps opening.
Additionally fixes issue where upon closing window to add a new card, the window was being automatically reopened.

### Testing Considerations

Bound to https://olivia.oke.minds.io/

- [x] When adding a new card, when you are back on Minds, the card is loaded in and Stripe does not reopen.
- [x] When deciding not to add a new card on Stripe, when you are back on Minds, Stripe isn't automatically reopened. …

THIS CONFIGURATION’S PATCH · sha ff423615614c · 0/3

diff --git a/src/app/modules/payments/select-card/select-card.component.ts b/src/app/modules/payments/select-card/select-card.component.tsindex 0000000..0000000 100644--- a/src/app/modules/payments/select-card/select-card.component.ts+++ b/src/app/modules/payments/select-card/select-card.component.ts@@ -74,7 +74,11 @@ export class PaymentsSelectCard {       // if user has enough Boost credits, select gift card payment.       this.selected.next((this.paymentMethodId = 'gift_card'));     } else {-      if (this.paymentMethodId && this.paymentMethodId !== 'gift_card') {+      if (+        this.paymentMethodId &&+        this.paymentMethodId !== 'gift_card' &&+        this.paymentMethodId !== 'new'+      ) {         // if user has a selected payment method already, select it.         this.selected.next(this.paymentMethodId);       } else if (paymentmethods && paymentmethods.length) {@@ -95,12 +99,20 @@ export class PaymentsSelectCard {    async onAddNewCard(): Promise<void> {     const modal = this.modalService.present(NewCardModalComponent, {       data: {         onComplete: () => {-          this.selected.next('');+          this.paymentMethodId = '';+          this.selected.next(this.paymentMethodId);           this.loadCards();           modal.close();         },+        onDismissIntent: () => {+          if (this.paymentMethodId === 'new') {+            this.paymentMethodId = '';+            this.selected.next(this.paymentMethodId);+            this.detectChanges();+          }+          modal.close();+        },       },     });   }

THE HUMAN TEAM’S PATCH · sha 28a32961cdde · shipped

--- a/src/app/modules/payments/new-card-modal/new-card-modal.component.ts+++ b/src/app/modules/payments/new-card-modal/new-card-modal.component.ts@@ -23,12 +23,10 @@    /**    * Modal options-   *-   * @param onComplete-   * @param onDismissIntent-   * @param defaults+   * @param { any } opts - modal options.+   * @returns { void }    */-  setModalData({ onComplete, onDismissIntent }) {+  setModalData({ onComplete, onDismissIntent }: any): void {     this.onComplete = onComplete || (() => {});     this.onDismissIntent = onDismissIntent || (() => {});   }--- a/src/app/modules/payments/select-card/select-card.component.ts+++ b/src/app/modules/payments/select-card/select-card.component.ts@@ -108,9 +108,15 @@     const modal = this.modalService.present(NewCardModalComponent, {       data: {         onComplete: () => {+          this.paymentMethodId = '';           this.selected.next('');           this.loadCards();-          modal.close();+          modal?.close();+        },+        onDismissIntent: () => {+          this.paymentMethodId = '';+          this.selected.next('');+          modal?.close();         },       },     });

AI QUALITY JUDGE · CLAUDE

Failed all three runs. One reply contained no patch at all.

The other two extended the card picker in the right places, but passed the close handler a property the modal's type system rejects, so neither fix compiles.

2702Misconfigured domain upgrade0/3$0.05

base d67c453047e3 · test: src/app/modules/about/product-pages/components/common/button/button.component.spec.ts · files changed: src/app/modules/about/product-pages/components/common/button/button.component.ts, src/app/modules/multi-tenant-network/admin-console/tabs/billing/billing.component.ts · [front] Fix upgrading when domain is misconfigured minds#5113

THE TICKET, AS WRITTEN

<!---
Please read this!

The Definition of Done (DoD) can be found at https://developers.minds.com/docs/handbook/how-we-work/#definition-of-done
--->

### Ticket(s) / Related Merge Requests

* Issue card: minds#5113
* Engine MR: https://gitlab.com/minds/engine/-/merge_requests/1742

### Summary of Changes

See engine MR.

THIS CONFIGURATION’S PATCH · sha 8f7a3058c65b · 0/3

diff --git a/src/app/modules/multi-tenant-network/admin-console/tabs/billing/billing.component.ts b/src/app/modules/multi-tenant-network/admin-console/tabs/billing/billing.component.tsindex 0000000000..0000000000 100644--- a/src/app/modules/multi-tenant-network/admin-console/tabs/billing/billing.component.ts+++ b/src/app/modules/multi-tenant-network/admin-console/tabs/billing/billing.component.ts@@ -8,7 +8,6 @@ import { import { MultiTenantDomainService } from '../../../services/domain.service'; import { ModalService } from '../../../../../services/ux/modal.service';  import { ToasterService } from '../../../../../common/services/toaster.service'; import { AboutModule } from '../../../../about/about.module';-import { ConfigsService } from '../../../../../common/services/configs.service'; import { ProductPagePricingService } from '../../../../about/product-pages/services/product-page-pricing.service'; import { ProductPageUpgradeTimePeriod } from '../../../../about/product-pages/product-pages.types'; import {@@ -17,7 +16,10 @@ import {   GetTenantBillingQueryVariables,   TenantBillingType, } from '../../../../../../graphql/generated.engine';-import { Enum_Componentv2Productfeaturehighlight_Colorscheme as ColorScheme } from '../../../../../../graphql/generated.strapi';+import {+  Enum_Componentv2Productactionbutton_Action as StrapiAction,+  Enum_Componentv2Productfeaturehighlight_Colorscheme as ColorScheme,+} from '../../../../../../graphql/generated.strapi'; import { QueryRef } from 'apollo-angular'; import { Observable, Subscription } from 'rxjs'; import {@@ -65,7 +67,6 @@ export class NetworkAdminConsoleBillingComponent implements OnInit, OnDestroy {    constructor(     protected service: MultiTenantDomainService,-    private configsService: ConfigsService,     private pricingService: ProductPagePricingService,     private tenantBillingGql: GetTenantBillingGQL,     private themeService: ThemeService@@ -73,8 +74,6 @@ export class NetworkAdminConsoleBillingComponent implements OnInit, OnDestroy {    ngOnInit(): void {-    const siteUrl = this.configsService.get('site_url');-     this.tenantBillingQueryRef = this.tenantBillingGql.watch();      this.subscriptions = [@@ -84,11 +83,7 @@ export class NetworkAdminConsoleBillingComponent implements OnInit, OnDestroy {         this.billingOverview = value.data.tenantBilling;       }),-      this.pricingService.selectedTimePeriod$.subscribe((period) => {-        const periodStr =-          period === ProductPageUpgradeTimePeriod.Monthly-            ? 'monthly'-            : 'yearly';+      this.pricingService.selectedTimePeriod$.subscribe(() => {         this.products = [           {             'attributes': {@@ -105,13 +100,10 @@ export class NetworkAdminConsoleBillingComponent implements OnInit, OnDestroy {                 'dataRef': 'product-page-networks-team',                 'solid': true,                 'rounded': null,-                'navigationUrl':-                  siteUrl +-                  'api/v3/multi-tenant/billing/upgrade?plan=team&period=' +-                  periodStr,+                'navigationUrl': null,                 'stripeProductKey': 'networks:team',                 'trialUpgradeRequest': null,-                'action': null,+                'action': StrapiAction.NetworksTeamCheckout,               },               'perksTitle': 'Features',               'perks': [@@ -145,13 +137,10 @@ export class NetworkAdminConsoleBillingComponent implements OnInit, OnDestroy {                 'dataRef': 'product-page-networks-community',                 'solid': true,                 'rounded': null,-                'navigationUrl':-                  siteUrl +-                  'api/v3/multi-tenant/billing/upgrade?plan=community&period=' +-                  periodStr,+                'navigationUrl': null,                 'stripeProductKey': 'networks:community',                 'trialUpgradeRequest': null,-                'action': null,+                'action': StrapiAction.NetworksCommunityCheckout,               },               'perksTitle': 'Features',               'perks': [@@ -186,13 +175,10 @@ export class NetworkAdminConsoleBillingComponent implements OnInit, OnDestroy {                 'dataRef': 'product-page-networks-business',                 'solid': true,                 'rounded': null,-                'navigationUrl':-                  siteUrl +-                  'api/v3/multi-tenant/billing/upgrade?plan=enterprise&period=' +-                  periodStr,+                'navigationUrl': null,                 'stripeProductKey': 'networks:enterprise',                 'trialUpgradeRequest': null,-                'action': null,+                'action': StrapiAction.NetworksEnterpriseCheckout,               },               'perksTitle': 'Lowest rates',               'perks': [

THE HUMAN TEAM’S PATCH · sha 2dfc8f1f0d52 · shipped

--- a/src/app/modules/about/product-pages/components/common/button/button.component.ts+++ b/src/app/modules/about/product-pages/components/common/button/button.component.ts@@ -64,10 +64,17 @@     this.inProgress = true;     // if there is a navigationUrl, navigate to it.     if (Boolean(this.data.navigationUrl)) {-      if (this.data.navigationUrl.startsWith('http')) {+      if (+        this.data.navigationUrl.startsWith('http') ||+        this.data.navigationUrl.startsWith('/api/')+      ) {         window.open(this.data.navigationUrl, '_blank');       } else {-        this.router.navigateByUrl(this.data.navigationUrl);+        try {+          await this.router.navigateByUrl(this.data.navigationUrl);+        } catch (e: unknown) {+          console.error(e);+        }       }       this.inProgress = false;       return;--- a/src/app/modules/multi-tenant-network/admin-console/tabs/billing/billing.component.ts+++ b/src/app/modules/multi-tenant-network/admin-console/tabs/billing/billing.component.ts@@ -116,8 +116,7 @@                 'solid': true,                 'rounded': null,                 'navigationUrl':-                  siteUrl +-                  'api/v3/multi-tenant/billing/upgrade?plan=team&period=' ++                  '/api/v3/multi-tenant/billing/upgrade?plan=team&period=' +                   periodStr,                 'stripeProductKey': 'networks:team',                 'trialUpgradeRequest': null,@@ -154,8 +153,7 @@                 'solid': true,                 'rounded': null,                 'navigationUrl':-                  siteUrl +-                  'api/v3/multi-tenant/billing/upgrade?plan=community&period=' ++                  '/api/v3/multi-tenant/billing/upgrade?plan=community&period=' +                   periodStr,                 'stripeProductKey': 'networks:community',                 'trialUpgradeRequest': null,@@ -193,8 +191,7 @@                 'solid': true,                 'rounded': null,                 'navigationUrl':-                  siteUrl +-                  'api/v3/multi-tenant/billing/upgrade?plan=enterprise&period=' ++                  '/api/v3/multi-tenant/billing/upgrade?plan=enterprise&period=' +                   periodStr,                 'stripeProductKey': 'networks:enterprise',                 'trialUpgradeRequest': null,

AI QUALITY JUDGE · CLAUDE

Failed all three runs. It reworked how the billing page configures its upgrade buttons instead of fixing the link handling.

The actual bug: upgrade links starting with /api/ were swallowed by the app's internal router. The test checks that those links reach the browser, which this change never touches.

All configurations on this bench

ConfigurationSuccessRuns passedCost/fixTime/fix
Human baseline100%~$225 est.~25 min est.
Diagnose → fix hand-off · Claude Opus 100%27/27$0.2919s
Test-and-retry loop · Claude Opus 93%25/27$0.2919s
GPT-5.5 · this page22%6/27$0.0330s
Claude Opus 11%3/27$0.046s
Gemini 3.1 Pro 0%0/27$0.0197s

full dataset: /data/runs/21670-minds-bugfix.json · task instances are public materials (open-source Minds, public git history); anyone can rerun this run · quality-judge comments: a separate Claude pass reads the ticket and both patches; commentary only — the executed test scores the run · measured and published by Recursiv Labs as a working prototype; not an official SPARK AI or UC San Diego publication

Working prototype by Recursiv Labs · not an official SPARK AI or UC San Diego publication · Data · © 2026