Disclosure. Dynoxide (wasm) is maintained by the author of this board. Its score is produced by the same automated tests as every other engine, derived from the conformance suite's published results, and isn't adjusted by hand.
How to run it
Every way Dynoxide (wasm) is distributed, each linking to the project's own documentation for it. These are the project's claims, not the suite's measurements.
Needs: a browser, on a secure context
Per-region divergence
The headline is 2 regions, measured against 2 of 33 observed regions, and scored in ap-east-2. Real DynamoDB doesn't behave identically in every region, so a target can match some regions more closely than others. Each figure below is divergence in those regions, best first. eu-west-2 is marked as the historical baseline, and a region that couldn't be resolved this sweep is flagged rather than counted as a disagreement.
Fully supports
Operation areas this target implements completely - every test passes, nothing skipped. Areas it only partly gets wrong are in “Where it falls short” below; the ones it only partly attempts are in “What it doesn’t attempt”.
- batchGetItem tier 1
- batchWriteItem tier 1
- createTable tier 1
- deleteItem tier 1
- deleteTable tier 1
- describeTable tier 1
- getItem tier 1
- listTables tier 1
- query tier 1
- scan tier 1
- updateItem tier 1
- updateTable tier 1
- partiql tier 2
- updateTable tier 2
- legacy-api tier 3
- validation-ordering tier 3
Divergence and coverage over time
Both are plotted because neither reads correctly alone. Divergence falls when a target stops attempting an operation it used to get wrong, so a fall in the first plot is only an improvement if the second one holds.
Divergence
Coverage
By operation
Every operation this target implements, with how much of it diverges and how much of it it covers, on the same two axes as the figures above. The counts are fails over the operation's whole size. full, partial, failing, unsupported. The matrix compares operations across targets.
Tier 1 - Core
- batchGetItem 0/15 0.0% 100.0% batchGetItem: supported, diverges on 0.0% of it, covers 100.0% (15 pass)
- batchWriteItem 0/18 0.0% 100.0% batchWriteItem: supported, diverges on 0.0% of it, covers 100.0% (18 pass)
- createTable 0/30 0.0% 100.0% createTable: supported, diverges on 0.0% of it, covers 100.0% (30 pass)
- deleteItem 0/13 0.0% 100.0% deleteItem: supported, diverges on 0.0% of it, covers 100.0% (13 pass)
- deleteTable 0/3 0.0% 100.0% deleteTable: supported, diverges on 0.0% of it, covers 100.0% (3 pass)
- describeTable 0/4 0.0% 100.0% describeTable: supported, diverges on 0.0% of it, covers 100.0% (4 pass)
- getItem 0/39 0.0% 100.0% getItem: supported, diverges on 0.0% of it, covers 100.0% (39 pass)
- listTables 0/5 0.0% 100.0% listTables: supported, diverges on 0.0% of it, covers 100.0% (5 pass)
- putItem 10/129 7.8% 100.0% putItem: partially supported, diverges on 7.8% of it, covers 100.0% (119 pass, 10 fail)
- query 0/92 0.0% 100.0% query: supported, diverges on 0.0% of it, covers 100.0% (92 pass)
- scan 0/56 0.0% 100.0% scan: supported, diverges on 0.0% of it, covers 100.0% (56 pass)
- updateItem 0/70 0.0% 100.0% updateItem: supported, diverges on 0.0% of it, covers 100.0% (70 pass)
- updateTable 0/15 0.0% 100.0% updateTable: supported, diverges on 0.0% of it, covers 100.0% (15 pass)
Tier 2 - Complete
- account 0/2 · 2 skip n/a 0.0% account: unsupported, implements none of it (2 skip)
- backups 0/5 · 5 skip n/a 0.0% backups: unsupported, implements none of it (5 skip)
- contributorInsights 0/2 · 2 skip n/a 0.0% contributorInsights: unsupported, implements none of it (2 skip)
- export 0/2 · 2 skip n/a 0.0% export: unsupported, implements none of it (2 skip)
- kinesis 0/1 · 1 skip n/a 0.0% kinesis: unsupported, implements none of it (1 skip)
- partiql 0/76 0.0% 100.0% partiql: supported, diverges on 0.0% of it, covers 100.0% (76 pass)
- resourcePolicy 0/2 · 2 skip n/a 0.0% resourcePolicy: unsupported, implements none of it (2 skip)
- streams 0/18 · 18 skip n/a 0.0% streams: unsupported, implements none of it (18 skip)
- tags 0/8 · 8 skip n/a 0.0% tags: unsupported, implements none of it (8 skip)
- transactions 0/62 · 51 skip 0.0% 17.7% transactions: partially supported, diverges on 0.0% of it, covers 17.7% (11 pass, 51 skip)
- ttl 0/7 · 7 skip n/a 0.0% ttl: unsupported, implements none of it (7 skip)
- updateTable 0/14 0.0% 100.0% updateTable: supported, diverges on 0.0% of it, covers 100.0% (14 pass)
- vectorSearch 0/26 · 26 skip n/a 0.0% vectorSearch: unsupported, implements none of it (26 skip)
Tier 3 - Strict
- error-messages 1/174 · 47 skip 0.6% 73.0% error-messages: partially supported, diverges on 0.6% of it, covers 73.0% (126 pass, 1 fail, 47 skip)
- legacy-api 0/42 0.0% 100.0% legacy-api: supported, diverges on 0.0% of it, covers 100.0% (42 pass)
- limits 0/93 · 4 skip 0.0% 95.7% limits: partially supported, diverges on 0.0% of it, covers 95.7% (89 pass, 4 skip)
- validation-ordering 0/31 0.0% 100.0% validation-ordering: supported, diverges on 0.0% of it, covers 100.0% (31 pass)
Where it falls short
Operations Dynoxide (wasm) implements and answers differently from real DynamoDB, biggest gap first. This is what its divergence figure counts. Open one for the exact tests, or see the conformance suite.
-
error-messages Tier 3 1 diverging 47 not attempted
View these tests in the suite →- BatchGetItem - exact error messages empty RequestItems: full required-parameter error source:26
- Conditional check - exact error messages TransactionCanceledException message format
- SearchVectors - exact error messages TopK above the maximum
- SearchVectors - exact error messages missing SearchConditionExpression against a HASH-schema index
- SearchVectors - exact error messages non-equality comparator on the HASH element
- SearchVectors - exact error messages non-equality comparator on an INLINE_FILTER element
- SearchVectors - exact error messages query vector dimension mismatch
- SearchVectors - exact error messages condition attribute outside the SearchSchema
- SearchVectors - exact error messages L-wrapped search vector
- TransactWriteItems - index key error messages Put wrong-typed index key: cancelled with full ValidationError reason
- TransactWriteItems - index key error messages Put non-scalar index key: cancelled with full ValidationError reason
- TransactWriteItems - index key error messages Update wrong-typed index key: cancelled with full ValidationError reason
- TransactWriteItems - index key error messages Update non-scalar index key: cancelled with full ValidationError reason
- TransactWriteItems - index key error messages Put empty-string index key: top-level ValidationException
- TransactWriteItems - index key error messages Update empty-string index key: top-level ValidationException
- TransactWriteItems - index key error messages Put empty-binary index key: top-level ValidationException
- TransactWriteItems - index key error messages Update empty-binary index key: top-level ValidationException
- TransactWriteItems - exact error messages empty TransactItems: full minimum-length error
- TransactWriteItems - exact error messages > 100 actions: anchored regex on the constraint phrase
- TransactWriteItems - exact error messages duplicate target keys in same transaction: full multi-op error
- TransactWriteItems - exact error messages non-existent table: full ResourceNotFoundException message
- TransactWriteItems - exact error messages two failing actions: multi-reason TransactionCanceledException
- TransactWriteItems - exact error messages one passing, one failing: positional reason codes (None for the survivor)
- TransactWriteItems - exact error messages Put wrong-typed table key: cancelled with full ValidationError reason
- TransactWriteItems - exact error messages Put non-scalar table key: cancelled with full ValidationError reason
- TransactWriteItems - exact error messages Put empty-string table key: top-level ValidationException
- TransactWriteItems - exact error messages Update empty-string Key: top-level empty-value message
- TransactWriteItems - exact error messages Delete empty-string Key: top-level empty-value message
- TransactWriteItems - exact error messages ConditionCheck empty-string Key: top-level empty-value message
- TransactWriteItems - exact error messages Update wrong-typed Key: cancelled with schema-mismatch reason
- TransactWriteItems - exact error messages Update non-scalar Key: cancelled with schema-mismatch reason
- TransactWriteItems - exact error messages Delete wrong-typed Key: cancelled with schema-mismatch reason
- TransactWriteItems - exact error messages Delete non-scalar Key: cancelled with schema-mismatch reason
- TransactWriteItems - exact error messages ConditionCheck wrong-typed Key: cancelled with schema-mismatch reason
- TransactWriteItems - exact error messages ConditionCheck non-scalar Key: cancelled with schema-mismatch reason
- TransactWriteItems - exact error messages Put empty-binary item key: top-level empty-value message
- TransactWriteItems - exact error messages Update empty-binary Key: top-level empty-value message
- TransactWriteItems - exact error messages Delete empty-binary Key: top-level empty-value message
- TransactWriteItems - exact error messages ConditionCheck empty-binary Key: top-level empty-value message
- CreateTable vector indexes - exact error messages vector index on a provisioned table
- CreateTable vector indexes - exact error messages SearchSchema attribute missing from AttributeDefinitions
- CreateTable vector indexes - exact error messages Dimensions above the 4096 maximum
- CreateTable vector indexes - exact error messages more vector indexes than the per-table limit
- CreateTable vector indexes - exact error messages two indexes on one attribute with different Dimensions
- PutItem vector writes - exact error messages vector with the wrong dimension count
- PutItem vector writes - exact error messages vector element that is not a number, naming the element
- PutItem vector writes - exact error messages vector attribute that is not a list
- PutItem vector writes - exact error messages empty string in the SearchSchema HASH attribute
-
putItem Tier 1 10 diverging
View these tests in the suite →- PutItem - index write capacity reports the LSI write and folds it into the total source:43
- PutItem - index write capacity reports both arms when a write touches both index kinds source:43
- PutItem - index write capacity charges an identical overwrite no index writes at all source:43
- UpdateItem - index write-capacity ladder charges nothing on the index for a non-projected attribute source:46
- UpdateItem - index write-capacity ladder charges one index write for a projected non-key attribute source:43
- UpdateItem - index write-capacity ladder charges two index writes for a key change: delete plus insert source:43
- UpdateItem - index write-capacity ladder charges one index write to remove the key: delete only source:43
- UpdateItem - index write-capacity ladder walks the same ladder on the LSI key source:43
- DeleteItem - index write capacity charges one write per index the item occupied source:43
- DeleteItem - index write capacity charges only the table write for a sparse item source:43
What it doesn't attempt
Operations Dynoxide (wasm) declines rather than gets wrong, so none of this counts towards its divergence. It is what the gap in its 83.4% coverage is made of. Each test here skipped itself because the target's own feature probe said the operation isn't implemented, which is often a deliberate choice rather than a defect.
-
transactions Tier 2 partly 51 not attempted
View these tests in the suite →- TransactWriteItems - basic functionality executes Put + Update + Delete atomically
- TransactWriteItems - basic functionality commits a Put whose string set carries an empty member
- TransactWriteItems - basic functionality succeeds when ConditionCheck condition is met
- TransactWriteItems - basic functionality rolls back entire transaction when ConditionCheck fails
- TransactWriteItems - basic functionality applies ConditionExpression on Put action
- TransactWriteItems - basic functionality applies ConditionExpression on Update action
- TransactWriteItems - basic functionality applies ConditionExpression on Delete action
- TransactWriteItems - basic functionality executes cross-table transaction (hashTableDef + compositeTableDef)
- TransactWriteItems - basic functionality supports idempotency via ClientRequestToken
- TransactWriteItems - basic functionality rejects same ClientRequestToken with different payload
- TransactWriteItems - basic functionality includes CancellationReasons in error when condition fails
- TransactWriteItems - basic functionality returns ALL_OLD item via ReturnValuesOnConditionCheckFailure
- TransactWriteItems - multiple items puts multiple items in one transaction
- TransactWriteItems - multiple items updates multiple items in one transaction
- TransactWriteItems - multiple items deletes multiple items in one transaction
- TransactWriteItems - validation rejects duplicate target items in same transaction
- TransactWriteItems - validation rejects empty TransactItems
- TransactWriteItems - validation rejects transaction on non-existent table
- TransactWriteItems - validation Put with a wrong-typed table key cancels with a ValidationError reason
- TransactWriteItems - validation Put with a non-scalar table key cancels with a ValidationError reason
- TransactWriteItems - validation Put with an empty-string table key is a top-level ValidationException
- TransactWriteItems - validation Update with an empty-string Key is a top-level ValidationException
- TransactWriteItems - validation Delete with an empty-string Key is a top-level ValidationException
- TransactWriteItems - validation ConditionCheck with an empty-string Key is a top-level ValidationException
- TransactWriteItems - validation Update with a wrong-typed Key cancels with a ValidationError reason
- TransactWriteItems - validation Update with a non-scalar Key cancels with a ValidationError reason
- TransactWriteItems - validation Delete with a wrong-typed Key cancels with a ValidationError reason
- TransactWriteItems - validation Delete with a non-scalar Key cancels with a ValidationError reason
- TransactWriteItems - validation ConditionCheck with a wrong-typed Key cancels with a ValidationError reason
- TransactWriteItems - validation ConditionCheck with a non-scalar Key cancels with a ValidationError reason
- TransactWriteItems - validation Update with attribute_exists rejects non-existent item
- TransactWriteItems - validation Update with attribute_not_exists upserts on non-existent key
- TransactWriteItems - validation Update with comparison condition cancels on non-existent key; no ghost item
- TransactWriteItems - validation Update with combined attribute_exists + equality cancels on non-existent key; no ghost item
- TransactWriteItems - validation mixed transaction: one passing, one failing on non-existent cancels everything
- TransactWriteItems - ConditionExpression parens Put with per-condition parens succeeds on fresh key
- TransactWriteItems - ConditionExpression parens Update with full-expression wrap succeeds when condition holds
- TransactWriteItems - ConditionExpression parens Delete with non-redundant nested parens succeeds when condition holds
- TransactWriteItems - ConditionExpression parens ConditionCheck with per-condition parens passes when condition holds
- TransactWriteItems - ConditionExpression parens cancels transaction when any parenthesised condition fails
- TransactWriteItems - ConsumedCapacity charges 2 write capacity units per item
- TransactWriteItems - ConsumedCapacity: conditional, check, replay, cancel a passing conditional write costs the same 2 WCU/item as an unconditional one
- TransactWriteItems - ConsumedCapacity: conditional, check, replay, cancel a standalone ConditionCheck action costs 2 write capacity units
- TransactWriteItems - ConsumedCapacity: conditional, check, replay, cancel reports write capacity on the first call and read capacity on a same-token replay
- TransactWriteItems - ConsumedCapacity: conditional, check, replay, cancel a cancelled conditional transaction reports no consumed capacity
- TransactWriteItems - index key validation Put with a wrong-typed index key cancels with a ValidationError reason
- TransactWriteItems - index key validation Put with a non-scalar index key cancels with a ValidationError reason
- TransactWriteItems - index key validation Update setting a wrong-typed index key cancels with a ValidationError reason
- TransactWriteItems - index key validation Update setting a non-scalar index key cancels with a ValidationError reason
- TransactWriteItems - index key validation Put with an empty-string index key is a top-level ValidationException
- TransactWriteItems - index key validation Update setting an empty-string index key is a top-level ValidationException
-
vectorSearch Tier 2 none of it 26 not attempted
View these tests in the suite →- SearchVectors - ConsumedCapacity shape reports VectorSearchRequestBytes with no classic capacity fields
- SearchVectors - ConsumedCapacity shape reports the same shape under INDEXES as under TOTAL
- SearchVectors - ConsumedCapacity shape reports nothing under NONE
- PutItem - vector write capacity shape INDEXES adds a per-index VectorWriteRequestBytes map beside the classic fields
- PutItem - vector write capacity shape TOTAL folds nothing in: no vector fields at all
- PutItem - vector write capacity shape a write not touching the vector attribute reports no vector write
- PutItem - vector write capacity shape an identical overwrite reports no vector write: replication is delta-based
- CreateTable - vector index lifecycle walks CREATING to ACTIVE and describes the index faithfully
- CreateTable - vector index lifecycle round-trips a SearchSchema of HASH and INLINE_FILTER elements
- CreateTable - vector index lifecycle accepts the 4096-dimension boundary
- PartiQL - vector indexes are out of reach rejects a PartiQL read of a vector index
- PartiQL - vector indexes are out of reach reads the vector attribute off the base table like any other item
- SearchVectors - deterministic search behaviour COSINE: identical vector scores 0, opposite scores 2, lower is closer
- SearchVectors - deterministic search behaviour EUCLIDEAN: identical vector scores 0, straight-line distance otherwise
- SearchVectors - deterministic search behaviour DOT_PRODUCT: higher is closer and scores can be negative
- SearchVectors - deterministic search behaviour returns the identical vector as the top match
- SearchVectors - deterministic search behaviour omits the vector attribute by default and returns it when projected
- SearchVectors - deterministic search behaviour caps results at the item count with no pagination surface
- SearchVectors - deterministic search behaviour stores full precision on the base table and f32 in the index
- UpdateTable - vector index lifecycle adds an index that backfills like a GSI, enforces one online action, then deletes it
- CreateTable - vector index request validation rejects Dimensions of 0 at the request model layer
- CreateTable - vector index request validation rejects an index name shorter than 3 characters
- SearchVectors - request validation rejects TopK of 0 at the request model layer
- SearchVectors - request validation rejects a search against an index the table does not have
- PutItem - vector index write validation accepts a write missing the HASH attribute but leaves it unreachable through that index
- PutItem - vector index write validation removes an item from the index when its vector attribute is removed
-
streams Tier 2 none of it 18 not attempted
View these tests in the suite →- DynamoDB Streams - basic table with StreamSpecification has LatestStreamArn in DescribeTable
- DynamoDB Streams - basic table StreamSpecification.StreamEnabled is true
- DynamoDB Streams - basic table StreamSpecification.StreamViewType matches what was requested
- DynamoDB Streams - basic ListStreams returns the stream for our table
- DynamoDB Streams - basic ListStreams with TableName filter returns only our table's stream
- DynamoDB Streams - basic DescribeStream returns stream status ENABLED or ENABLING
- DynamoDB Streams - basic DescribeStream returns at least one shard
- DynamoDB Streams - basic each shard has a ShardId
- DynamoDB Streams - basic TRIM_HORIZON returns a valid iterator string
- DynamoDB Streams - basic LATEST returns a valid iterator string
- DynamoDB Streams - basic GetRecords after PutItem contains the new image (INSERT event)
- DynamoDB Streams - basic INSERT record has eventName INSERT
- DynamoDB Streams - basic INSERT record dynamodb.Keys contains the item key
- DynamoDB Streams - basic INSERT record dynamodb.NewImage contains the full item
- DynamoDB Streams - basic GetRecords after UpdateItem contains both old and new images (MODIFY event)
- DynamoDB Streams - basic GetRecords after DeleteItem contains old image (REMOVE event)
- DynamoDB Streams - basic NEW_IMAGE view type records have NewImage but no OldImage on MODIFY
- DynamoDB Streams - basic KEYS_ONLY view type records have Keys but no NewImage or OldImage
-
tags Tier 2 none of it 8 not attempted
View these tests in the suite →- Tags - basic adds tags to a table
- Tags - basic lists tags and verifies they match what was added
- Tags - basic adds additional tags and verifies all tags are present
- Tags - basic removes specific tag keys with UntagResource
- Tags - basic verifies removed tags are gone after untag
- Tags - basic overwrites an existing tag with the same key but different value
- Tags - validation rejects TagResource with an invalid ARN format
- Tags - validation rejects ListTagsOfResource with a non-existent ARN
-
ttl Tier 2 none of it 7 not attempted
View these tests in the suite →- TTL - basic enables TTL on a table
- TTL - basic DescribeTimeToLive returns ENABLED status and correct attribute name after enabling
- TTL - basic DescribeTimeToLive returns DISABLED on a table with no TTL configured
- TTL - basic enables TTL with a different attribute name
- TTL - validation rejects empty attribute name
- TTL - validation rejects UpdateTimeToLive on non-existent table
- TTL - validation rejects DescribeTimeToLive on non-existent table
-
backups Tier 2 none of it 5 not attempted
View these tests in the suite →- Continuous backups - PITR reports PITR DISABLED by default
- Continuous backups - PITR enabling PITR transitions PointInTimeRecoveryStatus to ENABLED
- On-demand backups - lifecycle and restore CreateBackup → DescribeBackup → ListBackups → DeleteBackup
- On-demand backups - lifecycle and restore RestoreTableFromBackup initiates a restore into a new table
- On-demand backups - lifecycle and restore DescribeBackup on a deleted backup throws BackupNotFoundException
-
limits Tier 3 partly 4 not attempted
View these tests in the suite →- TransactWriteItems limits TransactWriteItems with exactly 100 Put actions succeeds
- TransactWriteItems limits TransactWriteItems with 101 actions fails with ValidationException
- TransactWriteItems limits TransactWriteItems total item size approaching 4MB succeeds
- TransactWriteItems limits TransactWriteItems total item size over 4MB fails with ValidationException
-
account Tier 2 none of it 2 not attempted
View these tests in the suite →- Account reads - DescribeLimits, DescribeEndpoints DescribeLimits returns positive account and table capacity limits
- Account reads - DescribeLimits, DescribeEndpoints DescribeEndpoints returns at least one endpoint with an address
-
contributorInsights Tier 2 none of it 2 not attempted
View these tests in the suite →- Contributor insights - enable/describe/list reports DISABLED by default
- Contributor insights - enable/describe/list enabling transitions the status and lists the table
-
export Tier 2 none of it 2 not attempted
View these tests in the suite →- Export and import - S3 ExportTableToPointInTime initiates an export and reports it
- Export and import - S3 ImportTable ingests S3 data into a new table
-
resourcePolicy Tier 2 none of it 2 not attempted
View these tests in the suite →- Resource policies - Put/Get/Delete GetResourcePolicy on a table with no policy throws PolicyNotFoundException
- Resource policies - Put/Get/Delete Put then Get round-trips the policy, and Delete removes it
-
kinesis Tier 2 none of it 1 not attempted
View these tests in the suite →- Kinesis streaming destination enables a streaming destination and reports it via Describe
Run history
Every percentage here is divergence, per tier and over the whole suite, so lower is better in each column. Coverage is the exception it is named as.
| Run | Gradecurrent criteria | Divergence | Movement |
|---|---|---|---|
|
Suite on The board now measures the most recent release tag rather than Every board now says what produced it. A board is graded against the suite manifest and split registry as they stood at the ref it measured. Region health is the exception and is read live, so a region dropped since the tag still counts against today's cohorts. That is the one input allowed to move under a board without a new measurement, and the board carries a health date beside its measurement date to say so. Releases are cut by one workflow dispatch: it bumps the version, dates this section, installs against the bumped tree, tags, and opens a draft release, then starts the measurement. The draft publishes itself when the board carrying that version lands, which takes about three hours. eu-west-2 has crossed to the validation framework's generic constraint message
for The matching validation-ordering row is retired. Both wordings refuse an empty
A probe absent from the baseline is no longer reported as drift. Adding a probe to the capture script leaves every older baseline without it, and a scheduled red then named the new probe as the thing that had moved. The weekly cross-region capture now includes eu-west-2, so the drift lens reads its baseline and the candidate regions from one capture taken at one moment rather than comparing today's candidates against an older baseline file. A scheduled red also keeps the eu-west-2 capture its drift verdict was read from, which was previously discarded with the runner. |
Grade B | 0.9% | unchanged |
| Grade B | 0.9% | unchanged | |
|
Suite on ExtendDB's SQLite backend joins the run, built from the same release as the PostgreSQL one and held to the same TLS, SigV4 and IAM posture, so the storage engine is the only thing that differs between them. A project's other builds now sit behind a disclosure on its row. Every build is measured in full and has a row of its own with its own figures; the disclosure starts closed only when every build under it reads the same grade, divergence and coverage as the row above, and only when each of them was measured in that run: a carried row on either side opens it, and so does a run the suite declined to score. It is read from each run, so a build can start closed on one and open on the next. The README table has no disclosure to offer, so it lists every build outright. Every target in the data endpoints gains two fields.
The |
Grade B | 0.9% | unchanged |
| Grade B | 0.9% | unchanged | |
|
Suite on Read this first if you consume the JSON. The data endpoints go from schema 2 to schema 4 in one step. Schema 3 was never published on its own, so everything on 2 crosses both steps at once. Schema 3 breaks in four ways:
Schema 4 is additive on top: each target carries its grade and the full criteria
in A score is two figures, never oneDivergence is the share of the whole suite a target answers differently from real DynamoDB. Coverage is the share it implements at all. They are reported apart and never summed, because a declined operation is discoverable in minutes and a wrong one in production. No target was re-run for the change and no pass, fail or skip moved: what changed is how the same counts are expressed. Everything else that was a percentage followed the headline down - tier figures, the per-region drilldown, the per-operation table, and the colour bands, which inverted with them. A target's history is two plots rather than one, because divergence falls when a target stops attempting something it used to get wrong, so a divergence line alone can render a withdrawal as an improvement. Every target wears a letterDivergence sets it - A under 5%, B under 15%, C under 25%, D under 35%, F beyond
These are grading criteria version 1, dated in the methodology, which carries the derivation. Where a threshold sits is a hand-picked input to a published letter, and moving one regrades targets whose results never changed, so any change to a band, the coverage weight or the A+ gate bumps the version. The suite grows from 998 tests to 1054Vector search (#125). 42 tests over the deterministic surface DynamoDB
shipped in August 2026: the index lifecycle on both creation paths, request
validation on each plane, rejection wording, write-path validation, search on a
fixture where the nearest neighbour is unambiguous, the two new capacity shapes,
and PartiQL's inability to reach a vector index. Every pinned value was
characterised against real DynamoDB in eu-west-2 before it was asserted. Two
findings worth naming: searching during a backfill is an error, which settles
which side of a contradiction in AWS's own documentation is right - three
developer-guide pages say the call fails, the tutorial page says results can be
incomplete - and an overwrite leaving the stored vector unchanged reports no
vector write capacity at all, because index replication is delta-based. Both
sides are captured in Index write costs (#124). 14 tests. The suite's only per-index capacity assertion was on a Query, so the write side - the half you get billed extra for - went unmeasured. A sub-1KB write costs one unit for the table and one for each index it lands in, and LSI units fold into the total exactly as GSI units do. Moving an item to a new GSI key costs two on that index, a delete and an insert; touching a projected attribute costs one; touching a non-projected attribute costs nothing, and the response carries no arm for that index rather than a zero. An overwrite that leaves the item unchanged reports no index cost whatsoever. The index exclusions create no indexed table (#116). Corrections
|
Grade B | 0.9% | diverged 0.9 percentage points more |
| Grade B | 0.0% | first run |