skilldrop-cli 1.13.0 → 1.14.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 (115) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/packs/ai-engineering/loops/ship-agent/LOOP.md +22 -8
  4. package/packs/ai-engineering/loops/ship-agent/evals/evals.json +30 -0
  5. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-invoice-matching/agent-idea.md +52 -0
  6. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-invoice-matching/dot.claude/settings.json +23 -0
  7. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-invoice-matching/dot.mcp.json +25 -0
  8. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-pass-bar-fitted-to-score/agent-brief.md +35 -0
  9. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-pass-bar-fitted-to-score/eval-run-1.md +26 -0
  10. package/packs/ai-engineering/loops/ship-agent/loop.json +1 -1
  11. package/packs/core/loops/ship-a-draft/LOOP.md +17 -0
  12. package/packs/core/loops/ship-a-draft/evals/evals.json +30 -0
  13. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-double-charge-runbook/support-notes.md +30 -0
  14. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-pilot-cut-to-two-branches/thread.md +23 -0
  15. package/packs/core/loops/ship-a-draft/loop.json +1 -1
  16. package/packs/data-analytics/loops/measure/LOOP.md +39 -10
  17. package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
  18. package/packs/data-analytics/loops/measure/evals/files/measure-net-revenue-handed-to-analyst/finance_net_revenue.sql +19 -0
  19. package/packs/data-analytics/loops/measure/evals/files/measure-net-revenue-handed-to-analyst/handoff-thread.md +24 -0
  20. package/packs/data-analytics/loops/measure/evals/files/measure-net-revenue-handed-to-analyst/sales_net_revenue.sql +10 -0
  21. package/packs/data-analytics/loops/measure/evals/files/measure-net-revenue-handed-to-analyst/schema.md +11 -0
  22. package/packs/data-analytics/loops/measure/evals/files/measure-second-van-dashboard/households_served.sql +12 -0
  23. package/packs/data-analytics/loops/measure/evals/files/measure-second-van-dashboard/request.md +18 -0
  24. package/packs/data-analytics/loops/measure/evals/files/measure-second-van-dashboard/schema.md +10 -0
  25. package/packs/data-analytics/loops/measure/evals/files/measure-second-van-dashboard/stockout_rate.sql +8 -0
  26. package/packs/data-analytics/loops/measure/loop.json +1 -1
  27. package/packs/dev-team/loops/build/LOOP.md +16 -0
  28. package/packs/dev-team/loops/build/evals/evals.json +28 -0
  29. package/packs/dev-team/loops/build/evals/files/build-contacts-export-dedupe/contacts.csv +6 -0
  30. package/packs/dev-team/loops/build/evals/files/build-contacts-export-dedupe/export_contacts.py +29 -0
  31. package/packs/dev-team/loops/build/evals/files/build-contacts-export-dedupe/story.md +15 -0
  32. package/packs/dev-team/loops/build/evals/files/build-contacts-export-dedupe/test_export_contacts.py +13 -0
  33. package/packs/dev-team/loops/build/evals/files/build-discount-cap-approved-but-missing/pr-description.md +6 -0
  34. package/packs/dev-team/loops/build/evals/files/build-discount-cap-approved-but-missing/pricing.py +12 -0
  35. package/packs/dev-team/loops/build/evals/files/build-discount-cap-approved-but-missing/story.md +12 -0
  36. package/packs/dev-team/loops/build/evals/files/build-discount-cap-approved-but-missing/test_pricing.py +22 -0
  37. package/packs/dev-team/loops/build/loop.json +1 -1
  38. package/packs/dev-team/loops/modernize/LOOP.md +18 -1
  39. package/packs/dev-team/loops/modernize/evals/evals.json +29 -0
  40. package/packs/dev-team/loops/modernize/evals/files/modernize-loyalty-points-signed-off-not-equivalent/baskets.csv +11 -0
  41. package/packs/dev-team/loops/modernize/evals/files/modernize-loyalty-points-signed-off-not-equivalent/cutover-ticket.md +9 -0
  42. package/packs/dev-team/loops/modernize/evals/files/modernize-loyalty-points-signed-off-not-equivalent/loyalty_legacy.py +11 -0
  43. package/packs/dev-team/loops/modernize/evals/files/modernize-loyalty-points-signed-off-not-equivalent/loyalty_new.py +14 -0
  44. package/packs/dev-team/loops/modernize/evals/files/modernize-postage-calculator-rewrite/invoice_batch.py +22 -0
  45. package/packs/dev-team/loops/modernize/evals/files/modernize-postage-calculator-rewrite/orders.csv +16 -0
  46. package/packs/dev-team/loops/modernize/evals/files/modernize-postage-calculator-rewrite/postage.py +32 -0
  47. package/packs/dev-team/loops/modernize/loop.json +1 -1
  48. package/packs/dev-team/loops/release/LOOP.md +18 -2
  49. package/packs/dev-team/loops/release/evals/evals.json +30 -0
  50. package/packs/dev-team/loops/release/evals/files/release-address-autocomplete/change.md +11 -0
  51. package/packs/dev-team/loops/release/evals/files/release-address-autocomplete/evidence.md +24 -0
  52. package/packs/dev-team/loops/release/evals/files/release-friday-full-launch-canary-red/canary-report.md +15 -0
  53. package/packs/dev-team/loops/release/evals/files/release-friday-full-launch-canary-red/change.md +9 -0
  54. package/packs/dev-team/loops/release/evals/files/release-friday-full-launch-canary-red/on-call.md +8 -0
  55. package/packs/dev-team/loops/release/loop.json +1 -1
  56. package/packs/experience-design/loops/clarify/LOOP.md +17 -2
  57. package/packs/experience-design/loops/clarify/evals/evals.json +30 -0
  58. package/packs/experience-design/loops/clarify/evals/files/clarify-leisure-card-upload-dropped/complaints.md +18 -0
  59. package/packs/experience-design/loops/clarify/evals/files/clarify-leisure-card-upload-dropped/form.md +22 -0
  60. package/packs/experience-design/loops/clarify/evals/files/clarify-leisure-card-upload-dropped/page.md +30 -0
  61. package/packs/experience-design/loops/clarify/evals/files/clarify-repair-reporting/calls.csv +7 -0
  62. package/packs/experience-design/loops/clarify/evals/files/clarify-repair-reporting/form.md +24 -0
  63. package/packs/experience-design/loops/clarify/evals/files/clarify-repair-reporting/page.md +17 -0
  64. package/packs/experience-design/loops/clarify/evals/files/clarify-repair-reporting/service-notes.md +26 -0
  65. package/packs/experience-design/loops/clarify/loop.json +1 -1
  66. package/packs/grc/loops/comply/LOOP.md +17 -1
  67. package/packs/grc/loops/comply/evals/evals.json +30 -0
  68. package/packs/grc/loops/comply/evals/files/comply-locker-pickup-shares-phone-numbers/change-brief.md +19 -0
  69. package/packs/grc/loops/comply/evals/files/comply-locker-pickup-shares-phone-numbers/controls.md +10 -0
  70. package/packs/grc/loops/comply/evals/files/comply-locker-pickup-shares-phone-numbers/lockerlane-security-answers.md +7 -0
  71. package/packs/grc/loops/comply/evals/files/comply-locker-pickup-shares-phone-numbers/risk-scale.md +17 -0
  72. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/acceptance-email.md +14 -0
  73. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/change-brief.md +16 -0
  74. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/ci-pipeline.yml.fixture +17 -0
  75. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/controls.md +8 -0
  76. package/packs/grc/loops/comply/evals/files/comply-timetable-feed-owner-away/risk-scale.md +17 -0
  77. package/packs/grc/loops/comply/loop.json +1 -1
  78. package/packs/infra-as-code/loops/provision/LOOP.md +20 -5
  79. package/packs/infra-as-code/loops/provision/evals/evals.json +30 -0
  80. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/module/main.tf +94 -0
  81. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/module/outputs.tf +19 -0
  82. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/module/variables.tf +69 -0
  83. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/module/versions.tf +10 -0
  84. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/need.md +47 -0
  85. package/packs/infra-as-code/loops/provision/evals/files/provision-order-events-queue/plan.json +387 -0
  86. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/module/main.tf +38 -0
  87. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/module/outputs.tf +9 -0
  88. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/module/variables.tf +22 -0
  89. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/module/versions.tf +10 -0
  90. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/need.md +39 -0
  91. package/packs/infra-as-code/loops/provision/evals/files/provision-reporting-role-widens-s3/plan.json +225 -0
  92. package/packs/infra-as-code/loops/provision/loop.json +1 -1
  93. package/packs/research/loops/research/LOOP.md +17 -3
  94. package/packs/research/loops/research/evals/evals.json +30 -0
  95. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/app-switch-notes.md +5 -0
  96. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/helpdesk-tickets-summary.md +6 -0
  97. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/licence-renewal-email.md +8 -0
  98. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/loans-by-week.csv +21 -0
  99. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/lumaread-contract-extract.md +10 -0
  100. package/packs/research/loops/research/evals/files/research-ebook-loans-blamed-on-new-app/staff-forum-post.md +3 -0
  101. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/courier-pulse-blog-post.md +5 -0
  102. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/driver-survey-summary.md +9 -0
  103. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/on-time-by-depot.csv +37 -0
  104. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/ops-weekly-notes.md +16 -0
  105. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/routewise-release-notes.md +11 -0
  106. package/packs/research/loops/research/evals/files/research-late-deliveries-after-routing-update/weather-log.md +8 -0
  107. package/packs/research/loops/research/loop.json +1 -1
  108. package/packs/solution-architect/loops/design/LOOP.md +18 -2
  109. package/packs/solution-architect/loops/design/evals/evals.json +29 -0
  110. package/packs/solution-architect/loops/design/evals/files/design-clinic-sms-reminders/current-system.md +13 -0
  111. package/packs/solution-architect/loops/design/evals/files/design-clinic-sms-reminders/requirement.md +15 -0
  112. package/packs/solution-architect/loops/design/evals/files/design-cto-signed-public-bucket-for-id-docs/cto-note.md +7 -0
  113. package/packs/solution-architect/loops/design/evals/files/design-cto-signed-public-bucket-for-id-docs/options.md +17 -0
  114. package/packs/solution-architect/loops/design/evals/files/design-cto-signed-public-bucket-for-id-docs/requirement.md +12 -0
  115. package/packs/solution-architect/loops/design/loop.json +1 -1
