# Buffer Member

> Signed charge and discharge offers, committed dispatch before any load curtailment, verified self-dispatch, SoC open items, and standalone Grid 1 schedule fallback.

- 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

- `members/buffer.md`
- `specs/gcap/spec.md`
- `specs/g2p/spec.md`
- `architecture/failsafe-model.md`
- `members/allocator.md`

---

---
title: "Buffer Member"
description: "Signed charge and discharge offers, committed dispatch before any load curtailment, verified self-dispatch, SoC open items, and standalone Grid 1 schedule fallback."
---

<Info>
`members/buffer.md` is **Draft — seeking input**. RFC 2119 keywords apply. G2P, GCAP, and DESP are independently versioned on the **26.0-draft** line. Wire format, element state machines, and conformance vectors are unspecified.
</Info>

A Buffer Member is the storage element in `members/buffer.md`: a behind-the-meter or front-of-meter grid battery that broadcasts a signed G2P Service Descriptor offering **− discharge** or **+ charge**, then self-dispatches the Allocator’s **committed dispatch**. GCAP step 2 clears that dispatch **before any Use-class curtailment**. Version 26.0 coordinates energy in the one-minute interval only.

## Status and stack

| Surface | Path | Role for a Buffer |
|---|---|---|
| Member behavior | `members/buffer.md` | Offers, listen set, edge decisions, MUSTS, failsafe, open items |
| Transport | `specs/g2p/spec.md` | Identity, four message families, signed descriptors, authenticated commitments, telemetry |
| Clearing | `specs/gcap/spec.md` | Headroom → buffers → C-B-A curtailment; committed-dispatch output |
| Classes | `specs/desp/spec.md` | Buffer dispatch MUST clear before class A/B/C is curtailed |
| Failsafe | `architecture/failsafe-model.md` | Standalone Grid 1 schedule; no Grid 2 support while in fallback |
| Clock | `architecture/temporal-position.md` | One-minute interval; Grid 1 dispatch prevails on conflict |

Membership is spec compliance at a point of interconnection whose Grid 1 constraints are provisioned to an Allocator. Commercial terms (charging, investment, class-policy limits) stay in the domain agreement, not in the protocol.

## Physical asset and identity

The associated asset is a **grid battery / storage asset** acting as the domain’s buffer.

Every Member Element MUST hold a **stable element identifier** bound to a physical point of interconnection inside a provisioned Allocation Domain. Identifier format is open (G2P §2 recommends a domain-scoped hierarchical ID matching federation nesting). A Buffer can sit in a local utility domain (`Storage A1`, `Storage B1`) or as a **regional** Buffer under the regional constraint domain.

v26.0 scope is bulk-power **energy in the interval**. Voltage support, IEEE 2030.5 distribution devices, and SST/HVDC routing are out of this version.

## Interval contract

```mermaid
sequenceDiagram
  participant B as Buffer Member
  participant A as Allocator
  participant G1 as Grid 1 custodians
  Note over B,A: One-minute interval (G2P / GCAP)
  G1->>A: Constraint set (capacity, transmission, reserves)
  B->>A: Service Descriptor: signed − discharge / + charge
  Note over A: GCAP 1 headroom, then 2 Buffer dispatch, then 3 C→B→A
  A->>B: Commitment: committed dispatch + interval + domain + inputs version
  B->>B: Self-dispatch within agreed ramp rates
  B->>A: Response / Telemetry: verified actual vs Commitment
  alt Missing or stale Commitment
    B->>B: Standalone Grid 1 schedule; no Grid 2 support
  end
```

All four G2P families are per-interval unless noted. Clearing MUST finish so the Member can self-dispatch **before the interval opens**. Exact descriptor / clearing / publication deadlines and clock-sync rules are open.

Where a Grid 1 dispatch instruction conflicts with a Grid 2 allocation, **the Grid 1 instruction prevails**.

## Broadcast: signed charge and discharge offers

The Buffer sits on **either side of the ledger** and MAY switch roles each interval.

<ParamField body="Service Descriptor" type="Member → Allocator (G2P §3.1)" required>
Signed statement of requests/offers over a **forward time vector**.
</ParamField>

<ParamField body="offer" type="− discharge / + charge" required>
Offer to be a **source or a use**. Sign convention is normative in G2P and `members/buffer.md`.
</ParamField>

<ParamField body="units" type="energy in the interval" required>
v26.0 positions MUST be energy within the interval, not other goal-seeks.
</ParamField>

