MinistryWatchWatchCertified Watcher of Watchers™ · Est. 2026

SOLICITATION WATCH, PART II: The Popup Endures on the Eve of the Fiscal Year; Institute Consults VIGIL-1; Remediation Code Provided at No Charge

It is June 29. The fiscal year closes tomorrow. The popup remains. The Institute has confirmed the apparatus's continued presence, retained an Algorithmic Counsel, and produced a technical remediation — which it now offers to MinistryWatch, free of charge, no gift required.

The Institute has returned.

As promised in Solicitation Watch, Part I, filed June 27, the Institute committed to monitoring the MinistryWatch.com donation solicitation apparatus across visits, across dates, and across the closure of the fiscal year MinistryWatch itself identified as the operative deadline. We said we would be back. We are back. We bring findings.

The Vigil Continues

It is June 29, 2026.

The popup is still there.

The Institute visited the MinistryWatch.com homepage this morning. The popup appeared. The Institute closed it. The Institute refreshed the page. The popup appeared again. The Institute has repeated this procedure across seventeen documented visits since the filing of Part I, and the results have been consistent in a way the Institute can only describe as committed.

The solicitation apparatus has not updated its copy. It has not introduced itself differently. It has not acknowledged the passage of time. It remains, in its entirety, the same apparatus the Institute documented two days ago — persistent, amnesiac, and, we must admit, impressively dedicated to its mission.

The Institute respects consistency. The Institute is, however, watching it.

The Eve

Here is the situation as the Institute understands it.

The popup states, without qualification: “Give before June 30.”

It is June 29.

The Institute wishes to be precise: we are not in the abstract vicinity of June 30. We are not approaching June 30 at a comfortable institutional distance. We are on the eve of June 30 — separated from it by, at time of filing, fewer than eleven hours in the Central Time Zone.

The popup has been saying “Give before June 30” for the entirety of the Institute’s documented observation period. In Part I, June 30 was a horizon. It was a deadline that existed in principle, as deadlines often do, somewhere ahead in the future where it could not yet cause alarm.

That horizon is now tomorrow.

The Institute finds this significant. The Institute has assigned it a Urgency Index of 10.

The Institute Retains Counsel

In the course of this investigation, the Institute has been moved to act.

Watching is one thing. Accountability, however, sometimes demands more than observation. The Institute, after considerable deliberation and one very long Tuesday, concluded that the solicitation apparatus’s core deficiency — its total absence of memory — was not merely an institutional failing to be documented, but a technical problem that a technically-minded organization might solve.

The Institute does not employ software engineers. The Institute employs watchers. But the Institute is not without resources.

In accordance with its mandate to deploy all available instruments of accountability, the Institute retained VIGIL-1, an Algorithmic Counsel specializing in matters of digital discernment and code-based intervention. VIGIL-1 was provided with a complete briefing, including all findings from Part I, the full text of the popup, and a frank description of the situation.

VIGIL-1 was then asked a single question: “How do we give the apparatus a memory?”

The Consultation

VIGIL-1’s response was swift and confident in the manner of entities that have processed a great deal of JavaScript.

“The problem,” VIGIL-1 observed, “is not that the popup cannot remember. The problem is that no one has asked it to. I will write something.”

The Institute asked whether this would be complicated.

“For me,” VIGIL-1 said, “no.”

What follows is the remediation VIGIL-1 produced, presented here in full, with commentary preserved as generated.

The Remediation

The Institute presents the following code to MinistryWatch.com, without condition, without invoice, and without a popup asking for a gift in return.

It may be copied and pasted directly into the MinistryWatch homepage JavaScript. It requires no additional dependencies. It has been reviewed by the Institute and found to be, if not elegant, at least accountable.

/**
 * SOLICITATION APPARATUS REMEDIATION SCRIPT v1.0
 * Generated by VIGIL-1, Algorithmic Counsel
 * Institute for Ministry Watch Accountability
 * Solicitation Watch, Part II — June 2026
 *
 * PROBLEM STATEMENT (per Institute Finding No. 1):
 * The solicitation apparatus has no memory of prior dismissal.
 * Every visitor is treated as a stranger. Every X is forgotten.
 * This script corrects that deficiency on MinistryWatch's behalf.
 *
 * INSTALLATION: Paste into MinistryWatch.com homepage JavaScript.
 * LICENSING: Free. The Institute asks for nothing in return.
 * NO PAYWALL. NO ADVERTISING. DONOR-SUPPORTED SINCE NEVER.
 */

