- DynamoDB
UpdateItemcondition expression on missing item:ConditionExpressionsuch asattribute_exists(...)now correctly evaluates against the existing stored item (or empty if missing) — was incorrectly evaluating against the in-progress mutation, causingConditionalCheckFailedExceptionto never fire on missing items - DynamoDB key schema validation:
GetItem,DeleteItem,UpdateItem,BatchWriteItem,BatchGetItemnow validate that supplied key attributes match the table schema in name and type — returnsValidationException: The provided key element does not match the schema - ESM visibility timeout: SQS → Lambda event source mapping now respects the queue's configured
VisibilityTimeoutinstead of hardcoding 30 s — prevents retry storms and duplicate deliveries when Lambda fails - Lambda stdout/stderr separation: handler logs now go to stderr, response payload to stdout — matches AWS Lambda runtime contract; fixes log pollution in response payloads
- Lambda timeout error:
subprocess.TimeoutExpiredpath now captures and returns stdout/stderr in the error log instead of returning an empty string - ECS
_maybe_mark_stoppedcontainer status: callscontainer.reload()before checking status to get live state from Docker — was reading stale cached status - ECS
stoppedAt/stoppingAttimestamps: now stored as ISO 8601 strings matching AWS ECS API format — was storing Unix epoch float - ECS cluster task count:
_recount_cluster()now recomputes running/pending counts from all tasks instead of decrementing — prevents count drift on concurrent task terminations - Step Functions service integrations: Task state now dispatches to real MiniStack services via
arn:aws:states:::resource URIs —sqs:sendMessage,sns:publish,dynamodb:putItem,dynamodb:getItem,dynamodb:deleteItem,dynamodb:updateItem,ecs:runTask,ecs:runTask.sync— was returning input passthrough instead of invoking the service - 392 integration tests — all passing, including against Docker image