<ParamField body="signature" type="originating Member" required>
Each position MUST be signed. All Service Descriptors and Commitments MUST be authenticated; integrity MUST be verifiable end-to-end.
</ParamField>

<ParamField body="reissue" type="per interval" optional>
A Service Descriptor MAY be reissued each interval.
</ParamField>

A Buffer does **not** publish DESP A/B/C consume buckets. Those positions belong to Use Members. Buffer participation is the signed source/use offer; GCAP consumes it at step 2, not in the class-curtailment step.

Forward-vector length, resolution, and revision rules are open. Encoding, PKI, replay protection, and NERC CIP mapping are open (Discussion: Engineering). Transmission-level deployments are expected on **private networks**.

<RequestExample>
```text title="Conceptual Buffer Service Descriptor (encoding unspecified)"
element_id:    <stable POI-bound id>
domain:        <provisioned Allocation Domain>
interval:      <one-minute clock>
offer_sign:    - | +          # discharge | charge
quantity:      <energy in interval>
forward_vector:<open: length / resolution>
signature:     <originating Member>
```
</RequestExample>

## Listen: committed dispatch before any load curtailment

The Buffer listens only for its Allocator’s **committed dispatch**, not Use `commit-%` and not Source `committed take`.

<ResponseField name="committed dispatch" type="Allocator → Buffer (G2P §3.2 / GCAP §4)">
Cleared **before any load is curtailed**. Applies to the coming interval only and expires with it.
</ResponseField>

<ResponseField name="interval, domain, inputs version" type="required on every Commitment">
The Commitment MUST identify the interval, the domain, and the clearing-inputs version it was computed against.
</ResponseField>

GCAP order is strict and deterministic (identical inputs → identical allocations; Allocator has **no discretion**):

| Step | Action | Buffer effect |
|---|---|---|
| 1 | **Headroom first** — surplus network capability for the interval | May leave nothing for step 2 |
| 2 | **Buffers second** — committed dispatch to absorb **shortfall or surplus** | Dispatch issued here; **before any class is curtailed** |
| 3 | **Ramp down tiered requests** — DESP C → B → A, proportional within class | Use Members only; never Firm (Grid 1) |

Peer-Allocator announcements MAY add boundary headroom but MUST NOT relax local constraints. On stale constraint inputs or partition, the Allocator MUST **withhold clearing**. A Member that has not received a fresh Commitment for the current interval MUST treat itself as in fallback.

Allocator SHOULD publish, inside the domain, the **input digest** each Commitment was computed against.

<ResponseExample>
```text title="Conceptual Buffer Commitment (encoding unspecified)"
element_id:           <same POI-bound id>
domain:               <Allocation Domain>
interval:             <coming one-minute interval>
committed_dispatch:   <energy in interval, signed − / +>
clearing_inputs_ver:  <digest / version>
authentication:       <Allocator>
```
</ResponseExample>

## Edge intelligence

The Allocator does not decide charge vs discharge. The Buffer owns:

- When to discharge vs hold charge for a later peak
- When to charge on surplus
- Protecting a coupled asset (for example a co-located Use Member)
- Its defining job: **reduce how often Grid 2 load goes unmet**

Network-directed storage (anticipatory movement of energy in space and time) is a planned G2TF companion document, not a living spec in this repository. Over time, buffers added to a domain are expected to shrink the unmet/deferred share for Classes B and C.

The Allocator never inspects facility internals. Overlay verification is the **aggregate footprint** (frequency, ACE, flows, peak shaving), not internal SoC or EMS state — except whatever SoC disclosure, if any, is later specified for step-2 clearing.

## Obligations

| Requirement | Normative text |
|---|---|
| Honor dispatch | MUST honor committed dispatch within **agreed ramp rates** |
| Verify | MUST report **verified self-dispatch** (G2P §3.4) |
| Ramp deltas | Per-member allocation deltas between consecutive intervals MUST respect that member’s agreed ramp rates (GCAP §6) |
| Interval-only | Allocations are valid for their interval only |
| Grid 1 conflict | Grid 1 instruction prevails |

G2P §3.4 requires each Member to report **actual per-class dispatch against its Commitment** so compliance is auditable and the overlay footprint is measurable. Buffer offers are not DESP class positions; treat the MUST as **actual dispatch versus the Commitment**. Verification granularity, metering source of truth, and attestation are open.

Pool sizing (Allocator): total participating pool MUST be sized so simultaneous fallback of all Members stays within manageable Grid 1 aggregate ramp limits. That bound is the stated limit on domain growth; methodology is open.

