Dynamodb Datastore
Stores swamp runtime data in AWS DynamoDB with conditional-write distributed locking (fencing tokens + TTL-as-defense-in-depth) and chunked blob storage for items exceeding DynamoDB's 400KB size limit. Emits OpenTelemetry spans for DynamoDB operations, lock acquisition/release, and push/pull sync so datastore activity is visible in traces when a TracerProvider is configured.
2026.09.04.1
Changed: Bump @aws-sdk/* 3.1121.0 → 3.1126.0 (2 packages)
2026.08.29.1
Changed: Bump @aws-sdk/* 3.1120.0 → 3.1121.0. Dependency-only update; no schema, API, or behavioral changes.
2026.08.28.2
Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.
Upgrade note: License text only. No API, schema, or runtime behavior changed.
2026.08.28.1
Changed: Bump @aws-sdk/* 3.1114.0 → 3.1120.0 (2 packages)
Fixed: Removed dead, unused @aws-sdk/client-dynamodb and
@aws-sdk/lib-dynamodb entries from the deno.json import map. All source
imports already use inline npm: specifiers, so the map entries were
unreferenced; they were pinned at a stale 3.1091.0 and pulled a ghost version
into deno.lock. No behavioral change.
2026.08.26.3
Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry
quality scorer can resolve dependencies and score the extension. An earlier
release used a bare "zod" import-map specifier, which published but scored as
unscored.
Changed: Retained explicit compilerOptions.strict in deno.json. No
behavioral or schema changes.
Stores swamp runtime data in AWS DynamoDB with conditional-write distributed locking and chunked blob storage.
Config Fields
| Field | Type | Description |
|---|---|---|
| region | string | AWS region for the DynamoDB table |
| tableName | string | DynamoDB table name (single-table design: locks, file chunks/metadata, sync state) |
| endpoint? | string | Custom endpoint URL — for DynamoDB Local or VPC endpoints only. Leave unset for production AWS. |
| autoCreateTable | boolean | Create the table (with GSI and TTL) on first use if missing. Requires |
| maxChunkBytes | number | Max raw bytes per chunk item before splitting a file across multiple DynamoDB items. |
2026.08.29.1
Changed: Bump @aws-sdk/* 3.1120.0 → 3.1121.0. Dependency-only update; no schema, API, or behavioral changes.
2026.08.28.2
Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.
Upgrade note: License text only. No API, schema, or runtime behavior changed.
2026.08.28.1
Changed: Bump @aws-sdk/* 3.1114.0 → 3.1120.0 (2 packages)
Fixed: Removed dead, unused @aws-sdk/client-dynamodb and
@aws-sdk/lib-dynamodb entries from the deno.json import map. All source
imports already use inline npm: specifiers, so the map entries were
unreferenced; they were pinned at a stale 3.1091.0 and pulled a ghost version
into deno.lock. No behavioral change.
2026.08.26.3
Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry
quality scorer can resolve dependencies and score the extension. An earlier
release used a bare "zod" import-map specifier, which published but scored as
unscored.
Changed: Retained explicit compilerOptions.strict in deno.json. No
behavioral or schema changes.
2026.08.28.2
Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.
Upgrade note: License text only. No API, schema, or runtime behavior changed.
2026.08.28.1
Changed: Bump @aws-sdk/* 3.1114.0 → 3.1120.0 (2 packages)
Fixed: Removed dead, unused @aws-sdk/client-dynamodb and
@aws-sdk/lib-dynamodb entries from the deno.json import map. All source
imports already use inline npm: specifiers, so the map entries were
unreferenced; they were pinned at a stale 3.1091.0 and pulled a ghost version
into deno.lock. No behavioral change.
2026.08.26.3
Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry
quality scorer can resolve dependencies and score the extension. An earlier
release used a bare "zod" import-map specifier, which published but scored as
unscored.
Changed: Retained explicit compilerOptions.strict in deno.json. No
behavioral or schema changes.
2026.08.28.1
Changed: Bump @aws-sdk/* 3.1114.0 → 3.1120.0 (2 packages)
Fixed: Removed dead, unused @aws-sdk/client-dynamodb and
@aws-sdk/lib-dynamodb entries from the deno.json import map. All source
imports already use inline npm: specifiers, so the map entries were
unreferenced; they were pinned at a stale 3.1091.0 and pulled a ghost version
into deno.lock. No behavioral change.
2026.08.26.3
Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry
quality scorer can resolve dependencies and score the extension. An earlier
release used a bare "zod" import-map specifier, which published but scored as
unscored.
Changed: Retained explicit compilerOptions.strict in deno.json. No
behavioral or schema changes.
2026.08.26.3
Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry
quality scorer can resolve dependencies and score the extension. An earlier
release used a bare "zod" import-map specifier, which published but scored as
unscored.
Changed: Retained explicit compilerOptions.strict in deno.json. No
behavioral or schema changes.
2026.08.26.1
Changed: Normalized deno.json configuration for repo-wide consistency:
added explicit compilerOptions.strict and migrated zod dependency to the
import map (bare "zod" specifier instead of inline npm:zod@4.4.3). No
behavioral changes — runtime resolution is identical.
2026.08.25.1
Changed: Updated labels for improved extension discoverability. Added cross-cutting category labels (security, observability, finops, infrastructure, networking, compliance, devops, ai, incident-response) where applicable.
updated labels
2026.08.24.1
Added Troubleshooting section documenting silent heartbeat/release failures, missing profile config, autoCreateTable permissions, chunk cleanup leaks, BatchWriteItem retry budget, dirty paths cap, maxChunkBytes limits, and retryable error codes.
2026.08.21.1
Changed: Error messages name the DynamoDB operation and lock key/path involved, instead of a bare SDK error.
- Lock operations (
acquire,renew/heartbeat,inspect,forceRelease) wrap any SDK failure other than the expectedConditionalCheckFailedExceptioncontention signal with the operation and lock key (e.g.DynamoDB acquire failed for lock "/repo/state" in table "swamp-datastore": <reason>), instead of a bare AWS error with no indication of which lock was affected. retryable()now accepts anopLabel, wired up across sync push/pull (shard/partition queries, chunk fetches, file writes, tombstones, the commit-sequence watermark, partition registration) so a failure names the file or partition it was operating on instead of an opaque SDK exception.- The table health check (
createVerifier) now reports the failed operation and table name instead of the bareString(error).
No changes to request/response shapes, retry behavior, or existing successful-path behavior.
2026.08.20.1
Changed: Bump @aws-sdk/* 3.1111.0 → 3.1114.0 (2 packages)
2026.08.15.1
Changed: Bump @aws-sdk/* 3.1104.0 → 3.1111.0 (2 packages)
2026.08.05.1
Changed: Bump @aws-sdk/* 3.1101.0 → 3.1104.0 (2 packages)
2026.08.02.1
Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)
2026.07.31.1
Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)
2026.07.29.1
Added: Parallel push writes with bounded concurrency (10 concurrent
writeFileEntry calls). Reduces push latency 5-10x for bulk operations.
Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull
fast-path now compares a monotonic integer instead of parsing ISO timestamps,
eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq
for fast-path comparison across sessions.
Changed: Pull captures remoteSeq before partition queries (not after)
to prevent TOCTOU races where concurrent pushes during the fetch window could
be silently missed.
Changed: FakeDynamoTable test double handles numeric ADD operations and
throws on undefined ExpressionAttributeValues references.
2026.07.27.1
Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)
Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
2026.08.20.1
Changed: Bump @aws-sdk/* 3.1111.0 → 3.1114.0 (2 packages)
2026.08.15.1
Changed: Bump @aws-sdk/* 3.1104.0 → 3.1111.0 (2 packages)
2026.08.05.1
Changed: Bump @aws-sdk/* 3.1101.0 → 3.1104.0 (2 packages)
2026.08.02.1
Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)
2026.07.31.1
Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)
2026.07.29.1
Added: Parallel push writes with bounded concurrency (10 concurrent
writeFileEntry calls). Reduces push latency 5-10x for bulk operations.
Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull
fast-path now compares a monotonic integer instead of parsing ISO timestamps,
eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq
for fast-path comparison across sessions.
Changed: Pull captures remoteSeq before partition queries (not after)
to prevent TOCTOU races where concurrent pushes during the fetch window could
be silently missed.
Changed: FakeDynamoTable test double handles numeric ADD operations and
throws on undefined ExpressionAttributeValues references.
2026.07.27.1
Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)
Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
2026.08.15.1
Changed: Bump @aws-sdk/* 3.1104.0 → 3.1111.0 (2 packages)
2026.08.05.1
Changed: Bump @aws-sdk/* 3.1101.0 → 3.1104.0 (2 packages)
2026.08.02.1
Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)
2026.07.31.1
Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)
2026.07.29.1
Added: Parallel push writes with bounded concurrency (10 concurrent
writeFileEntry calls). Reduces push latency 5-10x for bulk operations.
Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull
fast-path now compares a monotonic integer instead of parsing ISO timestamps,
eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq
for fast-path comparison across sessions.
Changed: Pull captures remoteSeq before partition queries (not after)
to prevent TOCTOU races where concurrent pushes during the fetch window could
be silently missed.
Changed: FakeDynamoTable test double handles numeric ADD operations and
throws on undefined ExpressionAttributeValues references.
2026.07.27.1
Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)
Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
2026.08.05.1
Changed: Bump @aws-sdk/* 3.1101.0 → 3.1104.0 (2 packages)
2026.08.02.1
Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)
2026.07.31.1
Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)
2026.07.29.1
Added: Parallel push writes with bounded concurrency (10 concurrent
writeFileEntry calls). Reduces push latency 5-10x for bulk operations.
Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull
fast-path now compares a monotonic integer instead of parsing ISO timestamps,
eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq
for fast-path comparison across sessions.
Changed: Pull captures remoteSeq before partition queries (not after)
to prevent TOCTOU races where concurrent pushes during the fetch window could
be silently missed.
Changed: FakeDynamoTable test double handles numeric ADD operations and
throws on undefined ExpressionAttributeValues references.
2026.07.27.1
Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)
Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
2026.08.02.1
Changed: Bump @aws-sdk/* 3.1100.0 → 3.1101.0 (2 packages)
2026.07.31.1
Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)
2026.07.29.1
Added: Parallel push writes with bounded concurrency (10 concurrent
writeFileEntry calls). Reduces push latency 5-10x for bulk operations.
Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull
fast-path now compares a monotonic integer instead of parsing ISO timestamps,
eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq
for fast-path comparison across sessions.
Changed: Pull captures remoteSeq before partition queries (not after)
to prevent TOCTOU races where concurrent pushes during the fetch window could
be silently missed.
Changed: FakeDynamoTable test double handles numeric ADD operations and
throws on undefined ExpressionAttributeValues references.
2026.07.27.1
Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)
Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
2026.07.31.1
Changed: Bump @aws-sdk/* 3.1096.0 → 3.1100.0 (2 packages)
2026.07.29.1
Added: Parallel push writes with bounded concurrency (10 concurrent
writeFileEntry calls). Reduces push latency 5-10x for bulk operations.
Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull
fast-path now compares a monotonic integer instead of parsing ISO timestamps,
eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq
for fast-path comparison across sessions.
Changed: Pull captures remoteSeq before partition queries (not after)
to prevent TOCTOU races where concurrent pushes during the fetch window could
be silently missed.
Changed: FakeDynamoTable test double handles numeric ADD operations and
throws on undefined ExpressionAttributeValues references.
2026.07.27.1
Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)
Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
2026.07.29.1
Added: Parallel push writes with bounded concurrency (10 concurrent
writeFileEntry calls). Reduces push latency 5-10x for bulk operations.
Added: Atomic commitSeq counter via DynamoDB UpdateItem ADD. Pull
fast-path now compares a monotonic integer instead of parsing ISO timestamps,
eliminating clock-skew vulnerabilities. The sidecar persists lastPulledSeq
for fast-path comparison across sessions.
Changed: Pull captures remoteSeq before partition queries (not after)
to prevent TOCTOU races where concurrent pushes during the fetch window could
be silently missed.
Changed: FakeDynamoTable test double handles numeric ADD operations and
throws on undefined ExpressionAttributeValues references.
2026.07.27.1
Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)
Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
2026.07.27.1
Changed: Bump @aws-sdk/* 3.1094.0 → 3.1096.0 (2 packages)
Changed: Bump @opentelemetry/api 1.9.0 → 1.9.1
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
2026.07.25.1
Added: OpenTelemetry spans for every layer of the datastore. Each SDK call
emits one span named for the wire operation (DynamoDB PutItem,
DynamoDB Query, DynamoDB BatchWriteItem, …) carrying
aws.dynamodb.table_names, the GSI name when one is used, consumed capacity,
returned and scanned counts, HTTP status, and the AWS request ID. The lock
emits dynamodb-datastore lock acquire / release / withLock / inspect /
forceRelease, with acquire recording wait duration and whether it contended.
The sync service emits dynamodb-datastore pullChanged / pushChanged /
hydrateFile / preparePush / commitPush with file counts, chunk counts,
and fast-path indicators.
Added: Control-plane calls are covered too. DescribeTable, CreateTable,
and UpdateTimeToLive go through the low-level client rather than the document
client, so both clients are instrumented — table creation and health checks are
no longer invisible.
Added: Retries are recorded as retry span events on the enclosing
operation. This covers the throttling backoff in retryable, the
UnprocessedKeys loop in BatchGetItem, and the UnprocessedItems loop in
BatchWriteItem — the latter two retry independently of the shared helper and
previously left no trace of partial throttling at all.
Changed: pullChanged reports datastore.files_pulled and
datastore.files_deleted separately. The internal pull counter increments for
both a downloaded file and a local file removed by a remote tombstone, so
reporting it as a pull count would have overstated downloads.
Changed: Nothing observable without tracing configured. The extension
depends on @opentelemetry/api only; the host process owns the
TracerProvider, and every span is a no-op when none is registered. Existing
behaviour, return values, and log output are unchanged.
Note: Item content is never recorded as a span attribute — only counts, key names, and table/index names.
Note: Span names are resolved from the SDK command's class identity rather
than constructor.name, so they survive any minification the bundler applies.
Lock heartbeat renewals run detached from the acquiring span, so a renewal is
its own trace instead of a child of an already-ended lock acquire span.
updated labels
2026.07.24.1
Changed: Bump AWS SDK from 3.1091.0 to 3.1094.0 (patch-level update).
- Has README or module doc2/2earned
- README has a code example1/1earned
- README is substantive1/1earned
- Most symbols documented1/1earned
- No slow types (deprecated)1/1earned
- Dependencies pass trust audit2/2earned
- Has description1/1earned
- Platform support declared (or universal)2/2earned
- License declared1/1earned
- Verified public repository2/2earned