---
id: w8/m2/t006
title: Render parity — same fields/semantics/errors across REST · GraphQL · MCP; declared drift only
worker: worker8
status: todo
estimate: 30m
depends_on: [w8/m2/t005]
---

## Objective

The standing parity check, applied to a surface that is itself an extension: verify the three adapters expose the **same** fields, semantics, and error shapes (one core, no adapter-only fields), that naming uses Render's vocabulary (compute / bandwidth / pipeline minutes), and that every divergence from Render is the pre-declared one — no silent extras crept in.

## Context

- Standing closing task (`.claude/commands/pm.md`), included because m2 changes REST/GraphQL/MCP surfaces.
- The declared drift (from the milestone README): Render's public API has no usage endpoints; bex adds them deliberately. Anything beyond that (extra fields, different numbers per adapter, undocumented params) is a finding.

## Steps

1. Diff the three adapters' shapes against each other and against t005's docs.
2. Query all three for one workspace/month; assert identical quantities.
3. File follow-up notes for any drift rather than silently shipping it.

## Files

- `lego/backend/internal/usage/` (findings may touch adapters/docs)

## Acceptance criteria

- [ ] Three surfaces, one shape, identical numbers; drift list is exactly the declared extension.

## Out of scope

- The dashboard surface (m3 has its own parity task).
