Skip to content

Parity 4#2384

Merged
agbishop merged 178 commits into
mainfrom
parity-4
Jul 14, 2026
Merged

Parity 4#2384
agbishop merged 178 commits into
mainfrom
parity-4

Conversation

@agbishop

Copy link
Copy Markdown
Collaborator

No description provided.

Witness Patrol and others added 30 commits July 11, 2026 20:47
…t + workflow

Self-contained kickoff for a fresh session starting Phase 4 (LocalStack Pro
cross-service interconnectivity parity). Captures: the LocalStack-parity north
star, phase status (Phase 3 datalayer done but on unmerged parity-sweep-3/#2382),
Phase 4 scope, and the per-service parity-sweep workflow (<=2 sonnet agents,
scoped gates, PARITY.md manifests, no-stub rule, cli.go interconnect as main-thread
work). Also persisted via bd remember (parity-north-star-phases, parity-sweep-workflow).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…s RoleDetail

RoleDetail wire shape omitted instance-profile membership entirely; populate
from backend instanceProfiles with nested role resolution. +table test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… bypass

ErrInvalidDelaySeconds missing from errCodeLookup surfaced as 500 InternalError
instead of 400 InvalidParameterValue. SendMessageBatch entries bypassed empty-body,
DelaySeconds range, and message-attribute validation. +table tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Verified gopherstack-gvw is a false-positive gap (TagResource/BatchGetSecretValue
do not return LimitExceededException per AWS docs); downgraded to ok.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ack name

ExpiredKeyMaterial/KeyMaterialUnavailable had no error-table entry (fell to 500);
add ExpiredImportTokenException(400)/KeyUnavailableException(500). Fallback
exception name InternalServiceError is not a real KMS type; use KMSInternalException
so client errors.As matches. +regression test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…eamRetention

AWS requires strict inequality; equal value returned idempotent 200 instead of
InvalidArgumentException. Corrects a rationalized-bug test asserting wrong behavior.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Emitted fabricated top-level *DestinationDescriptions lists that the real SDK
deserializer discards -> clients got zero destinations back. Real API wraps all
types in a single Destinations list of DestinationDescription. Also fix
DeliveryStreamEncryptionConfiguration key and nest Redshift fields under CopyCommand
(+S3Configuration). New PARITY.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…Token

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reject datapoints >2 weeks past or >2 hours future with InvalidParameterValue,
per AWS docs. Closes gopherstack-pyv.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ad of 400

Unknown capacity-provider name failed the whole request; AWS returns per-item
Failures[] with reason MISSING, matching other Describe ops.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CreateDBShardGroup/Integration/CustomDBEngineVersion families (+Delete/Modify/Reboot)
wrapped fields one XML level too deep; real SDK expects them flat under XxxResult,
so clients got zero-valued structs incl. identifiers. Fix wrong CDBEV description tag.
+regression tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CustomerId (Marketplace SaaS) was absent from all ApiKey shapes -> dropped on
create, never returned, unpatchable. Also correct a misleading UpdateUsage
PATCH-path doc/test. +test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…teKey+target)

Quick-create shortcut was unimplemented -> requests silently produced an API with
no route/integration/stage. Add RouteKey/Target to Create/UpdateApi inputs,
auto-provision managed integration/route/stage, add missing ApiGatewayManaged field.
+6 tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…Set/Refactor/Template/Scan

DeleteStackSet unknown name now idempotent; DescribeStackRefactor unknown ID returns
StackRefactorNotFound instead of empty 200; GeneratedTemplate/ResourceScan not-found
codes were wrongly suffixed; ListResourceScan* swallowed not-found -> empty 200.
+audit tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…integration gap noted

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New CloudConnector op family was SDK-bumped in but excluded from dispatch.
Implement Create/Delete/Get/List/Update/ValidateCloudConnector end-to-end with
real store-backed state, validation, persistence. +table tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…version checks

Emit required HealthCheckVersion; honor CreateHostedZone DelegationSetId (was
dropped -> hardcoded nameservers); add optimistic version checks + in-use/empty
guards for CIDR collections and reusable delegation sets; count real linked zones.
+tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…d/ResendConfirmationCode

