Parity sweep 3#2382
Draft
agbishop wants to merge 108 commits into
Draft
Conversation
Upgrade JS/TS UI dependencies to latest (gate: install + lint + build green): - AWS SDK clients + credential-providers 3.1070.0 -> 3.1079.0 - @sveltejs/kit 2.65.2 -> 2.69.1, svelte 5.56.3 -> 5.56.4, svelte-check 4.6.0 -> 4.7.1, vite 8.0.16 -> 8.1.3 - @tailwindcss/vite + tailwindcss 4.3.1 -> 4.3.2 - oxlint 1.70.0 -> 1.72.0, oxfmt 0.55.0 -> 0.57.0 - @testing-library/svelte 5.3.1 -> 5.4.2 Pin-backs (kept on latest v1, rejected v2 majors): - @connectrpc/connect + connect-web 1.6.1 -> 1.7.0 (not v2) - @bufbuild/protobuf 1.10.0 -> 1.10.1 (not v2) connect/protobuf-es v2 would require regenerating the committed dashboard_pb.ts / dashboard_connect.ts from proto sources (buf toolchain) - out of scope for a dependency bump. Source fix: - .oxlintrc.json: disable new pedantic rule unicorn/prefer-number-coercion introduced in oxlint 1.72.0 (flags pre-existing parseInt/parseFloat; its Math.trunc(Number(x)) auto-fix is not semantics-preserving). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Personal local settings must not sync to origin (they carry per-user permission overrides). Remove from tracking and ignore going forward. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a CI job running `go fix -diff ./...` (Go 1.26 built-in modernizers, fails on non-empty diff) so the tree stays modernized. Repo was already near-clean; only ec2 AttachVerifiedAccessTrustProvider had a stale suppressed loop, now slices.Contains. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…validation, response overrides Deep parity audit of the s3 service against aws-sdk-go-v2. Twelve genuine correctness defects fixed (no cosmetic churn): - SSE data loss on restart: StoredObjectVersion.EncryptionDEK/Nonce and StoredMultipartUpload.SSE were json:"-" while the ciphertext (Data) was persisted, so every SSE-S3/SSE-KMS object became undecryptable after a snapshot/restore, and in-flight multipart uploads silently completed unencrypted. Now persisted (SSE-C customer key stays request-scoped). - GetObject/HeadObject: implement the response-* header override query params (response-content-type/-disposition/-encoding/-language, response-expires, response-cache-control) — previously ignored; heavily used via presigned URLs. - PutBucketAcl: reject object-only canned ACLs (bucket-owner-read / bucket-owner-full-control) with 400 InvalidArgument; read and honour an AccessControlPolicy XML body (was silently ignored); pass it through on GET. - PutBucketReplication: require versioning=Enabled (InvalidRequest 400), as AWS. - Presigned URLs: reject X-Amz-Expires > 604800 s (7 days) with 400 AuthorizationQueryParametersError. - x-amz-storage-class: omit the header for STANDARD objects (AWS omits it). - GetObjectAttributes: return Last-Modified header; drop omitempty on ObjectSize so a 0-byte object still emits <ObjectSize>0</ObjectSize>. - PostObject response: XML-escape bucket/key via encoding/xml instead of raw string concatenation (keys may contain & < >). - ListMultipartUploads: echo UploadIdMarker in the response. Tests updated to match real AWS behaviour (STANDARD storage-class header omission; replication requires versioning) and regression tests added for the SSE snapshot/restore round-trip, canned-ACL rejection, presign expiry cap, and response-header overrides. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ifecycle accuracy
Deep AWS-parity audit of the ec2 service (gopherstack-r0h), focused on Tags
and the instance attribute/lifecycle family:
- CreateTags/DeleteTags/DescribeTags previously only recognised ~9 resource
types (instance, sg, vpc, subnet, volume, igw, route-table, natgateway,
elastic-ip) via resourceExistsLocked/resourceTypeByID, so tagging AMIs,
snapshots, network ACLs, transit gateways, VPN/customer gateways, VPC
endpoints, launch templates, IPAM objects, and ~80 other resource types
this backend models incorrectly failed with InvalidParameterValue even
though the resource existed. Replaced with a comprehensive, AWS
ResourceType-accurate prefix table and per-family existence checks
(backend_resource_types.go), covering every independently-taggable
resource type the backend implements.
- ModifyInstanceAttribute silently discarded disableApiTermination,
disableApiStop, ebsOptimized, instanceInitiatedShutdownBehavior, and
sourceDestCheck ("accepted but not modelled beyond acknowledgment") — a
disguised stub. DescribeInstanceAttribute then hardcoded all of them back
to fixed values (sourceDestCheck wrongly defaulted false; AWS defaults
true). Now persisted for real: booleans land on the Instance struct,
sourceDestCheck is proxied to the primary ENI (its true AWS owner), and
RunInstances' own DisableApiTermination/InstanceInitiatedShutdownBehavior/
EbsOptimized launch-time parameters are wired the same way.
- TerminateInstances/StopInstances never enforced disableApiTermination/
disableApiStop, so a protected instance could always be torn down —
added the OperationNotPermitted error AWS returns in that case.
- Instance carried no StateReason/StateTransitionReason, so DescribeInstances
never surfaced why an instance stopped/terminated. Added <stateReason>
and legacy <reason> wire fields, populated on user-initiated stop/
terminate and cleared on start, matching AWS's Instance shape.
Found but not fixed (follow-up): DeleteVpc/DeleteSubnet (backend.go
DeleteVpc, DeleteSubnet) force-cascade-delete all dependents instead of
returning DependencyViolation like real AWS; changing this has a large
blast radius on existing cascade-delete test assumptions and is left for a
dedicated pass.
Gate: go build ./..., go vet ./services/ec2/..., go fix -diff ./services/ec2/...,
go test ./services/ec2/..., golangci-lint run ./services/ec2/... all green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nsact-update key-mutation gaps
Deep parity re-audit of a previously-swept, mature dynamodb service (op-by-op
against aws-sdk-go-v2 dynamodb types). Found and fixed three genuine defect
families rather than padding an already-solid implementation:
1. Query/Scan Select parameter: the emulator never enforced AWS's documented
restriction that Select can only combine with ProjectionExpression/
AttributesToGet when Select=SPECIFIC_ATTRIBUTES, never rejected
SPECIFIC_ATTRIBUTES without a projection, and never rejected
ALL_PROJECTED_ATTRIBUTES on a bare table scan/query. It also always
returned full Items for Select=COUNT, when AWS returns Count/ScannedCount
only ("Returns the number of matching items, rather than the matching
items themselves").
2. BatchWriteItem had no duplicate-key validation across a table's
WriteRequest list (BatchGetItem already had this for its Keys list). Real
AWS rejects a batch that targets the same primary key twice — via two
Puts, two Deletes, or a Put+Delete pair — with ValidationException
"Provided list of item keys contains duplicates". An existing test
(TestBatchWriteItem_ValidRequests_NotAffectedByValidation) asserted the
opposite for a Put(k1)+Delete(k1) batch; fixed the test to use disjoint
keys and added a dedicated regression test for the rejection.
3. TransactWriteItems' Update action never validated that its
UpdateExpression avoids key attributes, unlike plain UpdateItem. Since
updateIndexes() only ever adds/overwrites the new key's index slot and
never removes a stale one, an unvalidated key-mutating transactional
update would silently corrupt pkIndex/pkskIndex (leaving a dangling entry
under the old key pointing at the item's new state) — a real state
corruption bug, not just a missing validation.
Gates: go build ./..., go vet ./services/dynamodb/..., go fix -diff (empty),
go test ./services/dynamodb/... (all pass), golangci-lint run
./services/dynamodb/... (0 issues).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Keeps the spa dir tracked when built output is absent/gitignored. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…root SNS backend.go already implements deliverToLambdaSubscriptions and deliverToFirehoseSubscriptions (called from Publish), gated on b.lambdaBackend/b.firehoseBackend being non-nil, but SetLambdaBackend/ SetFirehoseBackend were only ever called from tests -- never from cli.go. In the running binary, subscribing a Lambda function or Firehose delivery stream to an SNS topic and publishing silently no-opped. Add wireSNSToLambdaFirehose, called alongside wireSNSToSQS in initializeServices, wiring: - SNS.SetLambdaBackend(lambdaBk) directly (lambda's InvokeFunction already satisfies sns.LambdaInvoker since InvocationType is a string alias). - SNS.SetFirehoseBackend via a new snsFirehosePutterAdapter, since firehose.PutRecordBatch takes a context but sns.FirehosePutter does not. - SNS.SetSQSSender via the existing sqsSenderAdapter, so failed Lambda/ Firehose deliveries with a RedrivePolicy reach the real subscription DLQ. This is separate from wireSNSToSQS, which wires the SNS->SQS subscription delivery path via a publish emitter; sqsSender only serves DLQ redelivery on failed Lambda/Firehose invocations, so there is no double-wiring. Add TestWireSNSToLambdaFirehose_EndToEndDelivery, which builds real SNS, Lambda, Firehose, and SQS in-memory backends, calls the same wireSNSToLambdaFirehose used by cli.go, and proves genuine delivery: a Firehose subscription's published message is flushed to S3, and a Lambda subscription's invocation failure (no Docker runtime in test) is redirected to the real SQS dead-letter queue via the wired SQS sender. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…permission persistence
RemovePermission read StatementId from query string; real SDK sends it as
URI path segment (/policy/{StatementId}) — route never matched, a disguised
stub no client could call. Fix ESM function-ARN parsing that dropped the
function name (kept only qualifier). Snapshot permissions map + rebuild
versionIndex/esmByFunctionARN on Restore (were lost across persistence).
Add Qualifier scoping, EventSourceToken/PrincipalOrgID fields.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…rsistence leaks ListInstanceProfilesForRole ignored RoleName + returned hardcoded empty; GetAccountAuthorizationDetails fabricated a fake v1 policy version. Fix HTTP status codes (NoSuchEntity 404, EntityAlreadyExists/DeleteConflict/Limit 409, were all 400). Percent-encode policy documents at wire boundary. Snapshot handler tags + comprehensive backend state (SSH keys, MFA links, access-advisor) that were dropped on restore. Apply tags-at-creation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
YAML-frontmatter parity manifests record audit state (last_audit_commit, sdk_version, per-op/family wire/errors/state/persist status, gaps, leaks) so the next audit diffs the delta instead of rescanning. Template at services/_PARITY_TEMPLATE.md. Backfilled s3/ec2/dynamodb/lambda/iam from their sweep reports. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…fan-out, delivery leaks PublishBatch dropped per-entry MessageAttributes (wrong form-field prefix vs SDK serializer) — broke FilterPolicy matching. Lambda/Firehose/SQS now share one real signed envelope (was fabricated Signature); Firehose honors RawMessageDelivery. ReplayPolicy fans out to all protocols (was HTTP/SQS only). Persist + clean up topicMessageArchive; cap delivery observability buffers; lock the signer cert URL; fix copy-paste KMSOptInRequired error message. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…cy enforcement, persistence Query-protocol responses emitted two XML prologs (manual header + XMLBlob) — malformed XML masked by lenient parsing. FIFO messages requeued on visibility change/expiry appended to tail, letting newer same-group messages jump ahead — now reinserted by SequenceNumber. Enforce RedriveAllowPolicy (was validated, never checked). Persist fifoSeqCounter/hasActivity/lastPurgedAt. Export NoVisibilityTimeout sentinel. Centralize VisibilityTimeout range check. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ter extraction, RejectedLogEventsInfo shape PutLogEvents no longer validates sequenceToken / returns InvalidSequenceToken / DataAlreadyAccepted — AWS deprecated tokens and never errors on them. Real per-event field extraction for $-referenced MetricValue (was fabricating 1.0); TestMetricFilter now computes ExtractedValues (was empty stub). Fix RejectedLogEventsInfo: TooOldLogEventEndIndex name + exclusive-end off-by-one. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…missing comparison operator PutMetricDataOutput fabricated UnprocessedMetricData + partial-success — real op has no such model; now validate-then-commit atomically. Parse MetricDatum Values/Counts weighted arrays (were silently dropped) w/ percentile expansion. Reject NaN/Inf/out-of-range values. Add missing LessThanLowerThreshold comparison (those alarms never fired). Thread real alarm type into action history; honor ListMetrics RecentlyActive=PT3H. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…leak, tag-before-create Sign/Verify/GetPublicKey/DeriveSharedSecret/GenerateDataKeyPair(+WithoutPlaintext)/ GenerateMac/VerifyMac had no GrantTokens field — silently dropped, grant validity never enforced (disguised stub). Unrecognized KeySpec now 400 ValidationException (was 500). purgeKey drops leaked grantsByKey submap. Validate tags BEFORE creating key/replica (was leaving orphaned untagged keys); ReplicateKey bypassed validation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…t, change-set exec gates, event pagination DeleteStack now idempotent no-op for missing stack (AWS models no not-found error). Block DeleteStack/UpdateStack that would drop an export still imported via Fn::ImportValue. ExecuteChangeSet gates on ExecutionStatus + deletes all stack change sets. Fix ChangeSetNotFound wire code (was ChangeSetNotFoundException). AUTO_EXPAND no longer satisfies IAM capability. DescribeStackEvents honors NextToken via pkgs/page. Emit UPDATE_FAILED event on template parse failure. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… service deployments Restore never rebuilt serviceIndex (reconciler's only feed) — every service went invisible to deployment/scaling after restart. resourceTags side map absent from snapshot (tag data loss). DescribeServiceDeployments/List/Stop were disguised stubs (only test-seeded); now recorded by real CreateService/UpdateService/rollback + a map-key leak fixed on cluster/service delete. CreateCluster now honors capacityProviders/defaultStrategy/tags. Implement ContinueServiceDeployment. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cloudwatch sweep (ede7169) changed PutMetricData to return only error (dropped the fabricated UnprocessedMetricData). Update the two cli.go composition-root call sites from `_, err :=` to `err :=`. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…fication CompleteLayerUpload missing RepositoryNotFound FK check + silently overwrote an already-registered layer (now LayerAlreadyExistsException). UploadLayerPart discarded partFirstByte — no sequencing check (now InvalidLayerPartException). PutImage trusted client imageDigest verbatim; now verified against manifest hash (ImageDigestDoesNotMatchException). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…; drop tracked junk DeleteDBInstance/DeleteDBCluster ignored SkipFinalSnapshot/FinalDBSnapshotIdentifier — never validated the combo or took a final snapshot (disguised stub). Added DeleteDBInstanceWithOptions/DeleteDBClusterWithOptions (additive — old signatures preserved for cloudformation callers). DescribeDBInstances now honors Filters. Remove stale tracked batch3_test.go.rej / batch3_test_pi.patch artifacts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…on-stage move, idempotency Fix concurrent map write: List/Describe/GetResourcePolicy held RLock but the lazy *Store(region) helper writes b.secrets[region] on first touch. Rename IncludeDeleted->IncludePlannedDeletion and owned-by-me->owning-service (wrong wire keys, filters silently ignored). UpdateSecretVersionStage now requires RemoveFromVersionId to name the current holder. Add CreateSecret ClientRequestToken idempotency, NextRotationDate/SortBy. Route all timestamps through injectable clock. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… + version selector Intelligent-Tiering now auto-upgrades to Advanced for >4KiB/policies (was hard reject). Parameter Policies require Advanced tier. Enforce 100-version cap (ParameterMaxVersionLimitExceeded, was silently evicting labeled versions) + fix parameterLabels leak. Enforce 15-level hierarchy limit. DescribeDocument no longer embeds full Content (real DocumentDescription has none). Resolve $DEFAULT vs $LATEST. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…issing wire fields Integration TimeoutInMillis ceiling/default was hardcoded 29000ms for all protocols — HTTP APIs allow up to 30000ms (valid values were rejected). Tag handlers now map ErrStageNotFound to 404 (was 500). Add absent wire fields: Integration TlsConfig + ConnectionType (default INTERNET + VPC_LINK validation), Stage ClientCertificateId + Tags (nested stage ARN), DomainName MutualTls + DomainNameArn. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… coercion, remove/copy
All PATCH ops shared a flatten function handling only single-segment add/replace
with verbatim string copy — AWS always sends PatchOperation.Value as a JSON string,
so every bool/int field (tracingEnabled, minimumCompressionSize, apiKeyRequired)
failed to unmarshal, and multi-segment paths (/variables/{name}, /binaryMediaTypes,
/apiStages, throttle) were silently dropped — setting one stage variable never worked.
New patch.go with JSON-Pointer paths, value coercion, remove/copy. Fix
UpdateGatewayResponse full-replace-on-patch; add UpdateAccount CloudwatchRoleArn,
Stage cache-cluster fields.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…AND shards CreateStream(Tags)/AddTagsToStream/RemoveTags/ListTags used a parallel unpersisted Handler.tags map — tags vanished on restart. Routed all 6 ops through backend stream.Tags (persisted, single source). PutRecords on a missing stream returned 200 w/ per-record InternalFailure — now top-level ResourceNotFoundException; reject empty batch. ON_DEMAND streams get 4 shards (was 1, caller ShardCount ignored). DescribeStream shard pagination (Limit/ExclusiveStartShardId/HasMoreShards). Consumer 20-cap; persist account limit. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…RESS async, retry/catch runMapItem checked only the Go error, not res.Error — failing Map iterations were silently swallowed (nil holes, Map always succeeded). History recorder discarded all event detail (Input/Output/Resource/Error) — every event body was an empty shell. Allow async StartExecution on EXPRESS; StartSyncExecution on STANDARD now returns StateMachineTypeNotSupported. Separate Error/Cause in Catch. Add state-level Retry/Catch on Map+Parallel, Retry MaxDelaySeconds/JitterStrategy, Map ToleratedFailureCount/Percentage. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…3.3) Convert accounts/ous/policies/createStatuses/handshakes/serviceAccess/ delegatedAdmins to store.Table (ous byParent index, delegatedAdmins byService/ byAccount indexes). 8 raw kept (bare-value tree/attachment maps — persistence- audited). 6 clean + 1 DTO (delegatedAdmins: pre-existing json:- key). Snapshot version guard + full-state round-trip test. Exported API unchanged; organizations -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…3.3) Convert stateMachines/executions/activities/versions/aliases/mapRuns to store.Table + 3 indexes (eliminated hand-maintained []string index maps); history inlined into Execution. 5 direct + 1 DTO (executions: unexported history). Added historyMu guard to whole-struct copy sites (race from inlining, fixed). Raw runtime/derived maps left as-is. Preserves Map-failure/history-detail/retry-catch fixes (asl untouched). Snapshot version guard + round-trip test. Exported API unchanged; sfn -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert clusters/instances/snapshots/parameterGroups/subnetGroups/endpoints/ eventSubscriptions (region-qualified) + globalClusters (flat) to store.Table + byRegion indexes. 2 raw kept (clusterRoles/tags slice-valued — persistence-audited). 8 DTO (region json:- field) + 1 clean. Snapshot version guard + full-state round-trip test. Exported API unchanged; neptune -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert all 16 region-nested resource maps to store.Table (composite region|id keys); collapse 9 ByARN/ByID maps into indexes + 15 byRegion indexes (prod -151 LOC). 5 raw kept (index-sets/slices — persistence-audited). 0 DTOs (added Region field to 4 types). Registry routing now persists 8 previously-dropped collections (net-positive, internal-only). Snapshot version guard + full-state round-trip test. Exported API unchanged; dms -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert vaults/plans/jobs/selections/frameworks/legalHolds/recoveryPoints/etc. to store.Table (nested -> composite key + index). 10 tables registered/persisted, 10 constructed-but-unregistered to preserve their prior non-persistence byte-for-byte. 10 raw kept (bare-string/index — persistence-audited). 0 DTOs (3 types get json:- VaultName). Snapshot version guard + strengthened round-trip test. Exported API unchanged; backup -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert workGroups/namedQueries/dataCatalogs/queryExecutions/preparedStatements/ notebooks/sessions/databases/tables/etc. to store.Table + workgroup/catalog/database indexes; eliminate notebookNames set into an index. 3 raw kept (unexported-field results/slice/tags — never persisted). 10 clean + 2 DTO. No prior persistence.go — registry round-trip test. Rename ops use Delete+mutate+Put (avoid index alias). Exported API unchanged; athena -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert clusters/nodegroups/accessEntries/addons/fargateProfiles/ podIdentityAssociations/identityProviderConfigs/updates/etc. to store.Table (composite keys + byCluster indexes; prod -159 LOC). 2 raw kept (accessPolicies/ encryptionConfigs slice-valued — persistence-audited). 0 DTOs. Snapshot version guard + full-state round-trip test. Exported API unchanged; eks build green, -race passes except pre-existing TestSDKCompleteness/CancelUpdate (go-nab, unrelated). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert servers/users/connectors/profiles/workflows/agreements/certificates/etc. to store.Table (composite keys + 7 by-parent indexes; prod -206 LOC). 2 raw kept (sshKeyBodies dedup-index, tagsStore — persistence-audited). 0 DTOs. Preserved nested-presence-as-existence-check quirks via Has/Index-len. Snapshot version guard + full-state round-trip test. Exported API unchanged; transfer -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert the single sessions map to store.Table/Registry (direct registration). 0 DTOs. Snapshot JSON byte-format preserved (backendSnapshot.Sessions unchanged, now populated via Table.Range/Put). Preserves TradeInToken/signing-algorithm/ lockmetrics parity fixes. Exported API + SetRoleLookup/SetOIDCLookup unchanged; sts -race + whole-repo build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert clusters/configurations/replicators/topics/vpcConnections/clusterOperations to store.Table keyed by ARN (region-nesting collapsed); eliminate clusterNames into clustersByName index; +8 by-region/by-cluster indexes (prod -105 LOC). 2 raw kept (scramSecrets/clusterPolicies non-*T, flattened — persistence-audited). 0 DTOs. Snapshot version guard + full-state round-trip test. Exported API unchanged; kafka -race + whole-repo build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert accessPoints/accessGrants/batchJobs/mraps/storageLensGroups/PABs/etc. to store.Table (composite account-scoped keys). 16 non-*T maps left raw (persistence- audited). 10 clean + 2 DTO (identity-less mrapRequests/accessPointPABs get json:- key). Snapshot version guard + full-state round-trip test. Exported API unchanged; s3control -race + whole-repo build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert webACLs/ipSets/regexPatternSets/ruleGroups/managedRuleSets/apiKeys to store.Table; eliminate 8 hand-maintained secondary maps -> 3 indexes/table (arn/nameScope/region). 3 raw kept (non-*T loggingConfigs/policies/associations - persistence-audited). 4 clean + 2 DTO (managedRuleSets/apiKeys get json:- Region). Snapshot version guard + full-state round-trip test (REGIONAL+CLOUDFRONT). Exported API unchanged; wafv2 -race + whole-repo build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert findings-aggregators/insights/standardsSubscriptions/actionTargets/members/ automationRules/configPolicies/etc. to store.Table; flatten controlAssocOverrides to composite key. 5 raw kept (non-*T tags/findings/params — persistence-audited). 0 DTOs (clean types). No prior persistence.go — added registry snapshot + version guard + full-state round-trip test. Exported API unchanged; securityhub -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert groups/samplingRules/traces/parsedSegments/insights/resourcePolicies/etc. to store.Table + 2 indexes (groupsByARN, traceSegments). 4 raw kept (slice/non-*T - persistence-audited). 0 DTOs. Selective per-table snapshot: parsedSegments/ serviceWindows registered for Reset but not persisted (Document json:- derived + ephemeral) — documented. Snapshot version guard + round-trip test. Exported API unchanged; xray -race + whole-repo build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert pipes (region-lazy tables) + pipeARNIndex (-> store.Index) + enrichmentCallCount (DTO enrichmentCounter). 0 raw. Snapshot version guard + pre-register per-region tables on restore; ARN index rebuilds automatically. Exported API unchanged; pipes -race + whole-repo build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert lbs + policies (region-nested) to store.Table (composite region|name key) + lbsByRegion/policiesByLB indexes. 1 clean + 1 DTO (LoadBalancer: lbSnapshot preserves per-resource tags label). Snapshot version 3->4 (incompatible shape) + guard. Preserved 404/409 quirk (not fixed). Exported API unchanged; elb -race + whole-repo build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert clusters/instances/snapshots/parameterGroups/subnetGroups/ eventSubscriptions (region-qualified) + globalClusters (flat) to store.Table + byRegion indexes. 1 raw kept (tags slice — persistence-audited). 7 DTO (region json:- field) + 1 clean. Rename ops use delete-old+put-new. Snapshot version guard + full-state round-trip test. Exported API unchanged; docdb -race + whole-repo build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert devices/gateways/profiles/destinations/fuotaTasks/multicastGroups/etc. to store.Table (8 DTO composite-key + 6 clean). Many non-*T association/tag maps left raw (persistence-audited). Snapshot version guard + full-state round-trip test. Exported API unchanged; iotwireless -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert vaults/jobs/multipartUploads/vaultLocks to store.Table (composite vault#id keys + byVault/byAccountRegion indexes); archives inline in Vault; eliminate vaultsByAccountRegion into index. 4 raw kept (slice/non-*T — persistence-audited, incl. pre-existing archiveData non-persistence). 0 DTOs. Snapshot version guard + full-state round-trip test. Exported API unchanged; glacier -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ere stale) Prior commit fa4b730 captured a broken half-conversion (new store_setup.go but pre-conversion backend.go/persistence.go — build failed: regionKey undefined) due to a concurrent git-stash accident. Regenerate backend.go/persistence.go/ export_test.go to match store_setup.go: region-qualified store.Table + byRegion indexes + region field + regionalDTO persistence (neptune pattern). docdb build + -race now green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert templates/experiments/targetAccountConfigs to store.Table (composite templateID#accountID key + byArn/byTemplate indexes); eliminate ARN index maps. 5 raw kept (non-*T tokens/pointers/slices — persistence-audited). 0 DTOs. Live cancel/goroutine handles kept out of serialization. Snapshot version guard + full-state round-trip test. Exported API unchanged; fis -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…se 3.3) Convert resolverEndpoints/rules/associations/queryLogConfigs/firewall*/etc. (region-nested) to store.Table (composite region|id key + byRegion indexes). 4 raw kept (tags slice + 3 bare-string policy maps — persistence-audited). 0 DTOs (11 types get Region field). Snapshot version guard + full-state round-trip test. Exported API unchanged; route53resolver -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert instances/permissionSets/applications/trustedTokenIssuers/statuses to store.Table (+byInstance indexes). 10 raw kept (slice/scalar/nested — persistence- audited). 5 clean + 2 DTO (instanceACAs/permissionBoundaries get json:- key). Snapshot version guard + re-seed default instance + full-state round-trip test. Exported API unchanged; ssoadmin -race (145 tests) + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Convert identities/configurationSets/contactLists/contacts/templates/dedicatedIPs/ suppressedDestinations/etc. to store.Table; flatten eventDestinations+contacts to composite keys + indexes. 6 raw kept (non-*T policy/tag/tenant maps — persistence- audited). 0 DTOs. Index semantics fix 2 pre-existing empty-but-real not-found quirks (documented). Snapshot version guard + round-trip + cascade-delete tests. Exported API unchanged; sesv2 -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
resourceShares/permissions/invitations -> store.Table (all direct-register, identity ARNs present; 0 DTO). sharePermissions (int32 map) + associations (unkeyed slice) left raw, both persistence-audited y->y. Snapshot version guard re-seeds built-in permissions on mismatch (matches Reset invariant). Round-trip + version-mismatch tests added. Exported API unchanged; ram -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
channels/inputs/multiplexes/clusters/signalMaps/templates/reservations/etc. -> store.Table (all direct-register, identity IDs present; 0 DTO). channelPlacementGroups keyed by existing cpgKey composite. tags + scheduleActions left raw (persisted y->y); pendingTransferDeviceIDs rebuilt (not persisted, y->y). Snapshot version guard + round-trip/version tests. Net -86 prod LOC. Exported API unchanged; medialive -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…re (Phase 3.3) directories/snapshots/trusts/certificates/domainControllers/etc. -> store.Table + byRegion Index via regionalDTO wrapper (neptune region-nested pattern). 6 raw scalar/slice maps left (aliases/ipRoutes/dirDataAccess/caEnrollment/dirSettings/ updateInfoEntries — all persisted y->y). Snapshot version guard + full-state round-trip/version tests. Complex fns split (no nolint). Exported API diffed byte-identical; directoryservice -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…3.3) resources/lfTags/dataCellsFilters/lfTagExpressions/identityCenterConfigs -> store.Table (direct, composite keys replace old struct-key types). transactions -> dirty DTO (ses hidden-id pattern). permissionsMap -> derived O(1) cache rebuilt from permissionsList (raw ordering source preserved). 4 non-*T slice/ scalar maps left raw (audited). Snapshot version guard + round-trip/version/ cache-consistency tests. Exported API unchanged; lakeformation -race+build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(Phase 3.3) repositories/approvalRuleTemplates/branches/commits/pullRequests -> store.Table (direct); comments/files/prApprovalRules -> dirty DTO (apigateway clean/dirty split, hidden json:"-" parent keys). codecommit had NO persistence before — Snapshot/Restore + version guard built for the first time (8 raw maps now persisted n->y; repositoriesByARN ephemeral rebuilt). Handler.Snapshot/Restore picked up by cli.go generic setupPersistence. Round-trip/version tests added. Exported API additive-only (json:"-" fields), verified vs integration/e2e. codecommit -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e 3.3) databases/batchLoadTasks direct-register; tables flattened map[db]map[tbl] -> composite key + byDatabase Index. records left raw (embeds manually-managed lockmetrics mutex, no Table hook) + tags left raw (non-*T strings) — both persisted y->y. Snapshot version guard + round-trip/version/empty tests. Exported API unchanged; timestreamwrite -race + build green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.