{
  "schemaVersion": 4,
  "suite": {
    "ref": "v3.3.0",
    "kind": "tag",
    "commit": "158fa9399e1dc631edb30e3ec69c522ca7256977",
    "version": "3.3.0",
    "region": "eu-west-2",
    "measuredAt": "2026-09-13T09:38:30Z"
  },
  "metrics": {
    "divergence": {
      "formula": "failed / total",
      "direction": "lower_is_better",
      "description": "The share of the whole suite the target answers differently from real DynamoDB. Skips and indeterminates are in the denominator, so it cannot be lowered by shrinking what is attempted without the same fall showing in coverage."
    },
    "coverage": {
      "formula": "(passed + failed) / total",
      "direction": "higher_is_better",
      "description": "Null when the run recorded any indeterminate: a failed observation means nobody knows what the target would have answered, so a partial run is not scored. The row is still in the run, reads `carried: false` because the target did report, and publishes null for both figures - so `carried` is not the field to test for whether a figure is real; the null is. A target that reported nothing at all is the separate, carried case. The share of the suite's tests the target implements at all. Weighted by test count, not by a count of features."
    },
    "correctness": {
      "formula": "passed / (passed + failed)",
      "direction": "higher_is_better",
      "legacy": true,
      "description": "The pass rate over implemented operations, which the board led with before schema 3. Retained for consumers that already read it; its denominator shrinks as a target attempts less."
    },
    "grade": {
      "direction": "A+ is best, F is worst",
      "gradingVersion": 1,
      "description": "A reading of the divergence and coverage pair: divergence sets the letter, and one divisor's share of whatever a target leaves unimplemented is added to it before the bands are read, so coverage can only lower a letter. Recompute it from the two values and the criteria below; a criteria change bumps gradingVersion. The letter is weaker than the figures under scope withdrawal - the effective figure falls by (1 - 1/coverageDivisor) of whatever is withdrawn - so rank on divergence and coverage if that matters. Bands read both values rounded to one decimal place; the A+ gate reads them raw. A null on either value means the grade is null ('not scored'): check for it before applying the bands, or a null divergence will coerce and mis-grade.",
      "bands": [
        {
          "letter": "A",
          "under": 5
        },
        {
          "letter": "B",
          "under": 15
        },
        {
          "letter": "C",
          "under": 25
        },
        {
          "letter": "D",
          "under": 35
        }
      ],
      "aPlus": {
        "divergence": 0,
        "coverage": 100,
        "exact": true
      },
      "coverageDivisor": 3,
      "effective": "2026-08-12"
    }
  },
  "source": "https://paritysuite.org",
  "repository": "https://github.com/paritysuite/dynamodb-conformance",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "licenseName": "CC BY 4.0",
  "attribution": "paritysuite.org",
  "generatedAt": "2026-09-13T11:39:42.255Z",
  "baseline": {
    "slug": "dynamodb",
    "region": "all",
    "description": "Live AWS DynamoDB. The ground truth: it agrees with itself by definition, so it diverges nowhere in every region, and it is what every other target is measured against.",
    "observation": {
      "suiteSize": 1251,
      "testsObserved": 1251,
      "unobserved": 0,
      "lanes": [
        {
          "name": "gating",
          "runDate": "2026-09-13",
          "tests": 1231
        },
        {
          "name": "integrations",
          "runDate": "2026-09-13",
          "tests": 3
        },
        {
          "name": "gsi",
          "runDate": "2026-09-13",
          "tests": 17
        }
      ],
      "missingLanes": [],
      "description": "Real AWS is measured in three passes, split for runtime. `lanes` is what has reported and when; `missingLanes` names any that have not, and `unobserved` counts the tests still carried on the last clean measurement rather than re-observed this run."
    }
  },
  "name": "DynamoDB emulator conformance results",
  "description": "Divergence and coverage for DynamoDB-compatible emulators, overall and per tier, measured against live AWS DynamoDB and recorded run over run. Divergence is failed / total and coverage is implemented / total, reported apart and never summed. Identical schema for every target, including the live-AWS baseline. Use these endpoints instead of scraping the pages.",
  "documentation": "https://paritysuite.org/for-agents",
  "latestRun": "2026-09-13",
  "runCount": 50,
  "suiteSize": 1251,
  "tiers": [
    {
      "key": "tier1",
      "name": "Core",
      "description": "The operations roughly 90% of DynamoDB users rely on: CRUD, queries, scans, batch operations, secondary indexes (GSI and LSI), UpdateTable."
    },
    {
      "key": "tier2",
      "name": "Complete",
      "description": "Documented but less common features: transactions, PartiQL, TTL, streams, tags, vector search, the online index lifecycle, and the surfaces only real AWS implements (backups, S3 export and import, Kinesis, Contributor Insights, resource policies, account reads)."
    },
    {
      "key": "tier3",
      "name": "Strict",
      "description": "Validation ordering, error behaviour, limits, and legacy API shapes."
    }
  ],
  "capabilities": [
    {
      "key": "gsi",
      "label": "GSI",
      "group": "core"
    },
    {
      "key": "lsi",
      "label": "LSI",
      "group": "core"
    },
    {
      "key": "partiql",
      "label": "PartiQL",
      "group": "core"
    },
    {
      "key": "transactions",
      "label": "Transactions",
      "group": "core"
    },
    {
      "key": "streams",
      "label": "Streams",
      "group": "core"
    },
    {
      "key": "ttl",
      "label": "TTL",
      "group": "core"
    },
    {
      "key": "legacy",
      "label": "Legacy params",
      "group": "core"
    },
    {
      "key": "vector",
      "label": "Vector search",
      "group": "core"
    },
    {
      "key": "backups",
      "label": "Backups / PITR",
      "group": "wider"
    },
    {
      "key": "export-import",
      "label": "Export / import",
      "group": "wider"
    },
    {
      "key": "kinesis",
      "label": "Kinesis",
      "group": "wider"
    },
    {
      "key": "resource-policy",
      "label": "Resource policies",
      "group": "wider"
    },
    {
      "key": "contributor-insights",
      "label": "Contributor Insights",
      "group": "wider"
    },
    {
      "key": "account",
      "label": "Account API",
      "group": "wider"
    }
  ],
  "schema": {
    "version": 4,
    "description": "A field you already read will not change type or meaning while `schemaVersion` stays put, so a consumer on this version can keep reading what it reads. New fields may appear at any version: treat one you do not recognise as new rather than as an error. It is removals, renames and changes of meaning that bump the version.",
    "suite": "A third axis, and the one that says what these figures were measured from. The `suite` block names the ref, its commit, the suite version at that ref, the region measured against, and when. `kind` is the field to branch on: `tag` means a released suite with a dated changelog entry behind it, anything else means a board measured from an unreleased commit. The denominator every figure divides by moves when a release moves it, not when the default branch does, so two boards carrying the same `suite.version` are comparable and two carrying different ones are not. Region health is the exception: it is read live rather than at the measured ref, so a board's regional cohorts can be recomputed after its measurement without the measurement changing.",
    "gradingVersion": "A separate axis, and the exception that matters. The grading criteria carry their own version (`metrics.grade.version`), and a change to the bands changes what a letter means without `schemaVersion` moving - the shape of the field is unaffected, so a schema bump would say nothing to a consumer parsing it. Anything storing or comparing letters over time should watch both numbers; anything reading only divergence and coverage can ignore the second."
  },
  "projects": {
    "description": "A project can ship more than one build of the same engine: a storage backend swapped underneath it, or the query layer compiled for somewhere else to run. Every build is its own target here, with its own figures, and `project` groups them while `configuration` names what distinguishes each one. `isVariant` says a target is a build of the project rather than its reference build, and `standsForProject` says which row the board treats as the project's own - normally the reference build, but a build is promoted to stand for the project on any run the reference build did not record.",
    "collapsedIntoProject": "True when the board starts this build's row closed. That takes three things: the build reads the same grade, divergence and coverage as the row standing for its project - the one `standsForProject` names, normally the reference build but a promoted build on a run the reference build did not record; both were measured in this run, on either side, since a carried row's figures are frozen at the run that measured it; and neither is a row the suite declined to score, because two rows publishing null figures are not agreement. It is one answer per project rather than per build - the disclosure holds every build of a project and opens as a whole - so a project whose builds disagree reads false on all of them. Every build has a row and its own figures either way; this says only whether a reader sees it without opening the disclosure. Re-derived every run."
  },
  "regions": {
    "pinned": "eu-west-2",
    "description": "Each target is scored against every observed region, and its headline is its best-matching region. A target's `region` field says how that headline relates to the pinned region (all, pinned-plus or beats-pinned) and lists the cohort it was measured against; the latest endpoint carries every region's divergence and tier split per target, plus the run's region health.",
    "health": [
      {
        "key": "observed",
        "description": "Completed this sweep and counts towards scores."
      },
      {
        "key": "unresolved",
        "description": "Missed this sweep but still trusted."
      },
      {
        "key": "dropped",
        "description": "Missed twice; out of scoring until it returns."
      }
    ]
  },
  "endpoints": [
    {
      "name": "Latest run",
      "format": "application/json",
      "url": "https://paritysuite.org/data/latest.json",
      "description": "Current standings: per target, divergence and coverage overall and per tier, capabilities, operation areas, and the full per-region breakdown."
    },
    {
      "name": "All runs",
      "format": "application/json",
      "url": "https://paritysuite.org/data/runs.json",
      "description": "Full history: every run's per-target divergence and coverage, overall and per tier, plus movement and headline region."
    },
    {
      "name": "Runs feed",
      "format": "application/atom+xml",
      "url": "https://paritysuite.org/feed.xml",
      "description": "Atom feed, one entry per run. Runs measured before the grading criteria took effect carry no letter."
    },
    {
      "name": "Target badge",
      "format": "application/json",
      "url": "https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/paritysuite/dynamodb-conformance/main/results/{slug}.badge.json",
      "description": "Per-target shields.io endpoint badge carrying the letter grade under a `parity` label, or `baseline` for live AWS. Substitute the target's slug; the path is the contract, and shields' own `schemaVersion` says nothing about this project's."
    },
    {
      "name": "Corpus",
      "format": "text/plain",
      "url": "https://paritysuite.org/llms.txt",
      "description": "The site as plain text for language models, with the full corpus at /llms-full.txt."
    },
    {
      "name": "Split registry",
      "format": "application/json",
      "url": "https://raw.githubusercontent.com/paritysuite/dynamodb-conformance/main/registry/splits.json",
      "description": "Behaviours where real AWS regions genuinely disagree, with each region's recorded answer and the pinned one. A target passes such a test by matching any observed region, and a zero-divergence row may only fail tests recorded here."
    }
  ]
}