Both returned UserNotFoundException for unknown users regardless of the client's
PreventUserExistenceErrors=ENABLED setting, defeating anti-enumeration masking.
Return masked success shape instead. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…DryRun

CreateDomain/UpdateDomainConfig used deprecated IamIdentityCenterOptions wire shape
-> client options silently no-op'd; emit required DomainId; ListDomainNames emitted
EngineVersion instead of EngineType; UpdateDomainConfig ignored DryRun. New PARITY.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ter-aliasing races

ON_DEMAND triggers stay CREATED and now actually fire job/crawler runs (was a stub);
honor StartOnCreation + CrawlerName; enforce PutResourcePolicy PolicyExists/HashCondition
and DeleteResourcePolicy hash; clone CreateSchema + integration-property returns to fix
unsynchronized read races. +regression tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…egationSetId arg

Route53 parity audit split CreateHostedZone to accept delegationSetId; scoped
per-service gate missed this cross-package caller. Pass empty (CFN path unspecified).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Witness Patrol and others added 18 commits July 13, 2026 09:24
…onfigureLogs, config drop

RotateChannelCredentials routed POST .../ingest_endpoints/credentials vs real PUT
.../credentials (unreachable) + regenerated both endpoints vs only creds[0]; ConfigureLogs
discarded log-group params (no-op); Create/UpdateOriginEndpoint dropped authorization/
hls/dash/cmaf/mssPackage config; CreatedAt missing on Channel/OriginEndpoint. New PARITY.md.
+tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
TerminologyData.File + Document.Content are base64 blobs on wire but handled as literal
text (corruption both directions); text-translation job started IN_PROGRESS and never
advanced (DescribeTextTranslationJob poll hangs) -> SUBMITTED + step-advance;
AppliedTerminologies always fabricated empty; CSV header row treated as term pair (silent
mangling); Directionality discarded. New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… Duration unit, V2 union

ColumnMetadata wire key columnSize vs real length (Length always 0 client-side);
DescribeTable TableName nested object vs plain string (dropped); Duration emitted ms vs
real nanoseconds (1e6x understated); GetStatementResultV2 Records []string vs QueryRecords
union {CSVRecords} (UnknownUnionMember deserialize fail). New PARITY.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…, error code

ARN/inference-profile modelId (embedded slash, %2F-decoded) cut at first slash ->
wrong response envelope served; CountTokens expected top-level prompt/messages vs real
{input:{invokeModel:{body}|converse:{messages}}} union (content-independent estimate);
InternalFailure vs real InternalServerException (9 sites, typed-exception match fails).
New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…or messages

Six validation sentinels baked 'ValidationException: ' into the message text, duplicating
the __type envelope field -> real SDK client saw 'ValidationException: ValidationException:
...'. New PARITY.md (service otherwise in good shape, verified via real SDK client probe).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ce, delete response

VersionConflictException vs real ConflictException; shadow version reset to 1 after
delete+recreate (real keeps incrementing -> soft-delete tombstone); delete response leaked
pre-delete state vs real empty doc; oversized (>8KB) doc wrong error vs
RequestEntityTooLargeException; real DeleteConnection path unreachable (prior audit swept
under /_admin); MethodNotAllowed placeholder string. New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…eption, honor poll interval

maxIdentifierLength 2048 vs real 128 (botocore Identifier shape); removed fabricated
PayloadTooLargeException dead const (not in real exception set); Next-Poll-Interval clamped
to 30s default, silently ignoring sessions declaring 15-29s. New PARITY.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CreateMonitor/CreateProbe: packetSize range (56-8500) never validated; protocol stored
non-canonical (tcp vs TCP). UpdateProbe was validation no-op (garbage protocol/port/
packetSize/state persisted with 200) -> added field validation + TCP-requires-port
invariant on effective post-update values. New PARITY.md. +route-matcher/matrix tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Tag/Untag/ListTagsForResource accepted any ARN (silently r/w orphaned tag map vs real
ResourceNotFoundException); List* never validated NextToken (malformed decoded to page 0
vs InvalidNextTokenException). New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…wire markers, force disconnect

