# IB Publication Contracts Stalled

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>


## IB Publication Contracts Stalled Alert

**Alert ID:** `ib_pub_contract_stalled`
**Category:** Integration Broker
**Default threshold:** 30 minutes

### What This Alert Detects

This alert finds **Integration Broker publication contracts** that are stuck in **New** or **Working** status and have not progressed beyond that state within the configured threshold.

A stalled publication contract means PeopleSoft has published a message to a subscriber, but the delivery has not completed. The message is either waiting to be picked up (New) or is in the process of being delivered but taking too long (Working).

### When This Matters

Check [IB Nodes Down](/docs/alerts/integration-broker/ib-nodes-down/) and [IB Dispatcher Down](/docs/alerts/integration-broker/ib-dispatcher-down/) first. A stalled pub contract is usually one of those two conditions.

### Severity Logic

|                Condition                 | Severity |
| ---------------------------------------- | -------- |
| Stuck longer than `thresholdMinutes`     | Warning  |
| Stuck longer than `thresholdMinutes × 2` | Critical |

### Alert Details

Each alert item includes:

- Publication contract ID
- Service operation name
- Current status (New or Working)
- How long it has been stuck (in minutes)
- The target subscribing node
- A link to the IB Monitor detail page

### Configuration

```yaml
alerts:
  checks:
    ib_pub_contract_stalled:
      enabled: true
      thresholdMinutes: 30       # Minutes before flagging as Warning
      excludeOperations:         # Operation names to skip
        - LARGE_BATCH_SYNC
```

|       Setting       | Default |                                          Description                                          |
| ------------------- | ------- | --------------------------------------------------------------------------------------------- |
| `thresholdMinutes`  | `30`    | Minutes a contract must be stuck to trigger a Warning. Critical fires at 2× this value.       |
| `excludeOperations` | `[]`    | List of IB operation names to exclude. Use for operations that legitimately take a long time. |

### How to Respond

1. Click the alert link to go to the IB Monitor entry for the stalled contract
2. Check whether the IB dispatchers are running on the PeopleSoft application server
3. Look for a larger backlog (many contracts in New status may mean the dispatcher is down)
4. Check whether the target node's endpoint is reachable
5. Review connector configuration for the target node

### Relationship to Other IB Alerts

For pub contracts that have **already ended in error**, see [IB Publication Contract Errors](/docs/alerts/integration-broker/ib-pub-contract-errors/).

For similar stalled alerts on operations and subscription contracts:

- [IB Operations Stalled](/docs/alerts/integration-broker/ib-operation-stalled/)
- [IB Subscription Contracts Stalled](/docs/alerts/integration-broker/ib-sub-contract-stalled/)
