Summary
The 2026-08-09 horizontal sweep of the #1370 class (run with the #1373 critic's own machinery against ALL registered types' live CFn schemas) surfaced bugs the current critic design cannot see. Follow-up work to close the blind spots, complementing #1378 (shape-level v2):
1. Mixed-case SDK models defeat the single per-target keyStyle
NESTED_KEY_TARGETS assumes a whole client is exact (PascalCase) or lower-first (camelCase). But client-eventbridge, client-scheduler, and client-glue are PascalCase models with camelCase ISLANDS (awsvpcConfiguration, capacityProvider, type/field/expression, scanRate/scanAll). An extra classification bucket — "exact-case miss but case-insensitive hit" — is what surfaced the EventBridge/Scheduler Fargate-target create failures and the Glue Crawler drops in the sweep. The critic should flag case-insensitive near-misses REGARDLESS of the target's declared keyStyle (it already has the case-divergence bucket; the gap is that non-target types aren't audited at all and keyStyle hides islands).
2. "Provider names the literal anywhere" heuristic is file-global
The DynamoDB GlobalTable GSI divergence (WriteProvisionedThroughputSettings etc.) was cleared by the literal heuristic because the same key names occur legitimately handled at TOP level elsewhere in the file. Literal evidence should be scoped (per handled top-level property, or at least weighted) — or such known-divergent blobs get explicit allow/deny entries.
3. Extend NESTED_KEY_TARGETS to the remaining blob-forwarding providers
The sweep produced ready-made nested-schema captures for all 133 registered types (fetched via cloudformation:DescribeType). Candidates found to carry real divergences: AWS::Events::Rule, AWS::Scheduler::Schedule, AWS::EMR::Cluster (+ InstanceGroupConfig/InstanceFleetConfig), AWS::Lambda::EventSourceMapping (map-key enum), AWS::CodeBuild::Project, AWS::DynamoDB::GlobalTable, AWS::Glue::Table / ::Crawler, AWS::WAFv2::WebACL, AWS::ECR::Repository, AWS::S3Vectors::VectorBucket (wrong CFn-side spelling — a read-side variant), AWS::Cognito::UserPool. Each has (or will have) its own bug issue; this issue tracks bringing them under the critic so the class stays closed.
4. SDK-bump-dependent unmappable keys (allow-list candidates)
Keys with NO member in the pinned SDK — unmappable until an SDK bump, should be allow-listed with rationale so they surface on every regen instead of silently passing:
AWS::Cognito::UserPool SmsConfiguration.EumsSms.* (End-User-Messaging SMS block; installed SmsConfigurationType has only SnsCallerArn/ExternalId/SnsRegion)
AWS::Lambda::Function / ::LayerVersion Code.S3ObjectStorageMode
AWS::WAFv2::WebACL PreParseTextTransformations, Monetize/PriceMultiplier
AWS::CodeBuild::Project Environment.HostKernel
5. Selective sub-key forward gaps are invisible to spelling diffs
The Cognito Policies.SignInPolicy drop (same-spelling SDK member exists; the provider just never forwards it) is a class the spelling critic structurally cannot catch — it needs the per-sub-key coverage idea: for a handled blob, every CFn nested key should be either reachable (same-spelling pass-through/spread), explicitly named, or allow-listed. The current critic treats "same spelling exists in SDK" as green even when the provider hand-builds the object and omits the key. Detecting hand-built-object omission likely needs the shape-aware v2 (#1378) machinery.
Related: #1373 (v1 critic), #1378 (shape-level v2), and the individual bug issues from the same sweep.
Summary
The 2026-08-09 horizontal sweep of the #1370 class (run with the #1373 critic's own machinery against ALL registered types' live CFn schemas) surfaced bugs the current critic design cannot see. Follow-up work to close the blind spots, complementing #1378 (shape-level v2):
1. Mixed-case SDK models defeat the single per-target
keyStyleNESTED_KEY_TARGETSassumes a whole client isexact(PascalCase) orlower-first(camelCase). Butclient-eventbridge,client-scheduler, andclient-glueare PascalCase models with camelCase ISLANDS (awsvpcConfiguration,capacityProvider,type/field/expression,scanRate/scanAll). An extra classification bucket — "exact-case miss but case-insensitive hit" — is what surfaced the EventBridge/Scheduler Fargate-target create failures and the Glue Crawler drops in the sweep. The critic should flag case-insensitive near-misses REGARDLESS of the target's declared keyStyle (it already has thecase-divergencebucket; the gap is that non-target types aren't audited at all and keyStyle hides islands).2. "Provider names the literal anywhere" heuristic is file-global
The DynamoDB GlobalTable GSI divergence (
WriteProvisionedThroughputSettingsetc.) was cleared by the literal heuristic because the same key names occur legitimately handled at TOP level elsewhere in the file. Literal evidence should be scoped (per handled top-level property, or at least weighted) — or such known-divergent blobs get explicit allow/deny entries.3. Extend
NESTED_KEY_TARGETSto the remaining blob-forwarding providersThe sweep produced ready-made nested-schema captures for all 133 registered types (fetched via
cloudformation:DescribeType). Candidates found to carry real divergences:AWS::Events::Rule,AWS::Scheduler::Schedule,AWS::EMR::Cluster(+ InstanceGroupConfig/InstanceFleetConfig),AWS::Lambda::EventSourceMapping(map-key enum),AWS::CodeBuild::Project,AWS::DynamoDB::GlobalTable,AWS::Glue::Table/::Crawler,AWS::WAFv2::WebACL,AWS::ECR::Repository,AWS::S3Vectors::VectorBucket(wrong CFn-side spelling — a read-side variant),AWS::Cognito::UserPool. Each has (or will have) its own bug issue; this issue tracks bringing them under the critic so the class stays closed.4. SDK-bump-dependent unmappable keys (allow-list candidates)
Keys with NO member in the pinned SDK — unmappable until an SDK bump, should be allow-listed with rationale so they surface on every regen instead of silently passing:
AWS::Cognito::UserPoolSmsConfiguration.EumsSms.*(End-User-Messaging SMS block; installedSmsConfigurationTypehas onlySnsCallerArn/ExternalId/SnsRegion)AWS::Lambda::Function/::LayerVersionCode.S3ObjectStorageModeAWS::WAFv2::WebACLPreParseTextTransformations,Monetize/PriceMultiplierAWS::CodeBuild::ProjectEnvironment.HostKernel5. Selective sub-key forward gaps are invisible to spelling diffs
The Cognito
Policies.SignInPolicydrop (same-spelling SDK member exists; the provider just never forwards it) is a class the spelling critic structurally cannot catch — it needs the per-sub-key coverage idea: for a handled blob, every CFn nested key should be either reachable (same-spelling pass-through/spread), explicitly named, or allow-listed. The current critic treats "same spelling exists in SDK" as green even when the provider hand-builds the object and omits the key. Detecting hand-built-object omission likely needs the shape-aware v2 (#1378) machinery.Related: #1373 (v1 critic), #1378 (shape-level v2), and the individual bug issues from the same sweep.