PostToConnection dropped frames on full downstream buffer but returned 200 (real
LimitExceededException 429); Gone/PayloadTooLarge missing X-Amzn-Errortype+__type markers
(client errors.As never matched -> generic); DeleteConnection/PruneIdle never closed the
downstream channel, leaking apigatewayv2 writer goroutine + socket. New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…, typeHint

FormatRecordsAs unimplemented (field absent) -> JSON format returns formattedRecords and
omits records/columnMetadata; ColumnMetadata 2-field stub vs real 14-field shape, populated
via SQLite type-affinity->JDBC codes + driver Nullable/DecimalSize introspection;
SqlParameter.typeHint silently dropped. New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…Model

ValidationException nonexistent in CloudControl -> InvalidRequestException; Get/Cancel
ResourceRequestStatus on unknown token returned ResourceNotFound vs real
RequestTokenNotFoundException; cancel of non-terminal request -> ConcurrentModificationException
(500) not 400; ResourceNotFound/AlreadyExists were 404/409 vs real 400; ProgressEvent.ResourceModel
field missing (CDK/TF read it to skip GetResource). New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lass enum value)

isValidStorageClass accepted STANDARD, which belongs to the UploadAvailability enum, not
StorageClass (real StorageClass enum = TEMPORAL only) -> PutObject echoed an impossible
value. New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ider

Entire service used fictitious RESTful GET/PUT/DELETE paths + query params vs real Account
Management protocol (POST /getContactInformation etc., all params in JSON body) -> every op
404'd against a real SDK client. Also had no provider.go (dead code, unreachable in server).
Rewrote handler; added provider.go; X-Amzn-Errortype header + real error codes
(InternalServerException/Conflict/AccessDenied/TooManyRequests); required-field validation
on PutContactInformation; AccountId enforced on primary-email ops; removed fictitious
DescribeAccount/CloseAccount; added real GetAccountInformation. New PARITY.md. Rewrote tests
(consolidated banned parity_* names).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
services/account was rewritten to the real wire protocol but had no cli.go registration,
so it was unreachable. Add import + provider-list entry. Whole-repo build green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rs, validate create

GetLifecyclePolicies read list query params (policyIds etc.) via Values.Get -> only first
value (SDK repeats key per value); resourceTypes/targetTags/tagsToAdd filters accepted but
ignored (no-op) -> real ANY-of matching; PolicySummary missing PolicyType field;
CreateLifecyclePolicy skipped required ExecutionRoleArn/Description validation. New PARITY.md.
+tests (incl. matcher-routed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…c FailureLocation

Error __type ValidationException vs real ValidationError (client errors.As never matched);
RouteMatcher host prefix sagemaker-runtime. vs real runtime.sagemaker.<region> (never
matched real traffic, path-match compensated); InvokeEndpointAsync omitted always-bound
X-Amzn-SageMaker-FailureLocation response header. New PARITY.md. +tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Deep op-by-op audit vs aws-sdk-go-v2 dynamodbstreams@v1.35.0: NextShardIterator termination,
real ring-buffer record sourcing, no shard fabrication, DynamoDBStreams_20120810 target
prefix distinct from DynamoDB, epoch-seconds timestamps, AttributeValue shapes all correct.
New PARITY.md. No source changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@agbishop agbishop marked this pull request as ready for review July 13, 2026 23:54
Witness Patrol and others added 8 commits July 13, 2026 19:38
…ateVocabulary)

Transcribe modeled Tags as map[string]string; real AWS Tags is a list of {Key,Value}.
Real provider sends "Tags":[{...}] -> unmarshal-into-map failed with BadRequestException
on aws_transcribe_vocabulary apply. Wire structs now use []transcribeTag across tag-bearing
ops, converted to/from internal storage via tagsToMap/tagsFromMap. Fixes TestTerraform_Transcribe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tags matcher