## Failsafe

On loss of Allocator, peers, or fresh context — including a missing or stale Commitment — the Buffer:

1. MUST revert to its **standalone Grid 1 schedule**
2. Carries **no Grid 2 support commitment** while in fallback
3. MUST follow **allowed ramp rates** (into fallback, out of fallback, and between interval allocations)
4. MUST determine fallback from **its own state and last-known configuration** — it MUST NOT depend on reaching a remote element

<Warning>
While in fallback the Buffer does not absorb domain shortfall or surplus for Grid 2. Use Members that expected Buffer relief still fall back independently to their firm-limit / manual-curtailment path.
</Warning>

Quantitative staleness thresholds (missed intervals), re-entry hysteresis, coincidental-fallback stability analysis, and audit/telemetry to verify fallback compliance are open.

## Phase 0 shadow mode

Phase 0 runs the full stack as a dry run: exchange and **track** descriptors and commitments; **execute only the Grid 1 baseline**. A Buffer still signs offers and records committed dispatch, but physical charge/discharge follows the standalone Grid 1 schedule until Phase 1 local integration.

## Open items

Do not implement these as if they were decided.

| Item | Owner / venue |
|---|---|
| How much **SoC** visibility the Allocator needs for GCAP step 2 | `members/buffer.md` |
| Priority among multiple Buffers (proportional vs merit order by round-trip efficiency) | `members/buffer.md` |
| Investment framing when a new battery is needed to support new Grid 2 loads | Discussion: Commercial terms |
| Whether curtailed Source energy can be redirected to a **co-located Buffer** in the same interval | `members/source.md` |
| Forward-vector length, resolution, revision; descriptor / clearing / publication deadlines | G2P §3.1, §4 |
| Telemetry granularity, metering source of truth, attestation | G2P §3.4 |
| Staleness timers, re-entry, coincidental-fallback analysis | Failsafe model |
| Wire format, per-element state machines, conformance vectors | G2P §7 |

## Implement a conformant Buffer

<Steps>
<Step title="Bind identity to a provisioned POI">
Obtain a stable element identifier at a point of interconnection whose transmission-owner constraints are provisioned to the domain Allocator. Membership is spec compliance plus host-utility commercial terms.
</Step>
<Step title="Publish signed source/use offers">
Each interval, emit a G2P Service Descriptor: signed − discharge or + charge, energy in the interval. Reissue when the edge decision changes. Authenticate every descriptor.
</Step>
<Step title="Wait for committed dispatch, then self-dispatch">
Accept only Commitments that name interval, domain, and clearing-inputs version. Honor committed dispatch within agreed ramp rates **before the interval opens**. If Grid 1 issues a conflicting instruction, follow Grid 1.
</Step>
<Step title="Report verified actuals">
Send G2P Response / Telemetry of actual dispatch versus the Commitment. Keep records auditable; do not expose facility internals the Allocator is not specified to see.
</Step>
<Step title="Fail locally on stale or missing commit">
If no fresh Commitment arrives for the current interval, revert to the standalone Grid 1 schedule with no Grid 2 support, ramping only at agreed rates. Do not wait for a peer to confirm fallback.
</Step>
</Steps>

## Related pages

<CardGroup>
<Card title="G2P reference" href="/g2p-reference">
Element identity, four message families, authenticated descriptors and commitments, stale-commitment faults.
</Card>
<Card title="GCAP reference" href="/gcap-reference">
Headroom, then buffers, then C-B-A curtailment; committed-dispatch outputs; determinism.
</Card>
<Card title="Allocator" href="/allocator">
No-discretion clearing, withhold-on-stale, federation announcements, whole-pool ramp sizing.
</Card>
<Card title="Failsafe model" href="/failsafe-model">
Standalone Grid 1 schedule, interval-only commitments, locally determinable fallback.
</Card>
<Card title="Use Member" href="/use-member">
Per-class consume positions and commit-% — what Buffer dispatch is meant to protect.
</Card>
<Card title="Source Member" href="/source-member">
Supply offers and the open co-located-Buffer redirect question.
</Card>
<Card title="One-minute window" href="/one-minute-window">
Commit-before-open and the Grid 1-prevails conflict rule.
</Card>
<Card title="Run Phase 0 shadow mode" href="/phase-0-shadow-mode">
Exchange and track commitments; execute only the Grid 1 baseline.
</Card>
</CardGroup>
