@intentius/chant-lexicon-aws 0.45.0 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/api/read-client.d.ts +10 -2
  2. package/dist/api/read-client.d.ts.map +1 -1
  3. package/dist/components/cloud-executor.d.ts.map +1 -1
  4. package/dist/composites/agentcore-agent.d.ts +26 -1
  5. package/dist/composites/agentcore-agent.d.ts.map +1 -1
  6. package/dist/composites/bucket-deployment.d.ts +82 -0
  7. package/dist/composites/bucket-deployment.d.ts.map +1 -0
  8. package/dist/composites/dynamodb-table.d.ts +45 -0
  9. package/dist/composites/dynamodb-table.d.ts.map +1 -0
  10. package/dist/composites/ec2-instance-bundle.d.ts +61 -0
  11. package/dist/composites/ec2-instance-bundle.d.ts.map +1 -0
  12. package/dist/composites/ecr-repository.d.ts +49 -0
  13. package/dist/composites/ecr-repository.d.ts.map +1 -0
  14. package/dist/composites/fargate-service.d.ts +16 -0
  15. package/dist/composites/fargate-service.d.ts.map +1 -1
  16. package/dist/composites/index.d.ts +16 -2
  17. package/dist/composites/index.d.ts.map +1 -1
  18. package/dist/composites/lambda-function.d.ts +4 -4
  19. package/dist/composites/lambda-function.d.ts.map +1 -1
  20. package/dist/composites/monitoring-stack.d.ts +99 -0
  21. package/dist/composites/monitoring-stack.d.ts.map +1 -0
  22. package/dist/composites/nlb-service.d.ts +48 -0
  23. package/dist/composites/nlb-service.d.ts.map +1 -0
  24. package/dist/composites/step-functions-workflow.d.ts +36 -0
  25. package/dist/composites/step-functions-workflow.d.ts.map +1 -0
  26. package/dist/deep-observe.d.ts +45 -0
  27. package/dist/deep-observe.d.ts.map +1 -1
  28. package/dist/deep-topology.d.ts +104 -0
  29. package/dist/deep-topology.d.ts.map +1 -0
  30. package/dist/effect-receipt-row.d.ts +92 -0
  31. package/dist/effect-receipt-row.d.ts.map +1 -0
  32. package/dist/index.d.ts +6 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/integrity.json +9 -4
  35. package/dist/lint/audit-catalog.d.ts.map +1 -1
  36. package/dist/lint/post-synth/cf-refs.d.ts +24 -0
  37. package/dist/lint/post-synth/cf-refs.d.ts.map +1 -1
  38. package/dist/lint/post-synth/index.d.ts.map +1 -1
  39. package/dist/lint/post-synth/waw059.d.ts +36 -0
  40. package/dist/lint/post-synth/waw059.d.ts.map +1 -0
  41. package/dist/lint/post-synth/waw060.d.ts +16 -0
  42. package/dist/lint/post-synth/waw060.d.ts.map +1 -0
  43. package/dist/lint/post-synth/waw061.d.ts +19 -0
  44. package/dist/lint/post-synth/waw061.d.ts.map +1 -0
  45. package/dist/lint/post-synth/waw062.d.ts +19 -0
  46. package/dist/lint/post-synth/waw062.d.ts.map +1 -0
  47. package/dist/lint/post-synth/waw063.d.ts +35 -0
  48. package/dist/lint/post-synth/waw063.d.ts.map +1 -0
  49. package/dist/manifest.json +1 -1
  50. package/dist/okf/index.md +5 -0
  51. package/dist/okf/rules/WAW059.md +25 -0
  52. package/dist/okf/rules/WAW060.md +17 -0
  53. package/dist/okf/rules/WAW061.md +17 -0
  54. package/dist/okf/rules/WAW062.md +27 -0
  55. package/dist/okf/rules/WAW063.md +19 -0
  56. package/dist/okf/types/Action.md +2 -0
  57. package/dist/okf/types/AutoScalingGroup.md +1 -0
  58. package/dist/okf/types/Bucket.md +2 -0
  59. package/dist/okf/types/ECRRepository.md +1 -0
  60. package/dist/okf/types/Function.md +1 -0
  61. package/dist/okf/types/GlobalTable.md +4 -0
  62. package/dist/okf/types/IamPolicy.md +3 -0
  63. package/dist/okf/types/InstanceProfile.md +4 -0
  64. package/dist/okf/types/LaunchTemplate.md +1 -0
  65. package/dist/okf/types/LoadBalancer.md +1 -0
  66. package/dist/okf/types/ManagedPolicy.md +4 -0
  67. package/dist/okf/types/Map.md +2 -0
  68. package/dist/okf/types/Queue.md +1 -0
  69. package/dist/okf/types/Role.md +3 -0
  70. package/dist/okf/types/SecurityGroup.md +1 -0
  71. package/dist/okf/types/StateMachine.md +4 -0
  72. package/dist/okf/types/Subnet.md +4 -0
  73. package/dist/okf/types/Table.md +2 -0
  74. package/dist/okf/types/Type.md +5 -0
  75. package/dist/okf/types/Vpc.md +1 -0
  76. package/dist/op/activities/aws-apply.d.ts +48 -5
  77. package/dist/op/activities/aws-apply.d.ts.map +1 -1
  78. package/dist/op/activities/index.d.ts +11 -4
  79. package/dist/op/activities/index.d.ts.map +1 -1
  80. package/dist/ownership.d.ts +18 -0
  81. package/dist/ownership.d.ts.map +1 -1
  82. package/dist/plugin.d.ts.map +1 -1
  83. package/dist/receipt-store.d.ts +109 -0
  84. package/dist/receipt-store.d.ts.map +1 -0
  85. package/dist/rules/cf-refs.ts +62 -0
  86. package/dist/rules/waw059.ts +353 -0
  87. package/dist/rules/waw060.ts +91 -0
  88. package/dist/rules/waw061.ts +67 -0
  89. package/dist/rules/waw062.ts +0 -0
  90. package/dist/rules/waw063.ts +0 -0
  91. package/dist/serializer.d.ts.map +1 -1
  92. package/dist/skills/chant-aws-carve-terraform.md +26 -23
  93. package/dist/teardown.d.ts +85 -0
  94. package/dist/teardown.d.ts.map +1 -0
  95. package/package.json +3 -3
  96. package/src/api/read-client.test.ts +9 -0
  97. package/src/api/read-client.ts +15 -2
  98. package/src/components/cloud-executor.ts +10 -1
  99. package/src/composites/agentcore-agent.ts +35 -13
  100. package/src/composites/bucket-deployment.test.ts +84 -0
  101. package/src/composites/bucket-deployment.ts +153 -0
  102. package/src/composites/composites.test.ts +325 -0
  103. package/src/composites/dynamodb-table.test.ts +154 -0
  104. package/src/composites/dynamodb-table.ts +124 -0
  105. package/src/composites/ec2-instance-bundle.ts +134 -0
  106. package/src/composites/ecr-repository.test.ts +118 -0
  107. package/src/composites/ecr-repository.ts +117 -0
  108. package/src/composites/fargate-service.ts +19 -3
  109. package/src/composites/index.ts +21 -2
  110. package/src/composites/monitoring-stack.test.ts +130 -0
  111. package/src/composites/monitoring-stack.ts +164 -0
  112. package/src/composites/nlb-service.ts +117 -0
  113. package/src/composites/step-functions-workflow.ts +127 -0
  114. package/src/deep-observe.test.ts +201 -1
  115. package/src/deep-observe.ts +204 -0
  116. package/src/deep-topology.test.ts +392 -0
  117. package/src/deep-topology.ts +237 -0
  118. package/src/effect-receipt-row.test.ts +164 -0
  119. package/src/effect-receipt-row.ts +147 -0
  120. package/src/index.ts +28 -7
  121. package/src/lifecycle-integration.test.ts +4 -0
  122. package/src/lint/audit-catalog.ts +11 -0
  123. package/src/lint/post-synth/cf-refs.ts +62 -0
  124. package/src/lint/post-synth/index.ts +10 -0
  125. package/src/lint/post-synth/waw059.test.ts +309 -0
  126. package/src/lint/post-synth/waw059.ts +353 -0
  127. package/src/lint/post-synth/waw060.test.ts +131 -0
  128. package/src/lint/post-synth/waw060.ts +91 -0
  129. package/src/lint/post-synth/waw061.test.ts +99 -0
  130. package/src/lint/post-synth/waw061.ts +67 -0
  131. package/src/lint/post-synth/waw062.test.ts +109 -0
  132. package/src/lint/post-synth/waw062.ts +0 -0
  133. package/src/lint/post-synth/waw063.test.ts +220 -0
  134. package/src/lint/post-synth/waw063.ts +0 -0
  135. package/src/op/activities/aws-apply.test.ts +111 -0
  136. package/src/op/activities/aws-apply.ts +100 -6
  137. package/src/op/activities/index.ts +20 -3
  138. package/src/ownership.test.ts +24 -1
  139. package/src/ownership.ts +37 -0
  140. package/src/plugin.ts +59 -10
  141. package/src/receipt-store.test.ts +204 -0
  142. package/src/receipt-store.ts +315 -0
  143. package/src/serializer-ownership.test.ts +18 -0
  144. package/src/serializer.ts +114 -3
  145. package/src/skills/chant-aws-carve-terraform.md +26 -23
  146. package/src/teardown.test.ts +258 -0
  147. package/src/teardown.ts +276 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * WAW059: Wildcard Resource where the declared graph enumerates the touched set
3
+ *
4
+ * An identity policy that allows resource-scopable actions on `Resource: "*"`
5
+ * (or a service-wide ARN pattern) when every consumer of the attached role
6
+ * only touches resources declared in the same template. In that case the
7
+ * declared graph already enumerates the touched set, so the statement can be
8
+ * tightened to the `Fn::GetAtt` Arn list of those declared entities.
9
+ *
10
+ * Deliberately narrow (#1225). Fires only when ALL of these hold:
11
+ * - the statement is an `Effect: Allow` identity-policy statement (role inline
12
+ * policy, IAM::Policy, IAM::ManagedPolicy) — trust policies carry a
13
+ * Principal and are skipped, resource policies live on other types;
14
+ * - no Condition/NotAction/NotResource and no intrinsics in Action/Resource;
15
+ * - `Resource` is `"*"` or a service-wide ARN pattern;
16
+ * - every Action is in the curated resource-scopable table (s3, dynamodb,
17
+ * sqs) — actions that genuinely need `"*"` (s3:ListAllMyBuckets,
18
+ * dynamodb:ListTables, sqs:ListQueues) are not in the table;
19
+ * - the attached principal resolves to declared roles only, those roles have
20
+ * consumers in the template, and no consumer carries a foreign edge (a
21
+ * literal ARN of the service) or an intrinsic edge (Fn::ImportValue) that
22
+ * would put resources outside the declared graph in reach.
23
+ *
24
+ * Anything the static graph cannot prove stays quiet.
25
+ */
26
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
27
+ /**
28
+ * Curated table of actions that support resource-level permissions, per
29
+ * service. Lower-cased (IAM action matching is case-insensitive). An action
30
+ * outside this table gates the whole statement off — it may legitimately
31
+ * require `Resource: "*"`.
32
+ */
33
+ export declare const RESOURCE_SCOPABLE_ACTIONS: Record<string, ReadonlySet<string>>;
34
+ export declare function checkWildcardResourceEnumerable(ctx: PostSynthContext): PostSynthDiagnostic[];
35
+ export declare const waw059: PostSynthCheck;
36
+ //# sourceMappingURL=waw059.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waw059.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/waw059.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAW9G;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CA6CzE,CAAC;AA6KF,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CAiF5F;AAED,eAAO,MAAM,MAAM,EAAE,cAQpB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * WAW060: IAM Policy Attached to No Principal
3
+ *
4
+ * Flags AWS::IAM::Policy / AWS::IAM::ManagedPolicy resources with empty or
5
+ * absent Roles, Users, and Groups that no other part of the template
6
+ * references. A policy attached to no principal grants nothing — the same
7
+ * detached-guardrail shape WAW057 catches for SCPs. Any Ref/GetAtt edge to
8
+ * the policy (a role's ManagedPolicyArns, an attachment-style resource, a
9
+ * stack Output exporting it for another stack to attach) keeps it quiet;
10
+ * plain AWS-managed ARN strings elsewhere are not references to the
11
+ * template's own policy.
12
+ */
13
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
14
+ export declare function checkPolicyUnattached(ctx: PostSynthContext): PostSynthDiagnostic[];
15
+ export declare const waw060: PostSynthCheck;
16
+ //# sourceMappingURL=waw060.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waw060.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/waw060.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAsB9G,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CA8ClF;AAED,eAAO,MAAM,MAAM,EAAE,cAOpB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * WAW061: Subnet CIDR Not Contained In VPC CIDR
3
+ *
4
+ * A subnet's CidrBlock must fall entirely inside its VPC's CidrBlock.
5
+ * Stock CDK does not check this — CloudFormation accepts the template and
6
+ * only fails the `AWS::EC2::Subnet` resource at deploy time
7
+ * ("The CIDR ... is invalid" / "does not fall within the CIDR range of the
8
+ * VPC"), after the rest of the stack may have already started rolling out.
9
+ * This is a cheap static graph check: follow the subnet's VpcId Ref to a
10
+ * declared VPC in the same template and do IPv4 CIDR-range math.
11
+ *
12
+ * Stays quiet whenever the graph can't prove it: intrinsic CIDR blocks,
13
+ * IPv6, a VpcId that isn't a simple Ref to a declared AWS::EC2::VPC, or a
14
+ * VPC whose own CidrBlock isn't a literal string.
15
+ */
16
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
17
+ export declare function checkSubnetCidrContainment(ctx: PostSynthContext): PostSynthDiagnostic[];
18
+ export declare const waw061: PostSynthCheck;
19
+ //# sourceMappingURL=waw061.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waw061.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/waw061.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAG9G,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CAsCvF;AAED,eAAO,MAAM,MAAM,EAAE,cAOpB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * WAW062: Duplicate Name Or Export Within A Template
3
+ *
4
+ * CloudFormation requires certain names to be unique within a single
5
+ * template/stack: `Outputs.*.Export.Name`, and several resource-level
6
+ * "explicit name" properties (LaunchTemplateName, AutoScalingGroupName,
7
+ * GroupName, ...). Stock CDK doesn't catch a collision here — synth
8
+ * succeeds and the stack fails at CloudFormation deploy/changeset time.
9
+ * A duplicate is easy to introduce by copy-pasting a composite invocation
10
+ * (e.g. two EcrRepository or NlbService composites) without varying the
11
+ * explicit name.
12
+ *
13
+ * Only literal string values are compared — anything built from an
14
+ * intrinsic (Fn::Sub, Ref, ...) is statically unprovable and skipped.
15
+ */
16
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
17
+ export declare function checkDuplicateNamesAndExports(ctx: PostSynthContext): PostSynthDiagnostic[];
18
+ export declare const waw062: PostSynthCheck;
19
+ //# sourceMappingURL=waw062.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waw062.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/waw062.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAqF9G,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CAY1F;AAED,eAAO,MAAM,MAAM,EAAE,cAOpB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * WAW063: IAM Policy Denies An Action It Also Allows
3
+ *
4
+ * IAM evaluates an explicit Deny as an absolute veto: it wins over any
5
+ * Allow granted to the same principal, from any attached policy, no matter
6
+ * how the Allow got there. When a role ends up with both an Allow and a
7
+ * Deny for the same action (over an overlapping resource scope) —
8
+ * typically because a broad guardrail policy and a feature-specific policy
9
+ * were attached to the same role independently — CloudFormation deploys
10
+ * the stack without complaint and the contradiction only surfaces as a
11
+ * runtime 403, the most expensive class of error to trace back to its
12
+ * source. This is IAM-reasoning static analysis over the declared graph:
13
+ * collect every Allow/Deny statement attached to each declared IAM::Role
14
+ * (inline, standalone IAM::Policy, and IAM::ManagedPolicy) and flag a
15
+ * literal action+resource collision between an Allow and a Deny.
16
+ *
17
+ * Deliberately conservative to avoid flagging the common intentional
18
+ * "broad Allow + narrow safety-Deny" guardrail pattern (e.g. `Allow ec2:*`
19
+ * plus `Deny ec2:TerminateInstances`):
20
+ * - both statements' Action lists are compared string-by-string; a match
21
+ * requires either the literal same action on both sides, or a
22
+ * wildcarded Deny action that matches a literal (non-wildcarded) Allow
23
+ * action. A wildcarded Allow paired with a literal Deny is exactly the
24
+ * guardrail pattern and is never flagged;
25
+ * - resources are compared the same way: `Resource: "*"` on the Deny
26
+ * side always overlaps, or a literal exact match; a wildcarded Allow
27
+ * resource paired with a narrower literal Deny is not flagged;
28
+ * - any statement carrying a Condition, NotAction, NotResource,
29
+ * Principal, or an intrinsic Action/Resource is skipped — the rule
30
+ * can't prove those statically, so it stays quiet.
31
+ */
32
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
33
+ export declare function checkDenyAllowContradiction(ctx: PostSynthContext): PostSynthDiagnostic[];
34
+ export declare const waw063: PostSynthCheck;
35
+ //# sourceMappingURL=waw063.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waw063.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/waw063.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAyG9G,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CA8CxF;AAED,eAAO,MAAM,MAAM,EAAE,cAOpB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aws",
3
- "version": "0.45.0",
3
+ "version": "0.49.0",
4
4
  "chantVersion": ">=0.1.0",
5
5
  "namespace": "AWS",
6
6
  "intrinsics": [
package/dist/okf/index.md CHANGED
@@ -1722,3 +1722,8 @@ okf_version: '0.2'
1722
1722
  * [WAW056](/rules/WAW056.md) - SCP guardrail has no Deny statement — it constrains nothing
1723
1723
  * [WAW057](/rules/WAW057.md) - SCP guardrail is attached to no targets — it enforces nothing
1724
1724
  * [WAW058](/rules/WAW058.md) - Organization audit trail missing, not logging, or scoped down to a single region
1725
+ * [WAW059](/rules/WAW059.md) - Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
1726
+ * [WAW060](/rules/WAW060.md) - IAM policy attached to no principal — it grants nothing
1727
+ * [WAW061](/rules/WAW061.md) - Subnet CidrBlock falls outside its VPC's CidrBlock — fails at deploy time
1728
+ * [WAW062](/rules/WAW062.md) - Duplicate export name or explicit resource name within a template — fails at deploy time
1729
+ * [WAW063](/rules/WAW063.md) - IAM policy denies an action another attached policy on the same role allows — explicit Deny wins, runtime 403
@@ -0,0 +1,25 @@
1
+ ---
2
+ type: post-synth-check
3
+ title: WAW059
4
+ description: Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
5
+ id: WAW059
6
+ severity: error
7
+ category: post-synth
8
+ lexicon: aws
9
+ docs: https://intentius.io/chant/lexicons/aws/rules/
10
+ ---
11
+ Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
12
+
13
+ ## Applies to
14
+
15
+ - [Action](/types/Action.md)
16
+ - [Bucket](/types/Bucket.md)
17
+ - [GlobalTable](/types/GlobalTable.md)
18
+ - [IamPolicy](/types/IamPolicy.md)
19
+ - [InstanceProfile](/types/InstanceProfile.md)
20
+ - [ManagedPolicy](/types/ManagedPolicy.md)
21
+ - [Map](/types/Map.md)
22
+ - [Queue](/types/Queue.md)
23
+ - [Role](/types/Role.md)
24
+ - [Table](/types/Table.md)
25
+ - [Type](/types/Type.md)
@@ -0,0 +1,17 @@
1
+ ---
2
+ type: post-synth-check
3
+ title: WAW060
4
+ description: IAM policy attached to no principal — it grants nothing
5
+ id: WAW060
6
+ severity: error
7
+ category: post-synth
8
+ lexicon: aws
9
+ docs: https://intentius.io/chant/lexicons/aws/rules/
10
+ ---
11
+ IAM policy attached to no principal — it grants nothing
12
+
13
+ ## Applies to
14
+
15
+ - [IamPolicy](/types/IamPolicy.md)
16
+ - [ManagedPolicy](/types/ManagedPolicy.md)
17
+ - [Type](/types/Type.md)
@@ -0,0 +1,17 @@
1
+ ---
2
+ type: post-synth-check
3
+ title: WAW061
4
+ description: Subnet CidrBlock falls outside its VPC's CidrBlock — fails at deploy time
5
+ id: WAW061
6
+ severity: error
7
+ category: post-synth
8
+ lexicon: aws
9
+ docs: https://intentius.io/chant/lexicons/aws/rules/
10
+ ---
11
+ Subnet CidrBlock falls outside its VPC's CidrBlock — fails at deploy time
12
+
13
+ ## Applies to
14
+
15
+ - [Subnet](/types/Subnet.md)
16
+ - [Type](/types/Type.md)
17
+ - [Vpc](/types/Vpc.md)
@@ -0,0 +1,27 @@
1
+ ---
2
+ type: post-synth-check
3
+ title: WAW062
4
+ description: Duplicate export name or explicit resource name within a template — fails at deploy time
5
+ id: WAW062
6
+ severity: error
7
+ category: post-synth
8
+ lexicon: aws
9
+ docs: https://intentius.io/chant/lexicons/aws/rules/
10
+ ---
11
+ Duplicate export name or explicit resource name within a template — fails at deploy time
12
+
13
+ ## Applies to
14
+
15
+ - [AutoScalingGroup](/types/AutoScalingGroup.md)
16
+ - [Bucket](/types/Bucket.md)
17
+ - [ECRRepository](/types/ECRRepository.md)
18
+ - [Function](/types/Function.md)
19
+ - [LaunchTemplate](/types/LaunchTemplate.md)
20
+ - [LoadBalancer](/types/LoadBalancer.md)
21
+ - [ManagedPolicy](/types/ManagedPolicy.md)
22
+ - [Map](/types/Map.md)
23
+ - [Role](/types/Role.md)
24
+ - [SecurityGroup](/types/SecurityGroup.md)
25
+ - [StateMachine](/types/StateMachine.md)
26
+ - [Table](/types/Table.md)
27
+ - [Type](/types/Type.md)
@@ -0,0 +1,19 @@
1
+ ---
2
+ type: post-synth-check
3
+ title: WAW063
4
+ description: IAM policy denies an action another attached policy on the same role allows — explicit Deny wins, runtime 403
5
+ id: WAW063
6
+ severity: error
7
+ category: post-synth
8
+ lexicon: aws
9
+ docs: https://intentius.io/chant/lexicons/aws/rules/
10
+ ---
11
+ IAM policy denies an action another attached policy on the same role allows — explicit Deny wins, runtime 403
12
+
13
+ ## Applies to
14
+
15
+ - [Action](/types/Action.md)
16
+ - [IamPolicy](/types/IamPolicy.md)
17
+ - [ManagedPolicy](/types/ManagedPolicy.md)
18
+ - [Role](/types/Role.md)
19
+ - [Type](/types/Type.md)
@@ -31,3 +31,5 @@ resource_type: AWS::SageMaker::Action
31
31
  ## Governed by
32
32
 
33
33
  - [WAW020](/rules/WAW020.md): IAM policy uses wildcard Action — use specific actions following least privilege
34
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
35
+ - [WAW063](/rules/WAW063.md): IAM policy denies an action another attached policy on the same role allows — explicit Deny wins, runtime 403
@@ -57,3 +57,4 @@ resource_type: AWS::AutoScaling::AutoScalingGroup
57
57
  ## Governed by
58
58
 
59
59
  - [WAW036](/rules/WAW036.md): Non-ASCII characters in EC2/IAM/CW string properties — rejected at changeset time
60
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -63,3 +63,5 @@ resource_type: AWS::S3::Bucket
63
63
  - [WAW006](/rules/WAW006.md): S3 Bucket Encryption
64
64
  - [WAW018](/rules/WAW018.md): S3 bucket missing public access block — all public access should be blocked
65
65
  - [WAW042](/rules/WAW042.md): S3 bucket missing a TLS-only bucket policy — deny requests over plaintext
66
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
67
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -31,3 +31,4 @@ resource_type: AWS::ECR::Repository
31
31
 
32
32
  - [WAW053](/rules/WAW053.md): ECR repository does not scan images on push
33
33
  - [WAW054](/rules/WAW054.md): ECR repository does not have immutable image tags
34
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -56,3 +56,4 @@ resource_type: AWS::Lambda::Function
56
56
  - [WAW011](/rules/WAW011.md): Deprecated Lambda runtime — flags deprecated or approaching-EOL Lambda runtimes
57
57
  - [WAW022](/rules/WAW022.md): Lambda function is not configured with a VPC — consider adding VpcConfig for network isolation
58
58
  - [WAW036](/rules/WAW036.md): Non-ASCII characters in EC2/IAM/CW string properties — rejected at changeset time
59
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -37,3 +37,7 @@ resource_type: AWS::DynamoDB::GlobalTable
37
37
  - `Arn`
38
38
  - `StreamArn`
39
39
  - `TableId`
40
+
41
+ ## Governed by
42
+
43
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
@@ -24,3 +24,6 @@ resource_type: AWS::IAM::Policy
24
24
  ## Governed by
25
25
 
26
26
  - [WAW020](/rules/WAW020.md): IAM policy uses wildcard Action — use specific actions following least privilege
27
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
28
+ - [WAW060](/rules/WAW060.md): IAM policy attached to no principal — it grants nothing
29
+ - [WAW063](/rules/WAW063.md): IAM policy denies an action another attached policy on the same role allows — explicit Deny wins, runtime 403
@@ -18,3 +18,7 @@ resource_type: AWS::IAM::InstanceProfile
18
18
  ## Attributes
19
19
 
20
20
  - `Arn`
21
+
22
+ ## Governed by
23
+
24
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
@@ -27,3 +27,4 @@ resource_type: AWS::EC2::LaunchTemplate
27
27
  ## Governed by
28
28
 
29
29
  - [WAW036](/rules/WAW036.md): Non-ASCII characters in EC2/IAM/CW string properties — rejected at changeset time
30
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -41,3 +41,4 @@ resource_type: AWS::ElasticLoadBalancingV2::LoadBalancer
41
41
  ## Governed by
42
42
 
43
43
  - [WAW024](/rules/WAW024.md): Application Load Balancer does not have access logging enabled
44
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -40,3 +40,7 @@ resource_type: AWS::IAM::ManagedPolicy
40
40
  ## Governed by
41
41
 
42
42
  - [WAW020](/rules/WAW020.md): IAM policy uses wildcard Action — use specific actions following least privilege
43
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
44
+ - [WAW060](/rules/WAW060.md): IAM policy attached to no principal — it grants nothing
45
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
46
+ - [WAW063](/rules/WAW063.md): IAM policy denies an action another attached policy on the same role allows — explicit Deny wins, runtime 403
@@ -34,3 +34,5 @@ resource_type: AWS::Location::Map
34
34
  - [WAW015](/rules/WAW015.md): Circular dependency between nested stacks would cause infinite build recursion
35
35
  - [WAW016](/rules/WAW016.md): Deprecated property usage — flags properties marked as deprecated in the CloudFormation Registry
36
36
  - [WAW036](/rules/WAW036.md): Non-ASCII characters in EC2/IAM/CW string properties — rejected at changeset time
37
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
38
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -37,3 +37,4 @@ resource_type: AWS::SQS::Queue
37
37
  ## Governed by
38
38
 
39
39
  - [WAW026](/rules/WAW026.md): SQS queue is not encrypted — enable SqsManagedSseEnabled or set KmsMasterKeyId
40
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
@@ -31,3 +31,6 @@ resource_type: AWS::IAM::Role
31
31
 
32
32
  - [WAW020](/rules/WAW020.md): IAM policy uses wildcard Action — use specific actions following least privilege
33
33
  - [WAW036](/rules/WAW036.md): Non-ASCII characters in EC2/IAM/CW string properties — rejected at changeset time
34
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
35
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
36
+ - [WAW063](/rules/WAW063.md): IAM policy denies an action another attached policy on the same role allows — explicit Deny wins, runtime 403
@@ -29,3 +29,4 @@ resource_type: AWS::EC2::SecurityGroup
29
29
  - [WAW019](/rules/WAW019.md): Security group allows unrestricted ingress on sensitive ports (SSH, RDP, database)
30
30
  - [WAW036](/rules/WAW036.md): Non-ASCII characters in EC2/IAM/CW string properties — rejected at changeset time
31
31
  - [WAW049](/rules/WAW049.md): Security group allows unrestricted ingress on a port other than ALB:80/443
32
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -30,3 +30,7 @@ resource_type: AWS::StepFunctions::StateMachine
30
30
  - `Arn`
31
31
  - `Name`
32
32
  - `StateMachineRevisionId`
33
+
34
+ ## Governed by
35
+
36
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -38,3 +38,7 @@ resource_type: AWS::EC2::Subnet
38
38
  - `Ipv6CidrBlocks`
39
39
  - `NetworkAclAssociationId`
40
40
  - `SubnetId`
41
+
42
+ ## Governed by
43
+
44
+ - [WAW061](/rules/WAW061.md): Subnet CidrBlock falls outside its VPC's CidrBlock — fails at deploy time
@@ -42,3 +42,5 @@ resource_type: AWS::DynamoDB::Table
42
42
 
43
43
  - [WAW027](/rules/WAW027.md): DynamoDB table does not have point-in-time recovery enabled
44
44
  - [WAW030](/rules/WAW030.md): Missing DependsOn for known CloudFormation ordering patterns
45
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
46
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
@@ -73,3 +73,8 @@ resource_type: AWS::Cassandra::Type
73
73
  - [WAW056](/rules/WAW056.md): SCP guardrail has no Deny statement — it constrains nothing
74
74
  - [WAW057](/rules/WAW057.md): SCP guardrail is attached to no targets — it enforces nothing
75
75
  - [WAW058](/rules/WAW058.md): Organization audit trail missing, not logging, or scoped down to a single region
76
+ - [WAW059](/rules/WAW059.md): Wildcard Resource where the declared graph enumerates the touched set — tighten to the consumers' declared Arns
77
+ - [WAW060](/rules/WAW060.md): IAM policy attached to no principal — it grants nothing
78
+ - [WAW061](/rules/WAW061.md): Subnet CidrBlock falls outside its VPC's CidrBlock — fails at deploy time
79
+ - [WAW062](/rules/WAW062.md): Duplicate export name or explicit resource name within a template — fails at deploy time
80
+ - [WAW063](/rules/WAW063.md): IAM policy denies an action another attached policy on the same role allows — explicit Deny wins, runtime 403
@@ -64,3 +64,4 @@ resource_type: AWS::EC2::VPC
64
64
  ## Governed by
65
65
 
66
66
  - [WAW030](/rules/WAW030.md): Missing DependsOn for known CloudFormation ordering patterns
67
+ - [WAW061](/rules/WAW061.md): Subnet CidrBlock falls outside its VPC's CidrBlock — fails at deploy time
@@ -35,6 +35,12 @@ export declare function cfnUrl(endpoint?: string, region?: string, env?: Record<
35
35
  export declare function cfnForm(action: string, params: Record<string, string>): Record<string, string>;
36
36
  /** Capabilities as the CFN `Capabilities.member.N` list params. */
37
37
  export declare function capabilityParams(capabilities: string[]): Record<string, string>;
38
+ /**
39
+ * Stack tags as the CFN `Tags.member.N.Key/Value` list params (#1222). Sorted
40
+ * so the request is deterministic. Empty in, empty out — a template without an
41
+ * ownership marker adds no `Tags` parameter at all.
42
+ */
43
+ export declare function tagParams(tags: Record<string, string>): Record<string, string>;
38
44
  /**
39
45
  * First `<tag>…</tag>` text in a CFN XML response.
40
46
  *
@@ -65,22 +71,59 @@ export declare function waitForStackSettled(url: string, stackName: string, http
65
71
  * CloudFormation API directly (create-or-update + poll to a settled stack),
66
72
  * targeting a local Floci emulator or real AWS by endpoint override. The direct
67
73
  * twin of `azApply`/`gcpApply`: it speaks the CloudFormation Query API over HTTP
68
- * rather than shelling `aws cloudformation deploy` (that CLI path is still
69
- * available via `nativeApply({ target: "cloudformation" })`). The stack is the
70
- * ownership boundary, so deletes ride CloudFormation itself — no separate prune.
71
- * `http` is injectable for tests.
74
+ * rather than shelling `aws cloudformation deploy` and since chant #1449 it is
75
+ * also what `nativeApply({ target: "cloudformation" })` runs, so no CLI path
76
+ * remains. The stack is the ownership boundary, so deletes ride CloudFormation
77
+ * itself — no separate prune. `http` is injectable for tests.
72
78
  */
73
79
  export declare function awsApply(args: AwsApplyArgs, signal?: AbortSignal, http?: AwsHttp): Promise<{
74
80
  stackName: string;
75
81
  status: string;
76
82
  action: "created" | "updated" | "unchanged";
77
83
  }>;
84
+ /** {@link awsDelete}'s arguments: {@link AwsApplyArgs} minus the template — a
85
+ * delete needs no body, so teardown (#1222) can call it with a stack name
86
+ * alone. Op builders that thread `templatePath` through keep working; it is
87
+ * simply unused here. */
88
+ export type AwsDeleteArgs = Omit<AwsApplyArgs, "templatePath"> & {
89
+ templatePath?: string;
90
+ };
78
91
  /**
79
92
  * The inverse of {@link awsApply} — DeleteStack, then poll until the stack is
80
93
  * gone. Idempotent: an already-absent stack is a no-op. `http` is injectable.
81
94
  */
82
- export declare function awsDelete(args: AwsApplyArgs, signal?: AbortSignal, http?: AwsHttp): Promise<{
95
+ export declare function awsDelete(args: AwsDeleteArgs, signal?: AbortSignal, http?: AwsHttp): Promise<{
83
96
  stackName: string;
84
97
  deleted: boolean;
85
98
  }>;
99
+ export interface RollbackStackArgs {
100
+ /** CloudFormation stack name to roll back. */
101
+ stackName: string;
102
+ /** CFN endpoint override — same resolution rule as {@link AwsApplyArgs.endpoint} (#1694). */
103
+ endpoint?: string;
104
+ /** Region (real CFN host). Default: `us-east-1`. */
105
+ region?: string;
106
+ /** Stack-settle timeout in ms. Default: `300000`. */
107
+ timeoutMs?: number;
108
+ /** Poll interval in ms. Default: `3000`. */
109
+ intervalMs?: number;
110
+ }
111
+ /**
112
+ * The saga compensation for {@link awsApply} — CloudFormation `RollbackStack`
113
+ * via the same Query-API client, then poll until the stack settles. Returns the
114
+ * stack to its last known stable state after a failed update (#1449 — this
115
+ * replaces the Temporal lexicon exec-ing `aws cloudformation rollback-stack`).
116
+ *
117
+ * Degrades rather than crashes in two cases where there is nothing to do:
118
+ * an absent stack (nothing applied, nothing to revert) and a target that does
119
+ * not implement the action — Floci answers `UnknownAction` (#947). Both return
120
+ * `rolledBack: false` with a logged warning; every other API error throws,
121
+ * because a compensation that silently fails leaves partial state looking
122
+ * reverted when it isn't. `http` is injectable for tests.
123
+ */
124
+ export declare function rollbackStack(args: RollbackStackArgs, signal?: AbortSignal, http?: AwsHttp): Promise<{
125
+ stackName: string;
126
+ rolledBack: boolean;
127
+ status?: string;
128
+ }>;
86
129
  //# sourceMappingURL=aws-apply.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"aws-apply.d.ts","sourceRoot":"","sources":["../../../src/op/activities/aws-apply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aws-apply.d.ts","sourceRoot":"","sources":["../../../src/op/activities/aws-apply.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@
2
2
  * AWS Op activities — resolved by the core activity registry when a project's
3
3
  * `chant.config.ts` lists the `aws` lexicon. Contributes the local Floci AWS
4
4
  * emulator lifecycle (`flociUp`/`flociDown`) and the native CloudFormation
5
- * applier (`awsApply`), which calls the CloudFormation API directly rather than
6
- * shelling `aws` — the direct twin of `azApply`/`gcpApply`.
5
+ * applier (`awsApply`, with `awsDelete` and the `rollbackStack` compensation),
6
+ * which calls the CloudFormation API directly rather than shelling `aws` — the
7
+ * direct twin of `azApply`/`gcpApply`.
7
8
  *
8
9
  * The registry keys every exported *function* here by its name, so only the
9
10
  * activities themselves belong in this barrel. `awsAgentCoreFetchTrace`'s
@@ -15,8 +16,14 @@
15
16
  */
16
17
  export { flociUp, flociDown, flociRunCommand, flociRmCommand, flociExistsCommand, flociHealthUrl, flociEnv, isFlociReady, } from "./floci.js";
17
18
  export type { FlociUpArgs, FlociDownArgs } from "./floci.js";
18
- export { awsApply, awsDelete, waitForStackSettled, cfnUrl, cfnForm, capabilityParams, xmlField, stackStatus, stackId, cfnErrorMessage, isStackMissing, isNoUpdates, isSuccessStatus, isFailureStatus, isTerminalStatus, } from "./aws-apply.js";
19
- export type { AwsApplyArgs, AwsHttp } from "./aws-apply.js";
19
+ export { awsApply, awsDelete, rollbackStack, waitForStackSettled, cfnUrl, cfnForm, capabilityParams, xmlField, stackStatus, stackId, cfnErrorMessage, isStackMissing, isNoUpdates, isSuccessStatus, isFailureStatus, isTerminalStatus, } from "./aws-apply.js";
20
+ export type { AwsApplyArgs, RollbackStackArgs, AwsHttp } from "./aws-apply.js";
21
+ export declare const receiptRead: (args: import("@intentius/chant/op/receipt-store").ReceiptReadArgs, signal?: AbortSignal) => Promise<import("@intentius/chant/op/receipt-store").ReceiptReadResult>;
22
+ export declare const receiptWrite: (args: import("@intentius/chant/op/receipt-store").ReceiptWriteArgs, signal?: AbortSignal) => Promise<{
23
+ written: true;
24
+ receipt: string;
25
+ }>;
26
+ export declare const receiptStaleness: (args: import("@intentius/chant/op/receipt-store").ReceiptStalenessArgs, signal?: AbortSignal) => Promise<import("@intentius/chant/op/receipt-store").ReceiptStalenessResult>;
20
27
  export { awsAgentCoreFetchTrace } from "../../agentcore/trace-fetch.js";
21
28
  export type { AgentCoreTraceSource, AwsAgentCoreFetchTraceArgs, AwsAgentCoreFetchTraceResult, } from "../../agentcore/trace-fetch.js";
22
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/op/activities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EACL,QAAQ,EACR,SAAS,EACT,mBAAmB,EACnB,MAAM,EACN,OAAO,EACP,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,OAAO,EACP,eAAe,EACf,cAAc,EACd,WAAW,EACX,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/op/activities/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EACL,OAAO,EACP,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EACL,QAAQ,EACR,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,MAAM,EACN,OAAO,EACP,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,OAAO,EACP,eAAe,EACf,cAAc,EACd,WAAW,EACX,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAa5E,eAAO,MAAM,WAAW,qKAAqC,CAAC;AAC9D,eAAO,MAAM,YAAY;;;EAAsC,CAAC;AAChE,eAAO,MAAM,gBAAgB,+KAA0C,CAAC;AAExE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EACV,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC"}
@@ -7,4 +7,22 @@
7
7
  import type { ChannelKeys } from "@intentius/chant/ownership";
8
8
  /** AWS tag keys for chant's ownership markers. */
9
9
  export declare const AWS_TAG_OWNERSHIP_KEYS: ChannelKeys;
10
+ /**
11
+ * Template-level `Metadata` key the serializer stamps the ownership marker
12
+ * under (#1222). Stack-level teardown verifies ownership on the *stack's own*
13
+ * tags, and CloudFormation stack tags are an API parameter, not a template
14
+ * section — so the template carries the marker here and the apply paths
15
+ * (`awsApply`, the `cfn-deploy` change set) turn it into stack tags on
16
+ * create/update. One source: the same build that stamps resource tags decides
17
+ * the stack tags.
18
+ */
19
+ export declare const OWNERSHIP_METADATA_KEY = "chant:ownership";
20
+ /**
21
+ * The stack tags a template body asks for: the flat tag map under
22
+ * `Metadata["chant:ownership"]`, or nothing. Total on bad input — a body that
23
+ * is not JSON (a YAML template, a handwritten one) or carries no marker
24
+ * returns `{}`, and the stack simply stays untagged, which teardown reports
25
+ * as unverified rather than deleting.
26
+ */
27
+ export declare function ownershipStackTagsForBody(body: string): Record<string, string>;
10
28
  //# sourceMappingURL=ownership.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../src/ownership.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,kDAAkD;AAClD,eAAO,MAAM,sBAAsB,EAAE,WAIpC,CAAC"}
1
+ {"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../src/ownership.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,kDAAkD;AAClD,eAAO,MAAM,sBAAsB,EAAE,WAIpC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,oBAAoB,CAAC;AAExD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB9E"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAgL,MAAM,0BAA0B,CAAC;AAqC5O;yEACyE;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiBnD,eAAO,MAAM,SAAS,EAAE,aAi6BvB,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAgL,MAAM,0BAA0B,CAAC;AAqC5O;yEACyE;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiBnD,eAAO,MAAM,SAAS,EAAE,aAk9BvB,CAAC"}