appsync registers a RouteMatcher claiming ANY /v1/tags path at PriorityPathVersioned with
no ARN-service check; registered before kafka, it won priority ties and intercepted Kafka
TagResource/ListTagsForResource, failing to parse the MSK ARN -> BadRequestException:
invalid resourceArn. Kafka's own matcher is ARN-aware; bump its priority to +1 so it wins.
Fixes TestIntegration_Kafka_Tags, TestIntegration_Kafka_ClusterLifecycle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…oad), no wrapper

Real App Mesh marks the single output member (Mesh/VirtualNode/VirtualRouter/Route/
VirtualService/VirtualGateway/GatewayRoute) with httpPayload: the response body IS that
object at the root, no {mesh:{...}} wrapper (verified vs appmesh SDK deserializers). A prior
sweep wrapped them, so clients read empty MeshName/VirtualNodeName. Removed wrapper on 28
Create/Describe/Update/Delete sites + dead key constants. List ops keep their plural wrapper.
Fixes TestIntegration_AppMesh_Mesh/VirtualNodeLifecycle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- e2e timestreamquery: CreateScheduledQuery gained a clientToken param; pass it (compile fix).
- cfn integration: GeneratedTemplateNotFoundException.ErrorCode() is unsuffixed
  'GeneratedTemplateNotFound' per the SDK type; expect that (test encoded the pre-fix
  bug-compatible generic-fallback code).
- servicediscovery integration: UpdateInstanceCustomHealthStatus is only valid for services
  created with HealthCheckCustomConfig (else real AWS returns CustomHealthNotFound); add it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…CI 404)

Commit 51e3b67 relocated ListDomainNames to the real AWS path GET /2015-01-01/domain but
deleted the collection-path GET /2015-01-01/es/domain handler, so the CRUD-collection list
step 404'd (create POST + describe still worked). Restored the /es/domain GET as an alias
alongside the wire-correct /domain path; both now serve ListDomainNames. Fixes
TestIntegration_Elasticsearch_Domain_CRUD. +route-matrix test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ual value (CI)

Commit 2b2086c changed equal RetentionPeriodHours from an idempotent no-op to
InvalidArgumentException, reading the SDK 'must be more/less' doc literally. Live repro with
the real kinesis SDK: terraform's create-then-set / idempotent re-apply issues Increase with
a value equal to current retention -> the strict check 400'd, failing aws_kinesis_stream
apply. Reverted equal -> no-op success; still reject wrong-direction + out-of-[24,8760].
Fixes TestTerraform_Kinesis.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…sserting

Parity made CreateServer return OFFLINE (real AWS: servers start OFFLINE, StartServer
required). TestTransferDashboard asserted immediate ONLINE. Drive the real lifecycle:
CreateServer -> StartServer -> wait for async STARTING->ONLINE (100ms transition) via
require.Eventually, then assert the dashboard renders ONLINE.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…pers

Every per-region store helper (modelsStore/endpointsStore/trainingJobsStore/... 80+ across
backend.go + backend_*.go) lazily wrote its outer map (b.X[r]=store.Register(...)) but was
called from RLock-only read paths (List*/Describe*/Get*). Two RLock holders racing to write
the same map -> data race (and store.Register's unguarded r.tables write can panic 'already
registered' under contention). The dashboard's concurrent List* calls tripped -race in the
e2e SageMaker dashboard tests. Added non-mutating *RO twins that return the existing region
store or a throwaway empty one (never writing the outer map / never Register) and routed all
RLock read paths through them; write paths (Lock) keep lazy-init. +concurrency regression test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@agbishop

Copy link
Copy Markdown
Collaborator Author

📊 Code Coverage Report

Metric Value Status
Total Coverage 75.0%
0.0%
84.4%
New Code Coverage N/A (0/0 stmts)

Tip

This project maintains a minimum coverage threshold of 85%. Maintain or improve coverage on new code to ensure long-term stability.


Last updated: Tue, 14 Jul 2026 02:37:27 GMT

@agbishop agbishop merged commit efc42cb into main Jul 14, 2026
26 checks passed
@agbishop agbishop deleted the parity-4 branch July 14, 2026 02:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant