I have a parent LWC with a list of records and a child LWC which allows the user to perform actions on the record.

The child uses `dispatchEvent` and `CustomEvent` to notify the parent after changes have been made to the record, so that the parent can refresh the list of records.

Unfortunately, `refreshApex` in the parent is not always working...

Here is the code.....

**parent component**

    <template>
      // contains a list of records, removed for brevity 
      <c-child-record-detail onback={handleBack} record-id={recordId}></c-child-record-detail>
    </template>

**parent JavaScript**

    import { LightningElement, wire } from "lwc";
    import { refreshApex } from "@salesforce/apex";
    import getRecords from "@salesforce/apex/MyController.getRecords";
    
    export default class MyLWC extends LightningElement {

        records;
        wiredResult;
        records; // used to render
        recordList; // used to store the original set from the server
        filterValue = "";
        recordId;
    
        @wire(getRecords) wiredRecords(value) {

            this.wiredResult = value;
            const { data, error } = value;
            if (data) {
                this.error = null;
                this.recordList = data;
                this.filterList();
            } else if (error) { ... }
        }

        refreshList() {
            return refreshApex(this.wiredResult);
        }

        handleBack() {
            this.recordId = null;
            this.refreshList();
        }

        handleFilterChange(event) {
            this.filterValue = event.detail.value;
            this.filterList();
        }

        filterList() {
            switch (this.filterValue) {
                case "Status1":
                    this.records = this.recordList.reduce(this.exampleReducer, []);
                    break;

                // many other cases removed for brevity 
            }
        }

        exampleReducer = (accumulator, currentValue) => {
            if (currentValue.Status__c === "example") {
                accumulator.push(currentValue);
                return accumulator;
            }
            return accumulator;
        };

        // many other reducers, removed for brevity 

        handleRowClick(event) {
            this.recordId = event.currentTarget.dataset.recordId;
        }
    }

I've tried very hard to reduce the code example down without losing its essence.

You will notice that I am doing client side filtering using `reduce`.

The `c-child-record-detail` component is reasonably complex, but the problem related to two buttons which are used to *finish* looking at the record, so we can go back to the list.

**child component**

**child button A JavaScript**

    handleButtonAClick() {
        updateAsSomeSubStatus({ recordId: this.recordId}).then(result => {
            if (result === true) {
                this.backToList();
            }
        }).catch(error => this.handleError(error));
    }

**child button A Apex**

    @AuraEnabled
    public static Boolean updateAsSomeSubStatus(Id recordId) {
       try {
           Opportunity record = new Opportunity(Id = recordId);
           record.Sub_Status__c = "SomeSubStatus";
           update record;
           return true;
       } catch (Exception cause) {
          throw AuraHandledExceptionFactory.create(cause);
       }
    }

**child button B JavaScript**

    handleButtonBClick() {
        updateAsStatusAndSubStatus({ recordId: this.recordId}).then(result => {
            if (result === true) {
                this.backToList();
            }
        }).catch(error => this.handleError(error));
    }

**child button B Apex**

    @AuraEnabled
    public static Boolean updateAsStatusAndSubStatus(Id recordId) {
       try {
           Opportunity record = new Opportunity(Id = recordId);
           record.StageName = "SomeStageName";
           record.Sub_Status__c = null;
           update record;
           return true;
       } catch (Exception cause) {
          throw AuraHandledExceptionFactory.create(cause);
       }
    }

**Both** buttons work, and the record is updated successfully.

**Both** buttons return a `result` of `true`;

**Both** buttons call the `backToList` JavaScript method

    backToList() {
        this.dispatchEvent(new CustomEvent("back"));
    }

The List only only refreshes correctly for button A.

I also have a refresh button on the list which calls `refreshApex` and no matter how many times I click on it, it does not get the refresh records. 

I have to do a hard refresh of the page!

**Question** 

1. What is going wrong? 
2. How can I fix it such that `refreshApex` consistently works?
3. What other ways are there to clear the cache such that `wire` will re-fire?