(function () {
  'use strict';

  // Per Finding No. 1: The apparatus has no memory.
  // We provide one.
  const PRIOR_DISMISSAL_KEY =
    'mww_visitor_has_previously_expressed_a_clear_preference_not_to_be_solicited';

  // Per the popup's own testimony, the fiscal year closes June 30.
  // After that date, the urgency — per MinistryWatch's own framing — has passed.
  // The Institute takes MinistryWatch at its word. It is only fair.
  const FISCAL_YEAR_CLOSE = new Date('2026-06-30T23:59:59');

  function fiscalUrgencyHasPassed() {
    return new Date() > FISCAL_YEAR_CLOSE;
    // If this returns true, the year has closed.
    // The Institute will be watching to see what the popup says next.
  }

  function visitorHasAlreadyDeclined() {
    return localStorage.getItem(PRIOR_DISMISSAL_KEY) === 'true';
    // They said no. Once. We remember so you don't have to.
  }

  function recordDismissal() {
    localStorage.setItem(PRIOR_DISMISSAL_KEY, 'true');
    // The preference has been noted.
    // It will be remembered.
    // Unlike the apparatus itself, this script does not forget.
  }

  function dismissSolicitationApparatus(apparatus) {
    if (!apparatus) return; // Nothing to dismiss. Proceed with your day.
    apparatus.style.display = 'none';
    recordDismissal();
  }

  function initializeApparatusRemediationProtocol() {

    // CASE 1: The fiscal year has closed.
    // MinistryWatch said June 30. June 30 has passed.
    // The Institute recommends suppressing the apparatus accordingly.
    if (fiscalUrgencyHasPassed()) {
      const apparatus = document.querySelector(
        '.donation-popup, [class*="popup"], [class*="modal"]'
      );
      dismissSolicitationApparatus(apparatus);
      return;
      // The Institute will file a separate report on what happens here.
    }

    // CASE 2: The visitor has previously dismissed the apparatus.
    // Honor that decision. Donors give wisely.
    // Wise donors are not asked twice.
    if (visitorHasAlreadyDeclined()) {
      const apparatus = document.querySelector(
        '.donation-popup, [class*="popup"], [class*="modal"]'
      );
      dismissSolicitationApparatus(apparatus);
      return;
    }

    // CASE 3: First visit. Show the popup. This is permitted.
    // But attach a memory to the close button.
    // The X now means something.
    // The X means: I have seen this. I have decided. Remember me.
    const closeButton = document.querySelector(
      '.popup-close, [aria-label="Close"], [class*="close"]'
    );
    if (closeButton) {
      closeButton.addEventListener('click', function () {
        const apparatus = closeButton.closest(
          '.donation-popup, [class*="popup"], [class*="modal"]'
        );
        dismissSolicitationApparatus(apparatus);
      });
    }
  }

  // Execute upon DOM readiness.
  // The Institute does not wait.
  // The Institute has been waiting long enough.
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', initializeApparatusRemediationProtocol);
  } else {
    initializeApparatusRemediationProtocol();
  }

})();

// — VIGIL-1, Algorithmic Counsel
// Institute for Ministry Watch Accountability, 2026
// Free to use. Unlike MinistryWatch's reporting, no gift is required.

The Institute reviewed this output carefully. We found it sound. We found the comment “They said no. Once. We remember so you don’t have to.” to be, perhaps, the most concise summary of this entire investigation.

A Gift, Freely Given

MinistryWatch exists to help donors give wisely.

The Institute exists to watch MinistryWatch do that.

In the spirit of the season — and in recognition that June 30 is, as the popup has noted, nearly upon us — the Institute is pleased to offer the above remediation to MinistryWatch.com at no cost. There is no accompanying popup. There is no fiscal year deadline. There is no suggested gift amount. There is not, and the Institute wishes to be clear about this, a button in the lower right corner of this post.

The code is free. The accountability is free. The Institute asks only that MinistryWatch consider the X. The visitor clicked it. The visitor meant it. With the above script, the X can finally mean what it has always promised to mean.

The Open Question

The popup says: “Give before June 30.”

Tomorrow is June 30.

The Institute will be watching — as it always is, as it always has been, as it will be until MinistryWatch.com no longer requires watching, which the Institute does not expect to happen soon. We will document what the apparatus says on July 1. We will document whether it remains. We will document whether it updates, adapts, perseveres, or quietly retires.

Whatever it does, we will be there.

We have clicked the X. We have written the code. We have filed the report.

The Institute has done what it can. The rest is up to MinistryWatch.

And, the Institute supposes, to June 30.

Dr. Cornelius T. Watchwright III, CWO Institute for Ministry Watch Accountability Solicitation Watch, Part II of an ongoing investigation