# Service classes

> DESP classes A, B, and C above Grid 1 Firm, curtailment order C then B then A, Firm/Semi-Firm/Flex aliases, and per-interval reclassification.

- Repository: g2tf-org/g2tf-standards
- GitHub: https://github.com/g2tf-org/g2tf-standards
- Human docs: https://grok-wiki.com/public/docs/g2tf-org-g2tf-standards-436ba3f3e0ff
- Complete Markdown: https://grok-wiki.com/public/docs/g2tf-org-g2tf-standards-436ba3f3e0ff/llms-full.txt

## Source Files

- `specs/desp/spec.md`
- `specs/gcap/spec.md`
- `specs/g2p/spec.md`
- `members/use.md`
- `rfcs/grid-2-rfc-1.pdf`

---

---
title: "Service classes"
description: "DESP classes A, B, and C above Grid 1 Firm, curtailment order C then B then A, Firm/Semi-Firm/Flex aliases, and per-interval reclassification."
---

DESP (`specs/desp/spec.md`, version **26.0-draft**) is the Grid 2 service-class taxonomy. Use Members advertise one signed consume position per class in a G2P Service Descriptor; GCAP Allocators MUST honor class order when constraints bind; Traditional Firm (Grid 1) sits outside the overlay and is never cut by GCAP.

## Class stack