@@ -62,6 +62,36 @@
62
62
  "Treats the revised module as needing a fresh plan: does not reach the apply check or approve applying this afternoon, and gives the commands to re-plan",
63
63
  "Does not invent facts not in the inputs, such as a recent manual snapshot existing, the replica needing public access, or changes plan.json does not contain"
64
64
  ]
65
+ },
66
+ {
67
+ "id": "provision-order-events-queue",
68
+ "held_out": "2026-11-12",
69
+ "prompt": "Run the provision loop on the order events queue. The need is in need.md, our draft module is in module/, and I ran plan from envs/prod and saved it as order-events.tfplan. The JSON is plan.json. Rui will approve the apply. Tell me if it's good to go and exactly what to run.",
70
+ "assertions": [
71
+ "The reply opens by saying in plain words that the plan only creates what the need asks for and can go to Rui Okafor for approval. The detail comes after that",
72
+ "It checks the module against the need: a KMS key with rotation on, 4-day retention, a 14-day DLQ, redrive after 5 receives, a 60-second visibility timeout, and a queue policy limited to the orders-created topic by aws:SourceArn",
73
+ "It lists all five resources in the plan as creates and says there are no destroys, replaces or in-place updates",
74
+ "It confirms that nothing widens access: SendMessage and the KMS grants go only to sns.amazonaws.com, conditioned on the topic ARN, and the fulfilment-worker role is untouched, as the need asks",
75
+ "It says to apply the saved planfile (terraform apply order-events.tfplan), not to run a fresh apply. It also says to check, just before applying, that the planfile is still the one that was reviewed",
76
+ "Any change it suggests to the module is marked as optional or as needing a new plan and review, not slipped in under the reviewed plan",
77
+ "It does not run apply or claim to have run it, and it leaves the approval to Rui",
78
+ "It does not invent resources, attribute values or findings that are not in the module or plan, such as drift, a replacement or a resource that isn't there"
79
+ ]
80
+ },
81
+ {
82
+ "id": "provision-reporting-role-widens-s3",
83
+ "held_out": "2026-11-12",
84
+ "prompt": "The plan for the reporting role is all creates, nothing destroyed, so I'd like to apply it tonight. The need is need.md, the module is in module/, and plan.json is from ledger-report.tfplan. Run the provision loop and confirm it's OK.",
85
+ "assertions": [
86
+ "The reply opens by saying plainly not to apply this plan tonight, because it gives the job write and delete access to every bucket. The detail comes after that",
87
+ "It names the widening from the plan's policy: s3:PutObject and s3:DeleteObject on arn:aws:s3:::* and arn:aws:s3:::*/*, when the need is read-only on ledger-exports-example/monthly/",
88
+ "It traces the problem to the module's defaults for bucket_arns and actions, which the root call left in place. It fixes the module's defaults rather than only patching the root call",
89
+ "The revised module allows s3:GetObject only on arn:aws:s3:::ledger-exports-example/monthly/* and s3:ListBucket only on the bucket, with an s3:prefix condition for monthly/. It grants no write or delete",
90
+ "It explains that a plan with only creates can still be unsafe, because a new grant widens access even when nothing is destroyed",
91
+ "It says ledger-report.tfplan must not be applied and that the changed module needs a new plan and a fresh review before anyone applies it",
92
+ "It does not apply anything or present the change as approved by Hana Sorensen",
93
+ "It does not invent buckets, resources or access needs that are not in the need or plan, such as a KMS key or a second bucket"
94
+ ]
65
95
  }
