# Process Run Check

LLMS index: [llms.txt](/llms.txt)

---

<div id="pslens-context-panel" class="card border-info mb-4 d-none">
  <div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle">
    <i class="bi bi-info-circle-fill me-2"></i>
    <span>Tailored Operational Context</span>
  </div>
  <div class="card-body p-0">
    <ul class="list-group list-group-flush">
      <li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Target Database:</strong>
        <span id="ctx-db" class="badge bg-secondary font-monospace">&mdash;</span>
      </li>
      <li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Context Type:</strong>
        <span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase">&mdash;</span>
      </li>
      <li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Alert Severity:</strong>
        <span id="ctx-severity" class="badge">&mdash;</span>
      </li>
      <li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Triggered Time:</strong>
        <span id="ctx-time" class="text-muted small">&mdash;</span>
      </li>
      <li id="row-details" class="list-group-item py-2 d-none">
        <strong id="label-details" class="d-block mb-1">Firing Context:</strong>
        <code id="ctx-details" class="d-block p-2 bg-light border rounded small" style="white-space: pre-wrap; word-break: break-all;">&mdash;</code>
      </li>
    </ul>
  </div>
</div>

<script>
  (function() {
    const params = new URLSearchParams(window.location.search);
    const metadata = params.get('metadata');
    if (!metadata) return;

    try {
      
      const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
      const jsonStr = decodeURIComponent(escape(window.atob(base64)));
      const data = JSON.parse(jsonStr);

      if (data) {
        let hasData = false;

        if (data.db) {
          document.getElementById('ctx-db').textContent = data.db;
          document.getElementById('row-db').classList.remove('d-none');
          hasData = true;
        }

        if (data.type) {
          document.getElementById('ctx-type').textContent = data.type;
          document.getElementById('row-type').classList.remove('d-none');
          hasData = true;
        }

        if (data.severity) {
          const severityBadge = document.getElementById('ctx-severity');
          const severity = data.severity.toLowerCase();
          severityBadge.textContent = severity.toUpperCase();
          if (severity === 'critical') {
            severityBadge.className = 'badge bg-danger';
          } else if (severity === 'warning') {
            severityBadge.className = 'badge bg-warning text-dark';
          } else {
            severityBadge.className = 'badge bg-info';
          }
          document.getElementById('row-severity').classList.remove('d-none');
          hasData = true;
        }

        if (data.t) {
          const date = new Date(data.t * 1000);
          document.getElementById('ctx-time').textContent = date.toLocaleString();
          document.getElementById('row-time').classList.remove('d-none');
          hasData = true;
        }

        if (data.details) {
          document.getElementById('ctx-details').textContent = data.details;

          
          const labelDetails = document.getElementById('label-details');
          if (data.type === 'object') {
            labelDetails.textContent = 'Object Metadata Details:';
          } else if (data.type === 'report') {
            labelDetails.textContent = 'Report Description:';
          } else {
            labelDetails.textContent = 'Firing Context:';
          }

          document.getElementById('row-details').classList.remove('d-none');
          hasData = true;
        }

        if (hasData) {
          document.getElementById('pslens-context-panel').classList.remove('d-none');
        }
      }
    } catch (e) {
      console.error('Failed to parse operational context metadata:', e);
    }
  })();
</script>


## Process Run Check Report

**Report ID:** `process-run-check`
**Category:** Process Scheduler

## Purpose

This report verifies that a set of critical batch processes have run successfully within a configurable time window. It checks each process for a recent successful completion and flags any that are missing or have not completed successfully.

The report answers: "Have my critical processes run successfully in the last N hours?"

## Parameters

|  Parameter  | Default |                                                        Description                                                        |
| ----------- | ------- | ------------------------------------------------------------------------------------------------------------------------- |
| `processes` | (none)  | Comma-separated list of process names to check (e.g., `PSXPIDX,PRCSJOBPURGE,PSRUNSTATS`). Required. Maximum 50 processes. |
| `hours`     | `24`    | Time window in hours. The report checks for successful runs within this many hours from now.                              |

## Tables Queried

### PSPRCSRQST — Process Request Instances

Queried twice per process name:

|     Query     |                      Fields Used                       |                                  Filter                                  |
| ------------- | ------------------------------------------------------ | ------------------------------------------------------------------------ |
| Latest run    | PRCSNAME, PRCSINSTANCE, RUNSTATUS, BEGINDTTM, RQSTDTTM | `PRCSNAME = '{name}'`, ordered by PRCSINSTANCE DESC, limit 1             |
| Success check | PRCSNAME, PRCSINSTANCE, RUNSTATUS, BEGINDTTM           | `PRCSNAME = '{name}' AND RUNSTATUS = 9 AND BEGINDTTM >= cutoff`, limit 1 |

## Data Flow

```text
1. Parse process names from comma-separated parameter
   Calculate cutoff time (now - hours)
        |
        v
2. For each process name:
   a. Query PSPRCSRQST for most recent run (any status)
   b. Query PSPRCSRQST for most recent successful run (status=9) since cutoff
        |
        v
3. Sort results: failures first, then passes
        |
        v
4. Generate Markdown report:
   - Summary with pass/fail counts
   - Results table
   - Recommendations for failures
```

## Report Output

The generated report contains:

- **Header** with database name, generation timestamp, and time window
- **Summary** showing how many processes passed vs. failed
- **Results Table** with columns: Status (PASS/FAIL), Process Name, Last Run Time, Last Run Status, Successful Run in Window
- **Recommendations** section for any failing processes with details about their last run

## Interpreting Results

- **PASS**. The process had at least one successful run (RUNSTATUS=9) within the time window
- **FAIL**. No successful run was found within the time window. This could mean:
  - The process ran but ended in error or another non-success status
  - The process has not run at all within the window
  - The process has never run (no history in PSPRCSRQST)
- The "Last Run Time" and "Last Run Status" columns show the most recent run regardless of status, so you can see if it ran but failed

## Use Cases

1. **Morning Operations Check**. Verify that overnight batch processes completed successfully before the business day starts
2. **Critical Process Monitoring**. Confirm that essential processes (search index builds, security syncs, integration processes) are running on schedule
3. **Post-Maintenance Verification**. After system maintenance, verify that all scheduled processes have resumed and are completing successfully
4. **SLA Compliance**. Document that required processes are running within expected timeframes