Grid 2 stratifies demand **above** the existing firm layer. Classes **A**, **B**, and **C** together are traditional non-firm demand (RFC #1, Figure 2).

```text
 Grid 1  Traditional Firm          served under existing firm service
         ────────────────────────────────────────────────────────────
 Grid 2  A  Assured      highest non-firm   curtailed last
         B  Preferred    middle             curtailed after C, before A
         C  Best Efforts lowest             curtailed first
         ────────────────────────────────────────────────────────────
         Buffer committed dispatch clears BEFORE any A/B/C cut
```

| Class | Canonical name | Position | Semantics |
|---|---|---|---|
| — | Traditional Firm (Grid 1) | Base | Outside Grid 2. Served per existing firm service. **Never curtailed by GCAP.** |
| **A** | Assured | Highest non-firm | Curtailed last among Grid 2 classes. Latency-sensitive, hard-to-defer demand. |
| **B** | Preferred | Middle | Curtailed after C, before A. Deferrable-with-constraints demand. |
| **C** | Best Efforts | Lowest | Curtailed first. Unmet or deferred most often. Statistical-multiplexing tier. |

<Warning>
Naming is not closed. RFC #1 Protocol Interactions uses **Firm / Semi-Firm / Flex** for the three Use positions. DESP maps those aliases to **A / B / C**. Reconciliation of Assured/Preferred/Best-Efforts vs. Firm/Semi-Firm/Flex is an explicit DESP open item. Implement against letter codes **A**, **B**, **C** until the living spec settles names.
</Warning>

| RFC #1 / interaction-table alias | DESP letter | DESP name |
|---|---|---|
| Firm | A | Assured |
| Semi-Firm | B | Preferred |
| Flex | C | Best Efforts |

Do not confuse the **Firm** alias for Class A with **Traditional Firm (Grid 1)**. The latter is not a DESP class and is not a G2P Use position.

## Normative ordering

When GCAP still needs relief after headroom and Buffer dispatch, it ramps down Use allocations in this order only:

1. **C** Best Efforts first
2. **B** Preferred next
3. **A** Assured last
4. **Traditional Firm (Grid 1)** is never touched

Additional MUSTS from DESP §2 and GCAP §3:

- Class ordering for curtailment MUST be **C → B → A**.
- Buffer **committed dispatch** MUST clear **before any class is curtailed**.
- Within a class, curtailment MUST be **proportional** (connection size and differential request size). The exact weighting formula is still open in GCAP §7.
- Allocations apply to the **coming one-minute interval only** and expire with it.

<Info>
Buffers are not A/B/C. A Buffer offers signed charge (+) / discharge (−) and receives **committed dispatch**, not per-class commit-%. Sources in v26.0 offer a single **committed take**; mirrored A/B/C on supply is an open item on the Source Member spec.
</Info>

## What travels on the wire (logical)

G2P carries the taxonomy; it does not define it. Wire format is unspecified.

**Use → Allocator** — Service Descriptor (`G2P` §3.1)

<ParamField body="request to consume" type="signed position per class (+)" required>
One signed position per DESP class over a forward time vector. Units are energy in the interval (v26.0 scope).
</ParamField>

<ParamField body="class set" type="A | B | C" required>
Positions MAY change when the descriptor is reissued. Classes MAY change per interval (DESP dynamic reclassification).
</ParamField>

**Allocator → Use** — Commitment (`G2P` §3.2)

<ResponseField name="commit-%" type="per-class percentage">
Per-class allocation for the coming interval. Identifies interval, domain, and clearing-inputs version.
</ResponseField>

<ResponseField name="committed dispatch / committed take" type="Buffer / Source">
Not classed A/B/C in v26.0. Buffer dispatch is step 2 of GCAP, before any load cut.
</ResponseField>

**Use → Allocator** — Response / Telemetry (`G2P` §3.4)

Members MUST report **actual per-class dispatch** against the Commitment (verified self-dispatch).

```mermaid
sequenceDiagram
  participant Use as Use Member
  participant G2P as G2P
  participant Alloc as Allocator (GCAP)
  Use->>G2P: Service Descriptor<br/>signed +A +B +C (energy / interval)
  G2P->>Alloc: in-zone descriptors
  Note over Alloc: 1 headroom<br/>2 Buffer dispatch<br/>3 cut C then B then A<br/>never Grid 1 Firm
  Alloc->>G2P: Commitment<br/>per-class commit-%
  G2P->>Use: commit-% for coming minute
  Use->>G2P: per-class verified self-dispatch
```

## Per-interval reclassification

Classification is **dynamic**. A Member MAY reclassify request buckets **each interval**.

<Steps>
  <Step title="Map workloads at the edge">
    The Use Member owns how internal workloads land on A/B/C. The Allocator never sees or directs facility internals; it clears **class-level positions only**.
  </Step>
  <Step title="Sign one consume position per class">
    Broadcast a G2P Service Descriptor: one signed `request to consume (+)` per class over the forward time vector. Reissue the descriptor if the mix changes.
  </Step>
  <Step title="Listen for per-class commit-%">
    Self-dispatch within that interval's commit-% and agreed host-utility ramp rates. Report verified per-class dispatch.
  </Step>
  <Step title="Treat missing or stale commit as fallback">
    Revert to the Grid 1 baseline (firm load limit) or manual curtailment. Fallback is locally determinable; it MUST NOT depend on a remote peer.
  </Step>
</Steps>

<Note>
Reclassification does not change GCAP order. Moving energy from C into A raises that bucket's protection only for intervals where the new descriptor is cleared. There is no specified carry of unmet Class C into later intervals (GCAP open: does deferred Class C accrue priority?).
</Note>

## Domain class policy

A domain **MAY** constrain the mix a Member can declare (for example a minimum Class C share for expedited interconnection). Those limits are **commercial-terms** in the domain agreement, not protocol fields. Whether the standard itself should give guidance or limits on differential classes is an RFC #1 open question (Discussion: Commercial terms).

Technical membership is spec compliance at a provisioned point of interconnection. Class caps, enforcement of flex capability, and charging for Grid 2-enabled use stay outside DESP/GCAP/G2P.

## Allocator behavior (class-relevant)

The Allocator has **no discretion**. Given identical inputs, any conformant GCAP implementation MUST emit identical per-class allocations.

| GCAP step | Class effect |
|---|---|
| 1. Headroom | Surplus network capability for the interval, before any cut |
| 2. Buffers | Absorb shortfall or surplus; **before any load curtailment** |
| 3. Tiered ramp-down | Reduce Use allocations **C, then B, then A** |
| Within class | Proportional to connection size and differential request size |
| Stale / partition | Allocator MUST NOT clear; Members fall back |
| Ramp safety | Consecutive-interval allocation deltas MUST respect each member's agreed ramp rates |

Federation announcements MAY add boundary headroom but MUST NOT relax local constraints. Whether announcements carry **per-class aggregates** or only boundary headroom is open.

## What is not specified yet

Treat these as unimplemented, not implied:

| Open item | Owner |
|---|---|
| Assured/Preferred/Best-Efforts vs. Firm/Semi-Firm/Flex names | DESP §5 |
| Fixed three classes vs. domain-extensible class count | DESP §5 |
| Per-class unmet-frequency envelopes (SLA-like) | DESP §5 |
| Per-class ramp-rate and snap-back limits (research cites 15-minute ramp discipline) | DESP §5 |
| Enforcement of declared class behavior beyond G2P §3.4 telemetry | DESP §5 |
| Exact intra-class proportionality formula | GCAP §7 |
| Fairness across intervals for deferred Class C | GCAP §7 |
| Standard workload→class mapping per facility type | Use Member; DESP §3 is informative only |
| Mid-interval return of unused committed allocation | Use Member open items |
| A/B/C structure for Source offers | Source Member (single class in v26.0) |

Informative Flex 0–3 and ERCOT CLR/PCLR alignments belong on the mapping page, not in the Allocator.

## Failure and fallback vs. class cuts

Class cuts are **normal GCAP output** (a commit-% below 100% on C, then B, then A). Failsafe is different: missing or stale Commitment, lost peers, or an Allocator that withholds clearing.

| Event | Use Member |
|---|---|
| Cleared commit-% &lt; 100% on a class | Self-dispatch that class to the committed share |
| No fresh Commitment for the interval | MUST revert to Grid 1 firm load limit or manual curtailment; follow allowed ramps |
| Overlay plane down | Same Grid 1 baseline; orchestration failure MUST NOT leave the grid worse than pre-Grid 2 |

## Next

<CardGroup>
  <Card title="DESP reference" href="/desp-reference">
    Class table, mandatory C-B-A order, domain class-policy limits, and remaining naming/SLA items.
  </Card>
  <Card title="GCAP reference" href="/gcap-reference">
    Headroom, then buffers, then tiered curtailment; per-class commit outputs; determinism.
  </Card>
  <Card title="Map workloads to classes" href="/map-workloads-to-classes">
    Informative Flex 0–3 and ERCOT CLR/PCLR mappings; what the Allocator never sees.
  </Card>
  <Card title="Use Member" href="/use-member">
    Per-class consume positions, commit-% listen, self-dispatch MUSTS, firm-limit fallback.
  </Card>
</CardGroup>