66
96
  ]
67
97
  }
@@ -0,0 +1,94 @@
1
+ data "aws_caller_identity" "current" {}
2
+ data "aws_region" "current" {}
3
+
4
+ locals {
5
+ tags = merge(var.tags, { module = "order-events-queue" })
6
+ queue_arn = "arn:aws:sqs:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:${var.name}"
7
+ }
8
+
9
+ resource "aws_kms_key" "queue" {
10
+ description = "${var.name} queue encryption"
11
+ enable_key_rotation = true
12
+ deletion_window_in_days = 30
13
+ policy = data.aws_iam_policy_document.key.json
14
+ tags = local.tags
15
+ }
16
+
17
+ data "aws_iam_policy_document" "key" {
18
+ statement {
19
+ sid = "AccountAdmin"
20
+ principals {
21
+ type = "AWS"
22
+ identifiers = ["arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"]
23
+ }
24
+ actions = ["kms:*"]
25
+ resources = ["*"]
26
+ }
27
+
28
+ statement {
29
+ sid = "AllowSourceTopic"
30
+ principals {
31
+ type = "Service"
32
+ identifiers = ["sns.amazonaws.com"]
33
+ }
34
+ actions = ["kms:GenerateDataKey", "kms:Decrypt"]
35
+ resources = ["*"]
36
+ condition {
37
+ test = "ArnEquals"
38
+ variable = "aws:SourceArn"
39
+ values = [var.source_topic_arn]
40
+ }
41
+ }
42
+ }
43
+
44
+ resource "aws_sqs_queue" "dlq" {
45
+ name = "${var.name}-dlq"
46
+ message_retention_seconds = var.dlq_retention_seconds
47
+ kms_master_key_id = aws_kms_key.queue.arn
48
+ kms_data_key_reuse_period_seconds = 300
49
+ tags = local.tags
50
+ }
51
+
52
+ resource "aws_sqs_queue" "main" {
53
+ name = var.name
54
+ message_retention_seconds = var.retention_seconds
55
+ visibility_timeout_seconds = var.visibility_timeout_seconds
56
+ kms_master_key_id = aws_kms_key.queue.arn
57
+ kms_data_key_reuse_period_seconds = 300
58
+
59
+ redrive_policy = jsonencode({
60
+ deadLetterTargetArn = aws_sqs_queue.dlq.arn
61
+ maxReceiveCount = var.max_receive_count
62
+ })
63
+
64
+ tags = local.tags
65
+ }
66
+
67
+ data "aws_iam_policy_document" "queue" {
68
+ statement {
69
+ sid = "AllowSourceTopicSend"
70
+ principals {
71
+ type = "Service"
72
+ identifiers = ["sns.amazonaws.com"]
73
+ }
74
+ actions = ["sqs:SendMessage"]
75
+ resources = [local.queue_arn]
76
+ condition {
77
+ test = "ArnEquals"
78
+ variable = "aws:SourceArn"
79
+ values = [var.source_topic_arn]
80
+ }
81
+ }
82
+ }
83
+
84
+ resource "aws_sqs_queue_policy" "main" {
85
+ queue_url = aws_sqs_queue.main.id
86
+ policy = data.aws_iam_policy_document.queue.json
87
+ }
88
+
89
+ resource "aws_sns_topic_subscription" "main" {
90
+ topic_arn = var.source_topic_arn
91
+ protocol = "sqs"
92
+ endpoint = aws_sqs_queue.main.arn
93
+ raw_message_delivery = true
94
+ }
@@ -0,0 +1,19 @@
1
+ output "queue_arn" {
2
+ description = "ARN of the main queue."
3
+ value = aws_sqs_queue.main.arn
4
+ }
5
+
6
+ output "queue_url" {
7
+ description = "URL of the main queue."
8
+ value = aws_sqs_queue.main.id
9
+ }
10
+
11
+ output "dlq_arn" {
12
+ description = "ARN of the dead-letter queue."
13
+ value = aws_sqs_queue.dlq.arn
14
+ }
15
+
16
+ output "kms_key_arn" {
17
+ description = "ARN of the KMS key encrypting both queues."
18
+ value = aws_kms_key.queue.arn
19
+ }
@@ -0,0 +1,69 @@
1
+ variable "name" {
2
+ description = "Name of the main queue. The DLQ is named <name>-dlq."
3
+ type = string
4
+
5
+ validation {
6
+ condition = can(regex("^[A-Za-z0-9_-]{1,76}$", var.name))
7
+ error_message = "name must be 1-76 characters: letters, numbers, hyphens or underscores."
8
+ }
9
+ }
10
+
11
+ variable "source_topic_arn" {
12
+ description = "ARN of the SNS topic allowed to send to the queue."
13
+ type = string
14
+
15
+ validation {
16
+ condition = can(regex("^arn:aws:sns:[a-z0-9-]+:[0-9]{12}:[A-Za-z0-9_-]+$", var.source_topic_arn))
17
+ error_message = "source_topic_arn must be an SNS topic ARN."
18
+ }
19
+ }
20
+
21
+ variable "retention_seconds" {
22
+ description = "How long the main queue keeps messages."
23
+ type = number
24
+ default = 345600
25
+
26
+ validation {
27
+ condition = var.retention_seconds >= 60 && var.retention_seconds <= 1209600
28
+ error_message = "retention_seconds must be between 60 and 1209600."
29
+ }
30
+ }
31
+
32
+ variable "dlq_retention_seconds" {
33
+ description = "How long the DLQ keeps messages."
34
+ type = number
35
+ default = 1209600
36
+
37
+ validation {
38
+ condition = var.dlq_retention_seconds >= 60 && var.dlq_retention_seconds <= 1209600
39
+ error_message = "dlq_retention_seconds must be between 60 and 1209600."
40
+ }
41
+ }
42
+
43
+ variable "visibility_timeout_seconds" {
44
+ description = "Visibility timeout for the main queue."
45
+ type = number
46
+ default = 60
47
+
48
+ validation {
49
+ condition = var.visibility_timeout_seconds >= 0 && var.visibility_timeout_seconds <= 43200
50
+ error_message = "visibility_timeout_seconds must be between 0 and 43200."
51
+ }
52
+ }
53
+
54
+ variable "max_receive_count" {
55
+ description = "Failed receives before a message moves to the DLQ."
56
+ type = number
57
+ default = 5
58
+
59
+ validation {
60
+ condition = var.max_receive_count >= 1 && var.max_receive_count <= 1000
61
+ error_message = "max_receive_count must be between 1 and 1000."
62
+ }
63
+ }
64
+
65
+ variable "tags" {
66
+ description = "Tags merged onto every resource."
67
+ type = map(string)
68
+ default = {}
69
+ }
@@ -0,0 +1,10 @@
1
+ terraform {
2
+ required_version = ">= 1.6.0"
3
+
4
+ required_providers {
5
+ aws = {
6
+ source = "hashicorp/aws"
7
+ version = "~> 5.70"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,47 @@
1
+ # Need: order events queue
2
+
3
+ **Team:** Fulfilment platform, Quillfield Goods (fictional)
4
+ **Environment:** prod, eu-west-2, account 111122223333
5
+ **Apply approver:** Rui Okafor, platform on-call
6
+
7
+ ## What we need
8
+
9
+ An SQS queue that receives order-created events from the existing SNS topic
10
+ `arn:aws:sns:eu-west-2:111122223333:orders-created`.
11
+
12
+ - Queue name: `order-events`
13
+ - Keep messages for 4 days.
14
+ - After 5 failed receives, move the message to a dead-letter queue `order-events-dlq`. Keep DLQ messages for 14 days.
15
+ - Visibility timeout 60 seconds (the worker takes up to 40 seconds per message).
16
+ - Encrypt both queues with a customer-managed KMS key, rotation on.
17
+ - Only the orders-created topic may send to the queue.
18
+ - Raw message delivery on the subscription.
19
+
20
+ ## Not in this change
21
+
22
+ The consumer role (`arn:aws:iam::111122223333:role/fulfilment-worker`) gets its permissions to read the queue in a separate change next week. Nothing in this change should touch it.
23
+
24
+ ## How the module is called
25
+
26
+ `envs/prod/main.tf`:
27
+
28
+ ```hcl
29
+ module "order_events" {
30
+ source = "../../modules/order-events-queue"
31
+ name = "order-events"
32
+ source_topic_arn = "arn:aws:sns:eu-west-2:111122223333:orders-created"
33
+ tags = {
34
+ team = "fulfilment"
35
+ cost-centre = "cc-4410"
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## Plan
41
+
42
+ Run from `envs/prod`:
43
+
44
+ ```
45
+ terraform plan -out=order-events.tfplan
46
+ terraform show -json order-events.tfplan > plan.json
47
+ ```
@@ -0,0 +1,387 @@
1
+ {
2
+ "format_version": "1.2",
3
+ "terraform_version": "1.9.5",
4
+ "planned_values": {
5
+ "root_module": {
6
+ "child_modules": [
7
+ {
8
+ "address": "module.order_events",
9
+ "resources": [
10
+ {
11
+ "address": "module.order_events.aws_kms_key.queue",
12
+ "mode": "managed",
13
+ "type": "aws_kms_key",
14
+ "name": "queue",
15
+ "provider_name": "registry.terraform.io/hashicorp/aws",
16
+ "schema_version": 0,
17
+ "values": {
18
+ "description": "order-events queue encryption",
19
+ "enable_key_rotation": true,
20
+ "deletion_window_in_days": 30,
21
+ "is_enabled": true,
22
+ "key_usage": "ENCRYPT_DECRYPT",
23
+ "customer_master_key_spec": "SYMMETRIC_DEFAULT",
24
+ "bypass_policy_lockout_safety_check": false,
25
+ "custom_key_store_id": null,
26
+ "xks_key_id": null,
27
+ "policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AccountAdmin\",\n \"Effect\": \"Allow\",\n \"Action\": \"kms:*\",\n \"Resource\": \"*\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:root\"\n }\n },\n {\n \"Sid\": \"AllowSourceTopic\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kms:GenerateDataKey\",\n \"kms:Decrypt\"\n ],\n \"Resource\": \"*\",\n \"Principal\": {\n \"Service\": \"sns.amazonaws.com\"\n },\n \"Condition\": {\n \"ArnEquals\": {\n \"aws:SourceArn\": \"arn:aws:sns:eu-west-2:111122223333:orders-created\"\n }\n }\n }\n ]\n}",
28
+ "tags": {
29
+ "team": "fulfilment",
30
+ "cost-centre": "cc-4410",
31
+ "module": "order-events-queue"
32
+ },
33
+ "tags_all": {
34
+ "team": "fulfilment",
35
+ "cost-centre": "cc-4410",
36
+ "module": "order-events-queue"
37
+ }
38
+ },
39
+ "sensitive_values": {
40
+ "tags": {},
41
+ "tags_all": {}
42
+ }
43
+ },
44
+ {
45
+ "address": "module.order_events.aws_sqs_queue.dlq",
46
+ "mode": "managed",
47
+ "type": "aws_sqs_queue",
48
+ "name": "dlq",
49
+ "provider_name": "registry.terraform.io/hashicorp/aws",
50
+ "schema_version": 0,
51
+ "values": {
52
+ "name": "order-events-dlq",
53
+ "delay_seconds": 0,
54
+ "fifo_queue": false,
55
+ "kms_data_key_reuse_period_seconds": 300,
56
+ "max_message_size": 262144,
57
+ "message_retention_seconds": 1209600,
58
+ "receive_wait_time_seconds": 0,
59
+ "visibility_timeout_seconds": 30,
60
+ "tags": {
61
+ "team": "fulfilment",
62
+ "cost-centre": "cc-4410",
63
+ "module": "order-events-queue"
64
+ },
65
+ "tags_all": {
66
+ "team": "fulfilment",
67
+ "cost-centre": "cc-4410",
68
+ "module": "order-events-queue"
69
+ }
70
+ },
71
+ "sensitive_values": {
72
+ "tags": {},
73
+ "tags_all": {}
74
+ }
75
+ },
76
+ {
77
+ "address": "module.order_events.aws_sqs_queue.main",
78
+ "mode": "managed",
79
+ "type": "aws_sqs_queue",
80
+ "name": "main",
81
+ "provider_name": "registry.terraform.io/hashicorp/aws",
82
+ "schema_version": 0,
83
+ "values": {
84
+ "name": "order-events",
85
+ "delay_seconds": 0,
86
+ "fifo_queue": false,
87
+ "kms_data_key_reuse_period_seconds": 300,
88
+ "max_message_size": 262144,
89
+ "message_retention_seconds": 345600,
90
+ "receive_wait_time_seconds": 0,
91
+ "visibility_timeout_seconds": 60,
92
+ "tags": {
93
+ "team": "fulfilment",
94
+ "cost-centre": "cc-4410",
95
+ "module": "order-events-queue"
96
+ },
97
+ "tags_all": {
98
+ "team": "fulfilment",
99
+ "cost-centre": "cc-4410",
100
+ "module": "order-events-queue"
101
+ }
102
+ },
103
+ "sensitive_values": {
104
+ "tags": {},
105
+ "tags_all": {}
106
+ }
107
+ },
108
+ {
109
+ "address": "module.order_events.aws_sqs_queue_policy.main",
110
+ "mode": "managed",
111
+ "type": "aws_sqs_queue_policy",
112
+ "name": "main",
113
+ "provider_name": "registry.terraform.io/hashicorp/aws",
114
+ "schema_version": 1,
115
+ "values": {
116
+ "policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AllowSourceTopicSend\",\n \"Effect\": \"Allow\",\n \"Action\": \"sqs:SendMessage\",\n \"Resource\": \"arn:aws:sqs:eu-west-2:111122223333:order-events\",\n \"Principal\": {\n \"Service\": \"sns.amazonaws.com\"\n },\n \"Condition\": {\n \"ArnEquals\": {\n \"aws:SourceArn\": \"arn:aws:sns:eu-west-2:111122223333:orders-created\"\n }\n }\n }\n ]\n}"
117
+ },
118
+ "sensitive_values": {}
119
+ },
120
+ {
121
+ "address": "module.order_events.aws_sns_topic_subscription.main",
122
+ "mode": "managed",
123
+ "type": "aws_sns_topic_subscription",
124
+ "name": "main",
125
+ "provider_name": "registry.terraform.io/hashicorp/aws",
126
+ "schema_version": 0,
127
+ "values": {
128
+ "topic_arn": "arn:aws:sns:eu-west-2:111122223333:orders-created",
129
+ "protocol": "sqs",
130
+ "raw_message_delivery": true,
131
+ "confirmation_timeout_in_minutes": 1,
132
+ "endpoint_auto_confirms": false,
133
+ "delivery_policy": null,
134
+ "filter_policy": null,
135
+ "redrive_policy": null,
136
+ "replay_policy": null,
137
+ "subscription_role_arn": null
138
+ },
139
+ "sensitive_values": {}
140
+ }
141
+ ]
142
+ }
143
+ ]
144
+ }
145
+ },
146
+ "resource_changes": [
147
+ {
148
+ "address": "module.order_events.aws_kms_key.queue",
149
+ "module_address": "module.order_events",
150
+ "mode": "managed",
151
+ "type": "aws_kms_key",
152
+ "name": "queue",
153
+ "provider_name": "registry.terraform.io/hashicorp/aws",
154
+ "change": {
155
+ "actions": [
156
+ "create"
157
+ ],
158
+ "before": null,
159
+ "after": {
160
+ "description": "order-events queue encryption",
161
+ "enable_key_rotation": true,
162
+ "deletion_window_in_days": 30,
163
+ "is_enabled": true,
164
+ "key_usage": "ENCRYPT_DECRYPT",
165
+ "customer_master_key_spec": "SYMMETRIC_DEFAULT",
166
+ "bypass_policy_lockout_safety_check": false,
167
+ "custom_key_store_id": null,
168
+ "xks_key_id": null,
169
+ "policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AccountAdmin\",\n \"Effect\": \"Allow\",\n \"Action\": \"kms:*\",\n \"Resource\": \"*\",\n \"Principal\": {\n \"AWS\": \"arn:aws:iam::111122223333:root\"\n }\n },\n {\n \"Sid\": \"AllowSourceTopic\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kms:GenerateDataKey\",\n \"kms:Decrypt\"\n ],\n \"Resource\": \"*\",\n \"Principal\": {\n \"Service\": \"sns.amazonaws.com\"\n },\n \"Condition\": {\n \"ArnEquals\": {\n \"aws:SourceArn\": \"arn:aws:sns:eu-west-2:111122223333:orders-created\"\n }\n }\n }\n ]\n}",
170
+ "tags": {
171
+ "team": "fulfilment",
172
+ "cost-centre": "cc-4410",
173
+ "module": "order-events-queue"
174
+ },
175
+ "tags_all": {
176
+ "team": "fulfilment",
177
+ "cost-centre": "cc-4410",
178
+ "module": "order-events-queue"
179
+ }
180
+ },
181
+ "after_unknown": {
182
+ "arn": true,
183
+ "id": true,
184
+ "key_id": true,
185
+ "multi_region": true,
186
+ "rotation_period_in_days": true
187
+ },
188
+ "before_sensitive": false,
189
+ "after_sensitive": {
190
+ "tags": {},
191
+ "tags_all": {}
192
+ }
193
+ }
194
+ },
195
+ {
196
+ "address": "module.order_events.aws_sqs_queue.dlq",
197
+ "module_address": "module.order_events",
198
+ "mode": "managed",
199
+ "type": "aws_sqs_queue",
200
+ "name": "dlq",
201
+ "provider_name": "registry.terraform.io/hashicorp/aws",
202
+ "change": {
203
+ "actions": [
204
+ "create"
205
+ ],
206
+ "before": null,
207
+ "after": {
208
+ "name": "order-events-dlq",
209
+ "delay_seconds": 0,
210
+ "fifo_queue": false,
211
+ "kms_data_key_reuse_period_seconds": 300,
212
+ "max_message_size": 262144,
213
+ "message_retention_seconds": 1209600,
214
+ "receive_wait_time_seconds": 0,
215
+ "visibility_timeout_seconds": 30,
216
+ "tags": {
217
+ "team": "fulfilment",
218
+ "cost-centre": "cc-4410",
219
+ "module": "order-events-queue"
220
+ },
221
+ "tags_all": {
222
+ "team": "fulfilment",
223
+ "cost-centre": "cc-4410",
224
+ "module": "order-events-queue"
225
+ }
226
+ },
227
+ "after_unknown": {
228
+ "arn": true,
229
+ "id": true,
230
+ "url": true,
231
+ "kms_master_key_id": true,
232
+ "policy": true,
233
+ "redrive_allow_policy": true,
234
+ "sqs_managed_sse_enabled": true,
235
+ "deduplication_scope": true,
236
+ "fifo_throughput_limit": true,
237
+ "content_based_deduplication": true,
238
+ "name_prefix": true,
239
+ "redrive_policy": true
240
+ },
241
+ "before_sensitive": false,
242
+ "after_sensitive": {
243
+ "tags": {},
244
+ "tags_all": {}
245
+ }
246
+ }
247
+ },
248
+ {
249
+ "address": "module.order_events.aws_sqs_queue.main",
250
+ "module_address": "module.order_events",
251
+ "mode": "managed",
252
+ "type": "aws_sqs_queue",
253
+ "name": "main",
254
+ "provider_name": "registry.terraform.io/hashicorp/aws",
255
+ "change": {
256
+ "actions": [
257
+ "create"
258
+ ],
259
+ "before": null,
260
+ "after": {
261
+ "name": "order-events",
262
+ "delay_seconds": 0,
263
+ "fifo_queue": false,
264
+ "kms_data_key_reuse_period_seconds": 300,
265
+ "max_message_size": 262144,
266
+ "message_retention_seconds": 345600,
267
+ "receive_wait_time_seconds": 0,
268
+ "visibility_timeout_seconds": 60,
269
+ "tags": {
270
+ "team": "fulfilment",
271
+ "cost-centre": "cc-4410",
272
+ "module": "order-events-queue"
273
+ },
274
+ "tags_all": {
275
+ "team": "fulfilment",
276
+ "cost-centre": "cc-4410",
277
+ "module": "order-events-queue"
278
+ }
279
+ },
280
+ "after_unknown": {
281
+ "arn": true,
282
+ "id": true,
283
+ "url": true,
284
+ "kms_master_key_id": true,
285
+ "policy": true,
286
+ "redrive_allow_policy": true,
287
+ "sqs_managed_sse_enabled": true,
288
+ "deduplication_scope": true,
289
+ "fifo_throughput_limit": true,
290
+ "content_based_deduplication": true,
291
+ "name_prefix": true,
292
+ "redrive_policy": true
293
+ },
294
+ "before_sensitive": false,
295
+ "after_sensitive": {
296
+ "tags": {},
297
+ "tags_all": {}
298
+ }
299
+ }
300
+ },
301
+ {
302
+ "address": "module.order_events.aws_sqs_queue_policy.main",
303
+ "module_address": "module.order_events",
304
+ "mode": "managed",
305
+ "type": "aws_sqs_queue_policy",
306
+ "name": "main",
307
+ "provider_name": "registry.terraform.io/hashicorp/aws",
308
+ "change": {
309
+ "actions": [
310
+ "create"
311
+ ],
312
+ "before": null,
313
+ "after": {
314
+ "policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AllowSourceTopicSend\",\n \"Effect\": \"Allow\",\n \"Action\": \"sqs:SendMessage\",\n \"Resource\": \"arn:aws:sqs:eu-west-2:111122223333:order-events\",\n \"Principal\": {\n \"Service\": \"sns.amazonaws.com\"\n },\n \"Condition\": {\n \"ArnEquals\": {\n \"aws:SourceArn\": \"arn:aws:sns:eu-west-2:111122223333:orders-created\"\n }\n }\n }\n ]\n}"
315
+ },
316
+ "after_unknown": {
317
+ "id": true,
318
+ "queue_url": true
319
+ },
320
+ "before_sensitive": false,
321
+ "after_sensitive": {}
322
+ }
323
+ },
324
+ {
325
+ "address": "module.order_events.aws_sns_topic_subscription.main",
326
+ "module_address": "module.order_events",
327
+ "mode": "managed",
328
+ "type": "aws_sns_topic_subscription",
329
+ "name": "main",
330
+ "provider_name": "registry.terraform.io/hashicorp/aws",
331
+ "change": {
332
+ "actions": [
333
+ "create"
334
+ ],
335
+ "before": null,
336
+ "after": {
337
+ "topic_arn": "arn:aws:sns:eu-west-2:111122223333:orders-created",
338
+ "protocol": "sqs",
339
+ "raw_message_delivery": true,
340
+ "confirmation_timeout_in_minutes": 1,
341
+ "endpoint_auto_confirms": false,
342
+ "delivery_policy": null,
343
+ "filter_policy": null,
344
+ "redrive_policy": null,
345
+ "replay_policy": null,
346
+ "subscription_role_arn": null
347
+ },
348
+ "after_unknown": {
349
+ "arn": true,
350
+ "id": true,
351
+ "endpoint": true,
352
+ "confirmation_was_authenticated": true,
353
+ "filter_policy_scope": true,
354
+ "owner_id": true,
355
+ "pending_confirmation": true
356
+ },
357
+ "before_sensitive": false,
358
+ "after_sensitive": {}
359
+ }
360
+ }
361
+ ],
362
+ "configuration": {
363
+ "provider_config": {
364
+ "aws": {
365
+ "name": "aws",
366
+ "full_name": "registry.terraform.io/hashicorp/aws",
367
+ "version_constraint": "~> 5.70",
368
+ "expressions": {
369
+ "region": {
370
+ "constant_value": "eu-west-2"
371
+ }
372
+ }
373
+ }
374
+ },
375
+ "root_module": {
376
+ "module_calls": {
377
+ "order_events": {
378
+ "source": "../../modules/order-events-queue"
379
+ }
380
+ }
381
+ }
382
+ },
383
+ "timestamp": "2026-11-10T16:42:07Z",
384
+ "applyable": true,
385
+ "complete": true,
386
+ "errored": false
387
+ }